2

我有一个父脚本

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'

现在我想这可能与节点命令有关,所以我尝试
ls ~
作为命令执行,它抛出了 ~ 找不到的错误。

回应 ${@} 而不运行它会像我期望的那样扩展。
此外,手动将命令插入子脚本也可以按预期工作

我不明白为什么 eval 有效,而简单地使用 ${@} 运行命令则无效。是什么导致 ${@} 不扩展 ~ ?
为什么使用 ${@} 时节点会将目录名称附加到命令中?

4

1 回答 1

2

因为 bash 首先扩展波浪号,然后扩展变量。node不是扩展变量的那个。你应该坚持eval或使用${HOME}你的命令。

扩展顺序是这样的:大括号扩展、波浪号扩展、参数、变量、算术扩展和命令替换(以从左到右的方式完成)、分词和文件名扩展

于 2013-07-09T01:59:57.953 回答