如何将这个bash函数翻译成fish shell?

4
function run () {
    nohup python $1 > nohup.out &
}

在命令行中,我将它称为“run scriptname.py”,然后bash执行以下命令:
python scriptname.py > nohup.out & 

你能帮我把这个翻译成鱼语吗?

到目前为止,我已经做了这个...

function run 
    bash -c "nohup python $1 > nohup.out &"
end

当我在~/.config/fish/config.fish上调用source时,这个存在只是简单地说。
Error when reading file: ~/.config/fish/config.fish 

没有提供任何有用的提示来说明错误是什么。

你是否想要将所有错误都保留地翻译出来? - Charles Duffy
...那么为什么要使用paste呢?在这里,它并没有给你带来任何有价值的东西。如果你想(很糟糕地)将标准输入转换为参数列表,$(cat)可以等效地完成。 - Charles Duffy
但是请再看一遍,非常糟糕。它无法处理引号,无法让您进行转义,也无法让您传递带有空格的参数...如果您描述了实际目标并询问完成它的最佳方法,而不是给我们一个有缺陷的代码进行翻译,那将会更好。 - Charles Duffy
@CharlesDuffy 你说得对,粘贴对于这个讨论来说是一个红鲱鱼。我已经将其删除了。我的目标是使用我的脚本名称在后台运行命令...所以在脚本名称前加上nohup并以&结尾,然后将脚本名称粘贴进去。感谢您的建议。 - jason
2个回答

5

这里其实没有必要执行bash,fish也可以执行nohup,重定向同样有效等。

不过有一个小区别,与$1、$2等不同的是,fish函数的参数存储在$argv数组中。

function run
     nohup python $argv > nohup.out &
end

这将把$argv扩展为所有元素,并将每个元素作为一个元素,因此run script.py banana将运行nohup python script.py banana > nohup.out &。如果您真的只想传递一个参数,您需要$argv[1]
实际上,我不知道为什么在sourcing config.fish时,您的定义会导致错误 - 您正在使用哪个fish版本?

请注意,在我的系统上,nohup 会在 stderr 上打印有关 stderr 被重定向到 stdout 的烦人消息,但在 bash 下执行相同操作时也应该发生这种情况。 - faho

3

这是一个完全有效(也更正确)的fish函数替代方案:

function run
    bash -c 'nohup python "$@" > nohup.out &' _ $argv
end

这相当于本地bash函数:
run() {
  nohup python "$@" </dev/null >nohup.out 2>&1 &
}

个人建议将其改写为使用disown而不是nohup


关于从fish看到的错误,我建议注意任何其他(非语法相关)可能影响您的文件是否可以被读取的因素--权限等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接