コマンド用の Bash 拡張である ${@}

コマンド用の Bash 拡張である ${@}

親スクリプトがあります

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なぜ動作するのか理解できず、単にコマンドで実行しても${@}機能しません。${@}拡張できない原因は何ですか~

${@}ノードを使用するときにコマンドにディレクトリ名を追加するのはなぜですか?

ベストアンサー1

これはチルダ拡張によるものです。 eval はチルダを拡張し、ホームディレクトリのフルパスに置き換えます。これがない場合、コマンドは渡されたリテラルチルダを使用し、存在しない相対パスを使用しようとします。

$ echo ~
/home/chris
$ echo "~" 
~
$ eval 'echo ~' 
/home/chris 

おすすめ記事