【问题标题】:Why can't I use Unix Nohup with Bash For-loop?为什么我不能将 Unix Nohup 与 Bash For 循环一起使用?
【发布时间】:2010-06-23 05:21:33
【问题描述】:

例如这行失败:

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

正确的做法是什么?

【问题讨论】:

  • “为什么”是 nohup 使用execv() 执行它的参数,而execv() 接受一个直接传递给内核的参数向量,而不是通过任何外壳。因此,如果你想要一个 shell,你需要告诉 nohup 自己执行一个。

标签: linux bash unix nohup


【解决方案1】:

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

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

【讨论】:

  • 这会覆盖每个文件的 output.txt 吗?如果其中有您不想覆盖的重要信息,我会使用>> 而不是>
  • 如果我在output.txt 中有重要数据,即使在附加模式下我也不会将程序的输出运行到其中。我会创建一个新文件,只有当我对新数据是我想要的感到满​​意时,我才会将它附加到主文件中。当然是 YMMV。
  • @JonathanLeffler 没有回答这个问题。我相信这只会截断一次。
【解决方案2】:

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

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

【讨论】:

  • 除非loopy.sh 在路径中,否则您需要像./loopy.sh 一样调用它,至少在我刚刚尝试过的这个Red Hat 系统上是这样。
【解决方案3】:

对我来说,Jonathan 的解决方案没有正确重定向到 output.txt。这个效果更好:

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

【讨论】:

    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多