eval $(cat filename)はソースファイル名と同じですか?


9

いくつかのbash関数を扱っていて、source ...コマンドがわからなかったのでeval $(cat ...)代わりに使用しました。今、私はそれを使用するたびに変更する必要がありますか、それともまったく同じ機能ですか?

現在は同じように機能しているようですが、後で誤解を招く可能性のある違いがあるかもしれません。知りたいだけです。

回答:


6

eval $(cat ...)すべてのケースで機能するわけではありません。たとえば$(cat ...)、コンテンツがによって処理される前に、改行は単一のスペースに変換されevalます。これは、ループやヒアドキュメントのような複数行のステートメントをしばしば壊します。

たとえば、両方の方法で次のファイルを試してください。

for i in 1 2 3; do
 echo $i
done

cat<<EOF
a
b
c
EOF

4
あなたが引用符を使用する場合は、空白はそのまま滞在する:eval "$(cat file)"
グレン・ジャックマン

1
はい、それもうまくいくはずです。しかし、とにかくコードを変更する必要がある場合source、それは特にこれのために作成されたコマンドであるため、私は好みます。
Florian Diesch

9

@glennjackmanですでに述べたように、コマンド置換を引用する必要があります。そうしないと、単語分割とパス名の展開により、評価される前にコンテンツが変更されます。そして、どちらもファイルからコマンドを実行しますが、違いがあります。

  • スクリプトをソースにすると、さまざまな特別なシェル変数、主にBASH_SOURCEBASH_LINENOおよびFUNCNAME配列が変更されます。これらは、エラーメッセージの出力とデバッグに役立ちます。

  • returnコマンド(help return)を使用して、ソーススクリプトから戻ることができます。評価では、その効果は得られません。そして同様に、RETURNトラップはevalに対してトリガーされません。

  • スクリプトを取得するときは、引数をスクリプトに渡すことができます。その評価ではそれを行うことはできません。

  • evalを使用すると、コマンド置換により、ファイルの内容全体がメモリに読み込まれてから、evalに渡されます。ソーシングすると、bashはファイルから読み込みます。


1

source、eval、およびexecが実行する内容の良い要約がここにあります:http : //www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html

私はあなたがevalを使ってファイルをソースすることは同じことをすると思います。ただし、下付き文字内の変数がどのような場合でも同じように動作するかどうかは完全にはわかりません。ソースを使用することをお勧めします。ソースを使用する方が簡単で、コードが読みやすくなるからです。


3
完全に接線:bashの省略形は$(cat file)->$(< file)
glenn jackman '11 / 08/21
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.