子脚本eval和$ {@}差异

时间:2013-07-09 01:29:53

标签: bash shell expansion

我有一个父脚本

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工作,只是使用$ {@}运行命令不行。是什么导致$ {@}不扩展〜?
为什么节点在使用$ {@}时将目录名称附加到命令?

1 个答案:

答案 0 :(得分:2)

因为bash首先扩展波形符然后扩展变量。 node不是扩展变量的人。您应该坚持使用eval或在命令中使用${HOME}

The expansion order is like this:大括号扩展,波浪扩展,参数,变量,算术扩展和命令替换(以从左到右的方式完成),分词和文件名扩展