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


10

Bashマニュアルでは次のように述べています(manpage、私の強調):

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

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

_

$_、アンダースコア。)シェルの起動時に、実行中のシェルまたはシェルスクリプトを呼び出すために使用される絶対パス名を、環境または引数リストで渡されたとおりに設定します。その後、展開後に、前のコマンドの最後の引数に展開します。また、そのコマンドにエクスポートされた環境で実行および配置された各コマンドを呼び出すために使用される絶対パス名に設定します。メールをチェックするとき、このパラメーターはメールファイルの名前を保持します。

  1. bashシェルでは、次のコマンドを実行します。

    $ bash
    $ export | grep '_=' 
    

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

  2. 実際にはどのbashシェルでも同じことが起こります

    $ export | grep '_='

    何も出力しません。では_、bashシェルの環境変数はあるのでしょうか。

  3. 比較のために:

    $ dash
    $ export  | grep '_='        
    export _='/bin/dash'
    

私の投稿は、マイクのコメントステファンの返信に触発されまし


1
これはシェル変数であり、コマンドの環境に渡されます。必ずしもシェルの環境にエクスポートされるわけではありません。 exportは組み込みですが、を使用するとprintenv _/usr/bin/printenvこのシステムでの呼び出し方法が表示されます。
Toby Speight 2018

bash -c export | grep _=(Bashから)は、親で設定されていなくても、親シェルがコマンドを呼び出した方法示すことに注意してください。bash$_
Toby Speight 2018

unix.stackexchange.com/questions/293302も参照してください。
JdeBP 2018

回答:


13

はい、_新しいBashシェルの環境変数です。あなたは実行することでそれを見ることができます

tr '\0' '\n' < /proc/$$/environ | grep _=

シェルの内部:シェルの初期環境の内容を示します。開始する前に設定する前のシェルがなかったため、最初のシェルには表示されません。

$_Bash内で展開すると、_特別なパラメーターが参照され、前のコマンドの最後の引数に展開されます。(内部的にはbashは使用してこれを処理する_コマンドが解析されるたびに更新されたシェル変数を、それは本当に実装の詳細です。これは、コマンドが解析されるたびに「アンエクスポート」である。export表示されません。_そうではないので、エクスポート済みとしてマークされている変数。ただし、の出力で確認できますset

最初の例では、新しいBashシェルが起動ファイル内のコマンドを解析して実行するため、を実行するとexplore | grep '-='_既に上書きされ、エクスポートされていないものとしてマークされています。

このdash例では、起動ファイルを実行していないように見えるため、実行前にBashによって設定された環境変数として変数が表示されていdashます。


ありがとう。新しいbashシェルでは、export | grep '_='何も出力されないのはなぜですか?元のbashシェルで、tr '\0' '\n' < /proc/$$/environ | grep _=何も出力されないのはなぜですか?
Tim、


9

export引数なしでは、エクスポートされたすべての変数がリストされます_は変数ではありませんが、特別なパラメーターとしてリストされています

やや混乱しますが、他の特別なパラメータの名前とは異なり、変数の有効な名前に_なります。少なくともBash 4.4は、文句なしでそれに割り当てることができます。特殊効果がすぐに値を上書きするので、それは役に立たないだけです。


2
_変数として使用することを楽しんでください;-)。これは実質的に書き込み専用であり、値はすぐに失われます。
Stephen Kitt

1
また、内部的にBashは_変数として処理するため、の出力に表示されますset。ただし、私が判断できる限り、エクスポート済みとしてマークすることはできません。
Stephen Kitt

2
@StephenKittですが、Bash 4.4では読み取り専用としてマークできます。または整数。やや陽気な結果。
ilkkachu

1
ハ、素敵な発見、それはかなり面白いです!
Stephen Kitt

5

の出力でわかるように、すべてのシェル変数がエクスポート済みとしてマークされているわけではありませんdeclare -p

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.