「$ _」の意味を理解する


12

Bashのマニュアルの次の文章$_、特に太字の部分について、例を挙げて説明していただけませんか。

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

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

  3. また、完全なパス名に設定し、各コマンド実行起動するために使用し、そのコマンドにエクスポート環境に置かを

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


4
-1つの質問は不明確で、十分に調査されていません。何を試しましたか?あなたの期待はテキストとどこでずれていましたか?「その後」という言葉を正直に理解していませんか?新しいユーザーがこれと同じ質問をする場合、私は同じ質問をします(物事がどのように機能するかについての私の似たような生来の好奇心にもかかわらず)。
Jeff Schaller

回答:


20

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

1.シェルの起動時に

  • _変数がをbash受け取った環境にあった場合は、そのbashままにしておきます。

    特に、そのbashシェルが別のbash シェルによって呼び出された場合(ただしzshyash一部のksh実装でもそれが可能です)、そのbashシェルは_環境変数を実行中のコマンドのパスに設定します(これが質問の3番目のポイントです)。たとえばbash、別のbashシェルの解釈の結果としてスクリプトを解釈するためにif が呼び出された場合:

    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もしスクリプトの彼女、強打だった、#! /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、他のいくつかのシェルと同様に、システムコールの最初の引数として使用された_パスを含む環境変数を実行するコマンドに渡します。bashexecve()

$ env | grep '^_'
_=/usr/bin/env

4.メールをチェックするとき

4番目のポイントについては、MAILPATH変数の説明で詳しく説明しています。

「メールパス」

コロンで区切られたファイル名のリスト。シェルが定期的に新しいメールをチェックします。

各リストエントリでは、ファイル名とメッセージを「?」で区切ることにより、メールファイルに新しいメールが到着したときに出力されるメッセージを指定できます。メッセージのテキストで使用する場合、「$ _」は現在のメールファイルの名前に展開されます。

例:

$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>

4

次の簡単な例を試してください:

echo "$_"
echo "test"
echo "$_"

絶対パス(/home/$USERNAME/test.sh)を指定して実行します。出力:

/home/$USERNAME/test.sh
test
test

最初$_にスクリプトを呼び出すために使用したパスが含まれ、2番目には中央への最初の引数が含まれますecho。リストの3番目の項目の場合、新しいターミナルを開始してechoと入力する$_PATH、通常のシェルまたはコマンドへの絶対パスで(私のUbuntuマシンで)コマンドを検索して呼び出すために通常使用されるを含む変数が表示され.bashrsますログインシェル。

bashのmanページの項目4の場合:

メッセージのテキストで使用する$_と、現在のメールファイルの名前に展開されます。


ありがとう。(1)3番目のケースを例で説明できますか?(2)新しいgnomeターミナルタブを開くと、echo $_is の出力が表示されますEDITOR。なぜですか。どのケースが続きますか?(3)メールの確認方法$_、この場合の使用例を教えてください。
ティム

を開き、.bashrcそこにあるすべての行をコメント化します。同様echo "test"または類似のコマンドを含む1行のみを保持します。保存して閉じます。その後bash、すぐに実行しecho $_ます。この最後のエコーは、テストを出力に出力するはずです。
coffeMug ​​2016年

メールの部分については、Unixメールを使用しておらず、システムに機能するメールがインストールされていないため、例を示すことはできません。しかしMAILPATHlinuxcommand.org
lc3_man_pages / bash1.htmlの

1
参考までに、bashマニュアルの正規の最新バージョンはgnu.org/software/bash/manual/bashref.html です。linuxcommandページは4.1でしたが、バージョン4.3です。
ジェフシャラー

1

ケース2の例は、1,000ワードの価値があります。

mkdir my_long_dir
cd $_

あなたが推測する/希望することをします。コマンドラインで簡単なプレースホルダーが表示されるので、何度も繰り返す必要がありません。

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