2010-06-23 51 views
26

例如,这行失败:为什么我不能在Bash For-Loop中使用Unix Nohup?

$ nohup for i in mydir/*.fasta; do ./myscript.sh "$i"; done > output.txt& 
-bash: syntax error near unexpected token `do 

怎样做正确的方式?

+0

的“为什么”是的nohup执行它的参数用'execv()'和'execv()'需要它直接传递给内核的参数向量,不会通过任何外壳。因此,如果你想要一个shell,你需要告诉nohup自己执行一个。 – 2014-02-27 19:36:41

回答

60

因为'nohup'需要单字命令及其参数 - 而不是shell循环结构。你必须使用:

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

这会写在每个文件的output.txt上吗?如果有不重写的重要信息,我会使用'>>'而不是'>'。 – 2015-02-01 12:04:24

+0

如果我在'output.txt'中有重要的数据,即使在追加模式下,我也不会运行程序的输出。我会创建一个新文件,并且只有当我满意新数据是我想要的时候,才会将它附加到主文件中。 YMMV,当然。 – 2015-02-01 14:53:15

+0

@JonathanLeffler虽然没有回答这个问题。我相信这只会截断一次。 – 2017-09-05 16:26:24

8

你可以在一行上做,但你可能也想明天做。

$ 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 & 
+3

除非'loopy.sh'在路径中,否则您需要像'。/ loopy.sh'一样调用它,至少在这个Red Hat系统上我只是尝试过用。 – Tshepang 2013-04-29 14:51:50

-1

你也可以把它写成

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

不是真的。因为如果for循环接收到注销消息,它将被中断 – Jav 2015-06-26 08:23:18

+0

Jup。由于需要在nohup中使用命令,Nohup需要首先完成 – Kangarooo 2017-07-15 00:10:47

3

对于我来说,乔纳森的解决方案不正确地重定向到output.txt。这一个效果更好:

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

相关问题