我有一个父脚本
while read cmd
do
nohup ./script ${cmd[@]} &>> log &
done < ~/list
执行此子脚本
while true
do
eval "${CMD[@]}"
#${CMD[@]}
#./panic
done
使用此命令列表
node ~/www/splash/app.js
node ~/www/splash-two/app.js
当子脚本调用时
eval ${CMD[@]}
它执行我期望运行该命令的方式,没有任何投诉,但当我尝试删除eval并运行命令时
${CMD[@]}
它抛出错误
Error: Cannot find module '/home/rumplefraggle/SYS/RABBOT/~/www/splash/app.js'
现在我想可能这与node命令有关,所以我试着执行
ls ~
作为命令,它抛出了〜无法找到的错误。
回应$ {@}并且不运行它会像我期望的那样扩展。
手动将命令插入子脚本也可以按预期工作
我不明白为什么eval工作,只是使用$ {@}运行命令不行。是什么导致$ {@}不扩展〜?
为什么节点在使用$ {@}时将目录名称附加到命令?
答案 0 :(得分:2)
因为bash首先扩展波形符然后扩展变量。 node
不是扩展变量的人。您应该坚持使用eval
或在命令中使用${HOME}
。
The expansion order is like this:大括号扩展,波浪扩展,参数,变量,算术扩展和命令替换(以从左到右的方式完成),分词和文件名扩展