回答:
eval $(cat ...)
すべてのケースで機能するわけではありません。たとえば$(cat ...)
、コンテンツがによって処理される前に、改行は単一のスペースに変換されeval
ます。これは、ループやヒアドキュメントのような複数行のステートメントをしばしば壊します。
たとえば、両方の方法で次のファイルを試してください。
for i in 1 2 3; do
echo $i
done
cat<<EOF
a
b
c
EOF
source
、それは特にこれのために作成されたコマンドであるため、私は好みます。
@glennjackmanですでに述べたように、コマンド置換を引用する必要があります。そうしないと、単語分割とパス名の展開により、評価される前にコンテンツが変更されます。そして、どちらもファイルからコマンドを実行しますが、違いがあります。
スクリプトをソースにすると、さまざまな特別なシェル変数、主にBASH_SOURCE
、BASH_LINENO
およびFUNCNAME
配列が変更されます。これらは、エラーメッセージの出力とデバッグに役立ちます。
return
コマンド(help return
)を使用して、ソーススクリプトから戻ることができます。評価では、その効果は得られません。そして同様に、RETURNトラップはevalに対してトリガーされません。
スクリプトを取得するときは、引数をスクリプトに渡すことができます。その評価ではそれを行うことはできません。
evalを使用すると、コマンド置換により、ファイルの内容全体がメモリに読み込まれてから、evalに渡されます。ソーシングすると、bashはファイルから読み込みます。
source、eval、およびexecが実行する内容の良い要約がここにあります:http : //www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html
私はあなたがevalを使ってファイルをソースすることは同じことをすると思います。ただし、下付き文字内の変数がどのような場合でも同じように動作するかどうかは完全にはわかりません。ソースを使用することをお勧めします。ソースを使用する方が簡単で、コードが読みやすくなるからです。
$(cat file)
->$(< file)
eval "$(cat file)"