`exec command [arguments]`の `command [arguments]`が実行される実行環境は何ですか?

`exec command [arguments]`の `command [arguments]`が実行される実行環境は何ですか?

バッシュマニュアルから

実装する

exec [-cl] [-a name] [command [arguments]]

コマンドが提供されたら、新しいプロセスを作成せずにシェルを交換します。 -lオプションが指定されると、シェルはコマンドに渡された0番目の引数の先頭にダッシュを配置します。これがログインプログラムが行うことです。-c オプションを使用すると、コマンドは空の環境で実行されます。

オプションがない場合、-c実行の実行環境は何ですかcommand [arguments]

  • 実行前の元のシェルプロセスと同じ実行環境ですかexec command [arguments]

  • 元のシェルプロセスの実行環境には、環境変数だけでなく、非環境変数を含むすべてのシェル変数も含まれます。commandで実行されている実行環境には、exec command元のシェルプロセスの非環境変数も含まれていますか?

これを証明できるいくつかの例を挙げることができますか?

答え1

2つの異なることを混同しています。実行環境そして環境変数

name=value環境変数は、コマンドとプロセスの設定フォームとして使用される形式の文字列です。たとえば、PATHコマンドのファイル名のみが指定されている場合は、実行可能なコマンドを見つけることができるコロンで区切られたディレクトリのリストです。ロケール制御LANGLC_始まるさまざまな変数などです。

実行環境には、コマンドの実行方法に影響を与えるすべてのシェル機能が含まれます。もちろん、環境変数だけでなく、作業ディレクトリ、ファイル生成マスク(umask)、シェル関数、定義されたエイリアスなども含まれます。

実行時点(つまり、シェルがコマンドの実行を開始した瞬間)で、実行環境はexec。他のプロセス)。使用すると、環境変数が消去されます。 execEXITexec -c

-cBashのフラグはexec環境変数のみを消去します。走れば

bash -c `exec env`

新しいBashシェルを起動し、それをコマンドに置き換えますenv。他の引数を指定しないと、すべての環境変数が単に出力されます。ただし、-cフラグがexec次に追加された場合

bash -c `exec -c env`

何も印刷しません。envこれは、環境変数(つまり空の環境)なしで実行されるためです。

(単にexec envターミナルで実行すると、ターミナルで実行されているシェルがコマンドに置き換えられ、終了するとターミナルがenv閉じます。早すぎるため、見えない可能性があるため、Bashで明示的に実行します。ターミナルが使用するシェル以外の子Bashが交換されます。

私はこれが一般的に使用されている-cので、実際のスクリプトで使用されているオプションを見たことがありません。env -iたとえば、

bash -c `exec env -i PATH=$PATH env`

パラメーターを使用すると、このenvコマンドは環境変数を変更するコマンドを実行するために使用されます。この-iオプションは、最初から開始するために使用されます。つまり、既存の環境変数をすべて消去します。シェルは実行前にコマンド全体(ライン)を解析するため、シェルがコマンドラインを解析している間env -i VAR=$VAR OTHER=$OTHERは、特定の環境変数を既存の値として定義して保存できます。env上記では、finalはenv結果の環境変数を印刷しますが、他のコマンドでもかまいません。

関連情報