Bashのマニュアルは次のように言います(manページ、ハイライト):
Bashが外部コマンドを呼び出すと、この変数は
$_
コマンドのフルパス名に設定されます。その環境のコマンドに渡されます。
そして(特殊パラメータ):
_
(
$_
、下線。)シェルが起動したら、環境または引数リストに渡されたシェルを呼び出すために使用される絶対パス名または実行中のシェルスクリプトに設定します。その後、拡張後、前のコマンドの最後の引数に展開されます。また、実行された各コマンドを呼び出し、そのコマンドにエクスポートされた環境にデプロイするために使用されるフルパス名に設定されます。メールを確認すると、このパラメーターにはメールファイルの名前が保持されます。
Bash シェルで次を実行します。
$ bash $ export | grep '_='
マニュアルによると、
_
新しいbashシェルの環境変数でなければなりません。export
新しいbashシェルのすべての環境変数を出力する必要がありますが、そうではありません。それでは、それが新しいbashシェルの環境変数であることを_
知りたいのです。_
実際、どんなbashシェルでも同じことが起こります
$ export | grep '_='
何も出力しません。
_
bashシェルに環境変数があるかどうか疑問に思います。比較しよう:
$ dash $ export | grep '_=' export _='/bin/dash'
ベストアンサー1
はい、_
新しいBashシェルの環境変数です。以下を実行すると表示されます。
tr '\0' '\n' < /proc/$$/environ | grep _=
inside the shell: シェルの初期環境内容を表示します。始める前に設定する古いシェルがないため、最初のシェルには表示されません。
Bash内の拡張は、前のコマンドの最後の引数に拡張される特殊引数を$_
表します。 (Bashはコマンドが解析されるたびに更新されるシェル変数を_
使用して_
内部的に処理しますが、これは実際には実装の詳細です。コマンドが解析されるたびに、「エクスポートできません」が表示されます。)はエクスポート用にマークされた変数ではないため、export
表示されません_
。ただし、の出力では見ることができますset
。
最初の例では、新しいBashシェルは起動ファイルのコマンドを解析して実行するため、runを実行するとそのコマンドが上書きされ、エクスポートされていないとマークされexport | grep '_='
ます_
。
この例ではdash
起動ファイルを実行しないようですが、変数はBashが実行する前に設定する環境変数として扱われていますdash
。