bash -cを使ったコマンドとしての変数

bash -cを使ったコマンドとしての変数

誰かが作成した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/directorycd ""現在のディレクトリは変更されません)、印刷します/starting/directory

おすすめ記事