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

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

バッシュマニュアルから

_

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

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

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

答え2

Linuxベースのシステムで実行している場合は、擬似ファイルを読み取ってプロセス環境を確認できます/proc/[pid]/environ。ただし、プロセスがまだ実行中で権限がある場合にのみ可能です。

envprintenv変数が改行ではなくNULL文字で区切られていることを除いて、内容はorの出力と似ています。

man procそしてより多くの情報を検索してみてくださいenviron

たとえば、

$ /bin/sleep 60 &
[1] 25909
$ tr '\0' '\n' < /proc/$!/environ | grep '^_='
_=/bin/sleep
$ 

拡張$!は、最近バックグラウンドに追加されたジョブのPIDです。

これは、すぐに完了する手順の場合はさらに困難になります。

環境変数の値に含まれると、"\n_="環境の一部である改行とnull文字から変換された改行を区別できないため、偽の肯定が発生する可能性があります。これは問題ではないようですが、問題が発生した場合は別の措置を講じる必要があります。

perl -nE 'undef $/; say grep /^_=/, split /\0/, scalar <>' /proc/$!/environ

答え3

これは不可能です(実行中のシェルでは)。

環境変数の値を印刷するにはコマンドが必要で、次のものを使用できますprintenv

$ printenv "LANG"
LANG=en_US.UTF-8

コマンド環境にエクスポートされた変数値を報告します。あるいは、現在実行中のシェルでecho(またはprintfまたはprint)変数の値を使用することもできます。

$ echo "$LANG"
LANG=en_US.UTF-8

どちらの場合も、コマンドが実行され、変数の値が$_実行されたコマンドの最後の引数に設定されます(コマンドが実行された場合)。

$ ls
$ echo ".$_."
.--color=auto.
$ echo ".$_."
..--color=auto..
$ echo ".$_."
...--color=auto...

$ bash -c 'echo $_'
/bin/bash

$ bash -c 'ls -l >>/dev/null; echo $_'
-l

したがって、実行されたすべてのコマンドは、コマンドを実行したサブシェルに設定された値を持ち、$_同じシェルによって印刷されます。$_

一部のシェルは一時を有効または設定しません$_

$ dash -c 'ls -l >/dev/null; echo ".$_."'
./bin/dash.

しかし、これはそれにつながる道の価値を明らかにするだけですdash。 ..

関連情報