誰かが作成したbashスクリプトを読んでい
ました。
bash -c "$1"
変える
eval "$1"
私はevalを使用することが好ましい方法だと思い、とにかくより速くなります。本当に?
2つの間に実質的な違いはありますか? 2つの重要な違いは何ですか?
ベストアンサー1
eval "$1"
現在のスクリプトでコマンドを実行します。現在のスクリプトでシェル変数の設定と使用、現在のスクリプトの環境変数の設定、現在のスクリプトで機能の設定と使用、および現在のスクリプトの現在のディレクトリ、umask、制限、およびその他のプロパティを設定できます。bash -c "$1"
環境変数、ファイル記述子、およびその他のプロセス環境を継承しますが(変更を再度渡しません)、まったく別のスクリプトでコマンドを実行しますが、内部シェル設定(シェル変数、関数、オプション、トラップなど)は継承しません。 。
サブシェルでコマンドを実行する別の方法があります(eval "$1")
。呼び出しスクリプトからすべてを継承しますが、変更を再度渡しません。
たとえば、変数がdir
エクスポートされず、次のようになり$1
ますcd "$foo"; ls
。
cd /starting/directory; foo=/somewhere/else; eval "$1"; pwd
内容を一覧表示し/somewhere/else
て印刷します/somewhere/else
。cd /starting/directory; foo=/somewhere/else; (eval "$1"); pwd
内容を一覧表示し/somewhere/else
て印刷します/starting/directory
。cd /starting/directory; foo=/somewhere/else; bash -c "$1"; pwd
内容を一覧表示し/starting/directory
(cd ""
現在のディレクトリは変更されません)、印刷します/starting/directory
。