$_
に関するBashマニュアルの次の文章を説明してください 、特に太字の部分、おそらくいくつかの例がありますか?
-
シェルの起動時に、環境で渡された
または引数リストとして実行されているシェルまたはシェルスクリプトを呼び出すために使用される
絶対パス名に設定します。 。 -
その後 、展開後、前の
コマンドの最後の引数に展開します。 -
また、実行された各
コマンドの呼び出しに使用されるフルパス名に設定します およびそのコマンドにエクスポートされた環境に配置 。 -
メールをチェックするとき 、このパラメータはメールファイルの名前を保持します。
承認された回答:
あまり明確ではないことに同意します。
1。シェルの起動時
-
_
の場合 変数はbash
の環境にありました 受け取った 、次にbash
手つかずのままにしておきます。特に、その
bash
シェルが別のbash
によって呼び出されました シェル(zsh
、yash
といくつかのksh
実装も
それを行います)、次にそのbash
シェルは_
を設定します 実行中のコマンドのパスに対するenvironment
変数(これは、質問の3番目の
ポイントです)。たとえば、bash
の場合
別のbash
の結果としてスクリプトを解釈するために呼び出されます シェルの解釈:bash-script some args
その
bash
_=/path/to/bash-scrip
を通過しますbash-script
に与えられた
環境で 、これが$_
の初期値
です。bash
変数はbash
にあります
そのスクリプトを解釈するシェル。$ env -i _=whatever bash -c 'echo "$_"' whatever
-
ここで、呼び出し元のアプリケーションが
_
を渡さない場合 環境
変数 、呼び出されたbash
シェルは$_
を初期化しますargv[0]
に
それ自体を受け取ります。これはbash
である可能性があります。 、または/path/to/bash
または/path/to/some-script
または他の何か(上記の例では、
は/bin/bash
になります スクリプトのshe-bangが#! /bin/bash
または/path/to/bash-script
システムによって異なります)。そのため、テキストは、
bash
する
呼び出し元の動作を説明しているため誤解を招く可能性があります。 制御できません。bash
を呼び出したアプリケーション$_
を設定しない可能性があります まったく(実際には、
シェルといくつかのまれなインタラクティブアプリケーションのみが実行します。execlp()
たとえば)、またはまったく異なるものに使用する可能性があります
(たとえば、ksh93
*pid*/path/to/command
に設定します 。$ env bash -c 'echo "$_"' /usr/bin/env (env did not set it to /bin/bash, so the value we get is the one passed to env by my interactive shell) $ ksh93 -c 'bash -c "echo $_"' *20042*/bin/bash
2。続いて
その後 あまり明確ではありません。実際には、それはbash
単純なコマンドを解釈します 現在のシェル環境で。
-
インタラクティブシェルの場合 、これは
/etc/bash.bashrc
から解釈される最初の単純なコマンドになります たとえば。たとえば、インタラクティブシェルのプロンプトで:
$ echo "$_" ] (the last arg of the last command from my ~/.bashrc) $ f() { echo test; } $ echo "$_" ] (the command-line before had no simple command, so we get the last argument of that previous echo commandline) $ (: test) $ echo "$_" ] (simple command, but in a sub-shell environment) $ : test $ echo "$_" test
-
非対話型シェルの場合 、
$BASH_ENV
の最初のコマンドになります または、$BASH_ENV
の場合、そのシェルにフィードされたコード
設定されていません。
3。 Bashがコマンドを実行するとき
3番目のポイントは何か違うものであり、上記の議論で示唆されています。
bash
、他のいくつかのシェルと同様に、_
を渡します bash
するパスを含む実行するコマンドの環境変数 execve()
の最初の引数として使用されます システムコール。
$ env | grep '^_'
_=/usr/bin/env
4。メールをチェックするとき
4番目のポイントについては、MAILPATH
の説明で詳しく説明しています。 変数:
「MAILPATH」
シェルが定期的に
新着メールをチェックするファイル名のコロンで区切られたリスト 。各リストエントリは、メールファイルに新着メールが到着したときに
印刷されるメッセージを指定できます。
ファイル名をメッセージから「?」で区切ることによって。
メッセージのテキストで使用される場合、「$_」は現在のメールファイルの名前に展開されます。
例:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>