コマンドに渡された環境変数として `_` を使用します。

コマンドに渡された環境変数として `_` を使用します。

バッシュマニュアルから

_

シェルが起動したら、環境リストまたは引数リストに渡されたシェルを呼び出すために使用される絶対パス名または実行中のシェルスクリプトに設定します。その後、拡張後、前のコマンドの最後の引数に展開されます。また、実行された各コマンドを呼び出し、そのコマンドにエクスポートされた環境にデプロイするために使用されるフルパス名に設定されます。メールを確認すると、このパラメーターにはメールファイルの名前が保持されます。

太字の場合は、スティーブン

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

おすすめ記事