2010-06-23 55 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 &

相關問題