我有一个bash脚本,其中包含一个子目录列表的循环。在循环内{I} 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
也位于脚本的顶部,但这也无济于事。 请帮忙!
编辑:正如@anubhava正确地指出我的循环包含一个错误导致脚本只使用数组中的第一个条目。这是更正后的版本。#!/bin/bash
dList=("dname1" "dname2" "dname3")
for d in ${dList[@]}; do
cd $d
nohup echo $d &
cd ..
done
所以现在脚本实现了我想要的。但是,我们仍然从nohup那里得到令人讨厌的输出,这是我原来问题的一部分。
答案 0 :(得分:6)
问题出在这里:
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