【问题标题】:Using nohup within a loop of a bash script在 bash 脚本的循环中使用 nohup
【发布时间】:2015-04-30 01:23:54
【问题描述】:

我有一个 bash 脚本,其中包含子目录列表的循环。在循环中我 cd 进入每个子目录,使用 nohup 运行命令,然后 cd 退出。在以下示例中,为简单起见,我将可执行文件替换为 echo 命令。

#!/bin/bash
dList=("dname1" "dname2" "dname3")
for d in $dList; do
    cd $d
    nohup echo $d &
    cd ..
done

以上导致 nohup 在第一个循环期间挂起,输出如下:

$ ./script.sh
./dname1 
$ nohup: appending output to `nohup.out'

脚本不会继续循环,为了在命令行上再次输入,必须按回车键。 好的,这是在 shell 上使用 nohup 时的正常行为,但显然它不适用于我的脚本。我怎样才能让nohup 简单地运行,然后优雅地允许脚本继续?

我已经(未成功)尝试过 nohup 命令的变体,包括

nohup echo $d < /dev/null & 

但这并没有帮助。 此外,我尝试包括

trap "" HUP

也在脚本的顶部,但这也无济于事。 请帮忙!

编辑:正如@a​​nubhava 正确指出的那样,我的循环包含一个错误,导致脚本仅使用数组中的第一个条目。这是更正的版本。

#!/bin/bash
dList=("dname1" "dname2" "dname3")
for d in ${dList[@]}; do
    cd $d
    nohup echo $d &
    cd ..
done

所以现在脚本实现了我想要的。然而,我们仍然从 nohup 得到恼人的输出,这是我最初问题的一部分。

【问题讨论】:

    标签: bash shell loops unix nohup


    【解决方案1】:

    问题来了:

    for d in $dList; do
    

    这只会为数组的第一个元素运行一次for 循环。

    要遍历数组,请使用:

    for d in ${dList[@]}; do
    

    完整的工作脚本:

    dList=("dname1" "dname2" "dname3")
    for d in "${dList[@]}"; do
       cd "$d"
      { nohup echo "$d" & cd -; } 2>/dev/null
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多