バッシュマニュアルから
_
シェルが起動したら、環境リストまたは引数リストに渡されたシェルを呼び出すために使用される絶対パス名または実行中のシェルスクリプトに設定します。その後、拡張後、前のコマンドの最後の引数に展開されます。また、実行された各コマンドを呼び出し、そのコマンドにエクスポートされた環境にデプロイするために使用されるフルパス名に設定されます。メールを確認すると、このパラメーターにはメールファイルの名前が保持されます。
太字の場合は、スティーブン
bash は他のシェルと同様に
_
実行するコマンドに環境変数を渡します。これには、bashがシステムコールの最初の引数として使用するパスが含まれますexecve()
。$ env | grep '^_' _=/usr/bin/env
_
任意のコマンドの環境変数の値を取得し、env
その値がそのコマンドの実行可能ファイルまたはスクリプトのパス名であることを確認するにはどうすればよいですか?
ありがとうございます。
ベストアンサー1
この$_
値は子プロセスに表示されます。子供に本を読むようにする方法は、使用する言語によって異なります。
たとえば、C言語で
#include <stdlib.h>
#include <stdio.h>
main()
{
char *x=getenv("_");
printf("%s\n",x);
}
$_
ただし、他のシェルが異なる動作をする可能性があるため、プログラムは設定に依存できません。
例えば
$ env -i /bin/bash -c ./a.out
./a.out
$ env -i /bin/ksh -c ./a.out
*31801*./a.out
$ env -i /bin/sh -c ./a.out
Segmentation fault (core dumped)
/bin/sh(このUbuntuシステムの「ダッシュ」)には$ _がまったく設定されていないため、この単純なプログラムがクラッシュします。こんな:-)
$_
呼び出し側プログラムではこの値をまったく表示できません。実際、呼び出しシェルでは、$_
前の行の最後の引数に設定されます。
$ ls /tmp > /dev/null
$ echo $_
/tmp
$ echo hello
hello
$ echo $_
hello