bashシェルでは、 `_`はいつ環境変数ですか?

bashシェルでは、 `_`はいつ環境変数ですか?

Bashのマニュアルは次のように言います(manページ、ハイライト):

Bashが外部コマンドを呼び出すと、この変数は$_コマンドのフルパス名に設定されます。その環境のコマンドに渡されます。

そして(特殊パラメータ):

_

$_、下線。)シェルが起動したら、環境または引数リストに渡されたシェルを呼び出すために使用される絶対パス名または実行中のシェルスクリプトに設定します。その後、拡張後、前のコマンドの最後の引数に展開されます。また、実行された各コマンドを呼び出し、そのコマンドにエクスポートされた環境にデプロイするために使用されるフルパス名に設定されます。メールを確認すると、このパラメーターにはメールファイルの名前が保持されます。

  1. Bash シェルで次を実行します。

    $ bash
    $ export | grep '_=' 
    

    マニュアルによると、_新しいbashシェルの環境変数でなければなりません。export新しいbashシェルのすべての環境変数を出力する必要がありますが、そうではありません。それでは、それが新しいbashシェルの環境変数であることを_知りたいのです。_

  2. 実際、どんなbashシェルでも同じことが起こります

    $ export | grep '_='
    

    何も出力しません。_bashシェルに環境変数があるかどうか疑問に思います。

  3. 比較しよう:

    $ 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

答え2

export引数なしですべてのエクスポートを一覧表示変わりやすい_変数ではありませんが、次のようにリストされます。特殊パラメータ

少し混乱する_可能性があります。有効な変数名、これは他の特殊パラメータの名前とは異なります。少なくともBash 4.4では、不満なしに割り当てることができます。特殊効果が値をすぐに上書きするため、機能しません。

答え3

の出力からわかるように、すべてのシェル変数がエクスポート用に表示されるわけではありませんdeclare -p

bash$_エクスポートとしてマークすることは、この変数を子プロセスの環境に自動的に追加するため、意味がありません。しかし、その値は(当時)シェルの値とは異なります。

これをエクスポートとしてマークすると、外部コマンド環境で何が起こるのかをユーザーに混乱させるだけです。

すべての「ランタイム変数」はBASH*エクスポートされません。

関連情報