为什么我不能在Bash For循环中使用Unix Nohup?

42
例如,这一行会失败:
$ nohup for i in mydir/*.fasta; do ./myscript.sh "$i"; done > output.txt&
-bash: syntax error near unexpected token `do

如何正确地做到这一点?


1
“为什么”是因为nohup使用execv()执行其参数,而execv()需要一个参数向量,该向量直接传递给内核,不经过任何shell。因此,如果您想要一个shell,您需要告诉nohup自己执行一个。 - Charles Duffy
3个回答

100

'nohup'期望的是一个单词的命令和它的参数,而不是一个shell循环结构。你需要使用:

nohup sh -c 'for i in mydir/*.fasta; do ./myscript.sh "$i"; done >output.txt' &

4
对于每个文件,这会覆盖输出文件output.txt中的内容吗?如果那里有重要信息不想被覆盖,建议使用>>代替> - Climbs_lika_Spyder
如果我在 output.txt 中有重要数据,即使在追加模式下运行程序的输出,我也不会将其输出到该文件中。我会创建一个新文件,只有在确信新数据是我想要的时候,才会将其附加到主文件。当然,您的情况可能会有所不同。 - Jonathan Leffler
@JonathanLeffler,这并没有回答问题。我认为这只会截断一次。 - Brian Hannay

11

对于我来说,Jonathan的解决方案不能正确地重定向到output.txt。以下这个方案效果更好:

nohup bash -c 'for i in mydir/*.fasta; do ./myscript.sh "$i"; done' > output.txt &


10

你可以在一行内完成它,但也许明天你还想再做一次。

$ cat loopy.sh 
#!/bin/sh
# a line of text describing what this task does
for i in mydir/*.fast ; do
    ./myscript.sh "$i"
done > output.txt
$ chmod +x loopy.sh
$ nohup loopy.sh &

4
除非 loopy.sh 已经在路径中,否则你需要像这样调用它:./loopy.sh。至少在我刚尝试的这个 Red Hat 系统上是这样。 - tshepang

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