我编写了一个脚本After.sh
来推迟在另一个正在运行的作业完成后启动的一个作业:
echo "Waiting job $1 to be finished..."
while ps -p $1 >/dev/null; do sleep 1; done ;
echo "Job $1 finished."
echo "Now running job ${*:2}..."
${*:2}
echo "Job ${*:2} finished."
我在{= 1}}之后运行它以在PID = 5327的作业完成后关闭PC。即使我可以像After.sh 5327 shutdown 0
一样运行它,这样它会等到所有作业5327 5778和5935首先完成。
我的问题是当我想要将更复杂的作业作为参数提供给脚本时,例如:
After.sh "5327 5778 5935" shutdown 0
现在它运行时出现错误:After.sh 5327 for f in *; do echo $f; done
。我尝试将脚本中的命令for: command not found
替换为${*:2}
或sh ${*:2}
,但是它们失败了(eval ${*:2}
再次失败,找不到sh
命令,{{1保留整个循环的for
的第一个值,因此每次都打印第一个文件的名称。)
你知道如何解决它吗?
答案 0 :(得分:2)
问题是,你for f in *; do echo $f; done
不是命令,而是 bash -code,需要一个bash-interpreter来执行。
您可以使用eval
:
#!/bin/sh
PID="$1"
shift
JOB="$@"
echo "Waiting job ${PID} to be finished..."
while ps -p ${PID} >/dev/null; do sleep 1; done ;
echo "Job ${PID} finished."
echo "Now running job '${JOB}'"
eval ${JOB}
echo "Job '${JOB}' finished."
然后对命令使用单引号,包括应由After
评估的变量:
./After.sh 123 'for f in *; do echo $f; done'