GNU/Linux >> Linux の 問題 >  >> Linux

`$ _`の意味を理解しますか?

$_に関するBashマニュアルの次の文章を説明してください 、特に太字の部分、おそらくいくつかの例がありますか?

  1. シェルの起動時に、環境で渡された
    または引数リスト
    として実行されているシェルまたはシェルスクリプトを呼び出すために使用される
    絶対パス名に設定します。 。

  2. その後 、展開後、前の
    コマンドの最後の引数に展開します。

  3. また、実行された各
    コマンドの呼び出しに使用される
    フルパス名に設定します およびそのコマンドにエクスポートされた環境に配置

  4. メールをチェックするとき 、このパラメータはメールファイルの名前を保持します。

承認された回答:

あまり明確ではないことに同意します。

1。シェルの起動時

  • _の場合 変数はbashの環境にありました 受け取った 、次にbash 手つかずのままにしておきます。

    特に、そのbash シェルが別のbashによって呼び出されました シェル(zshyash といくつかの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の場合、そのシェルにフィードされたコード
    設定されていません。

関連:GTKアプリケーションとQTアプリケーションの違いは?

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>

Linux
  1. BASH シェルが Linux で構成ファイルをロードする方法

  2. POSIX とはどういう意味ですか?

  3. bash/Makefileの二重ドル記号の意味は何ですか?

  1. Bashシェルのカスタマイズ

  2. 「!」の意味は何ですか? -d` この Bash コマンドで?

  3. Bashスクリプトの実行とソースの違いは何ですか?

  1. Bashシェルでのクイックディレクトリナビゲーション?

  2. (bash)シェルの特別なパラメーター/変数はどれですか?

  3. $の意味は?シェルスクリプトでは?