バッシュマニュアルから
実装する
exec [-cl] [-a name] [command [arguments]]
コマンドが提供されたら、新しいプロセスを作成せずにシェルを交換します。 -lオプションが指定されると、シェルはコマンドに渡された0番目の引数の先頭にダッシュを配置します。これがログインプログラムが行うことです。-c オプションを使用すると、コマンドは空の環境で実行されます。。
オプションがない場合、-c
実行の実行環境は何ですかcommand [arguments]
?
実行前の元のシェルプロセスと同じ実行環境ですか
exec command [arguments]
?元のシェルプロセスの実行環境には、環境変数だけでなく、非環境変数を含むすべてのシェル変数も含まれます。
command
で実行されている実行環境には、exec command
元のシェルプロセスの非環境変数も含まれていますか?
これを証明できるいくつかの例を挙げることができますか?
答え1
name=value
環境変数は、コマンドとプロセスの設定フォームとして使用される形式の文字列です。たとえば、PATH
コマンドのファイル名のみが指定されている場合は、実行可能なコマンドを見つけることができるコロンで区切られたディレクトリのリストです。ロケール制御LANG
でLC_
始まるさまざまな変数などです。
実行環境には、コマンドの実行方法に影響を与えるすべてのシェル機能が含まれます。もちろん、環境変数だけでなく、作業ディレクトリ、ファイル生成マスク(umask
)、シェル関数、定義されたエイリアスなども含まれます。
実行時点(つまり、シェルがコマンドの実行を開始した瞬間)で、実行環境はexec
。他のプロセス)。使用すると、環境変数が消去されます。 exec
EXIT
exec -c
-c
Bashのフラグは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
結果の環境変数を印刷しますが、他のコマンドでもかまいません。