Bashのマニュアルの次の文章$_、特に太字の部分について、例を挙げて説明していただけませんか。
シェルの起動時に、環境または引数リストで渡されたとおりに実行されているシェルまたはシェルスクリプトを呼び出すために使用される絶対パス名に設定します。
その後、展開後、前のコマンドの最後の引数に展開します。
また、完全なパス名に設定し、各コマンド実行起動するために使用し、そのコマンドにエクスポート環境に置かを。
mailをチェックする場合、このパラメーターはメールファイルの名前を保持します。
Bashのマニュアルの次の文章$_、特に太字の部分について、例を挙げて説明していただけませんか。
シェルの起動時に、環境または引数リストで渡されたとおりに実行されているシェルまたはシェルスクリプトを呼び出すために使用される絶対パス名に設定します。
その後、展開後、前のコマンドの最後の引数に展開します。
また、完全なパス名に設定し、各コマンド実行起動するために使用し、そのコマンドにエクスポート環境に置かを。
mailをチェックする場合、このパラメーターはメールファイルの名前を保持します。
回答:
私はそれがあまり明確ではないことに同意します。
_変数がをbash受け取った環境にあった場合は、そのbashままにしておきます。
特に、そのbashシェルが別のbash
シェルによって呼び出された場合(ただしzsh、yash一部の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その後は、どちらかの非常に明確ではありません。実際には、それは現在のシェル環境で単純なコマンドを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、他のいくつかのシェルと同様に、システムコールの最初の引数として使用された_パスを含む環境変数を実行するコマンドに渡します。bashexecve()
$ env | grep '^_'
_=/usr/bin/env
4番目のポイントについては、MAILPATH変数の説明で詳しく説明しています。
「メールパス」
コロンで区切られたファイル名のリスト。シェルが定期的に新しいメールをチェックします。
各リストエントリでは、ファイル名とメッセージを「?」で区切ることにより、メールファイルに新しいメールが到着したときに出力されるメッセージを指定できます。メッセージのテキストで使用する場合、「$ _」は現在のメールファイルの名前に展開されます。
例:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>
次の簡単な例を試してください:
echo "$_"
echo "test"
echo "$_"
絶対パス(/home/$USERNAME/test.sh)を指定して実行します。出力:
/home/$USERNAME/test.sh
test
test
最初$_にスクリプトを呼び出すために使用したパスが含まれ、2番目には中央への最初の引数が含まれますecho。リストの3番目の項目の場合、新しいターミナルを開始してechoと入力する$_
とPATH、通常のシェルまたはコマンドへの絶対パスで(私のUbuntuマシンで)コマンドを検索して呼び出すために通常使用されるを含む変数が表示され.bashrsますログインシェル。
bashのmanページの項目4の場合:
メッセージのテキストで使用する
$_と、現在のメールファイルの名前に展開されます。
echo $_is の出力が表示されますEDITOR。なぜですか。どのケースが続きますか?(3)メールの確認方法$_、この場合の使用例を教えてください。
.bashrcそこにあるすべての行をコメント化します。同様echo "test"または類似のコマンドを含む1行のみを保持します。保存して閉じます。その後bash、すぐに実行しecho $_ます。この最後のエコーは、テストを出力に出力するはずです。
MAILPATH、linuxcommand.org