web-dev-qa-db-ja.com

「_ =」の意味は何ですか?

set -a var=99を実行した後、setの出力で文を見つけることができます。

...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_Prompt=1
_=var=99
colors=/etc/DIR_COLORS
...

「_ =の意味」を誰かに教えてもらえますか?

echo $varは何も与えないことに注意してください。 set -aを実行すると、setにこの変数が再び含まれなくなります。何が起こっている?

30
yode

set -a var=99を実行すると、three異なることが起こります(質問に関連して):

  1. 変数をエクスポートするための設定オプション(-a)(set +aを実行して元に戻す)。
  2. 定位置パラメーターは、オプションに続くものに「設定」されます($1var=99に設定されます)。
  3. シェル変数の下線$_は、最後のパラメーター(展開された)に設定されます。

セット-a

set -aを実行すると、allに続く(新しいまたは変更された)変数がエクスポート済みとしてマークされます(cshおよび一部の関連シェルを除くすべてのシェルで)。

$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer

この設定から回復するには、-+に変更するだけです。

$ set +a
$ unset myvariable              # to erase it from the environment if it
                                # was exported before the change of set +a
$ myvariable=456544654          # A new value of the variable.
$ env | grep "variable"         # No output means the var does not exist
                                # in the current environment

var = 99に設定

ダッシュ(set -- var=99)で始まる値を持つオプション(およびセットにはたくさんある)の解釈を避けるために、実際には-にする必要があります。

引数のリスト(位置パラメータのリスト)を--の後に設定します。これは、すべての妥当なシェルで有効です(csh et al以外)。位置引数は "$ @"(または同等の "$ *"、等しくない)で出力されます。

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

_ = last_argument

そして、Shellの内部変数_の値が、実行された行の最後の引数に変わります。つまり、bashを除くほとんどすべてのシェル(jsh、ash、yash、dash、lksh、mksh、ksh93、attsh、そしてもちろんcshとtcsh)で[〜#〜] not [〜#〜] trueです。 。

$ echo one two last argument
one two last argument

$ echo "$_"
argument

$ echo This is a new: last_argument
This is a new: last_argument

$ echo "$_"
last_argument

$_の値は展開後の値であることに注意してください。

$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument

$ echo "$_"
A New_Argument

だから、実行すると:

$ set -a myvar=99; set | grep 'myvar'
_=myvar=99

シェル変数「$ _」の説明が表示されます。これも機能します:

$  set -a myvar=99; declare -p _
declare -- _="myvar=99"
17
Isaac

下線は実際には特別なシェル変数です。ここに表示されているのは、アンダースコア(_)変数で、値はvar=99です。読み取り専用であり、シェルによって維持されます。それは:

  • シェルの起動時に設定され、引数リストで渡されたシェルまたは実行中のスクリプトの絶対ファイル名を含みます。
  • その後、展開後、前のコマンドの最後の引数に展開されます。
  • メールをチェックするとき、このパラメーターはメールファイルの名前を保持します。
  • また、実行され、そのコマンドにエクスポートされた環境に配置された各コマンドの絶対パス名にも設定されます。

あなたの例は2番目のカテゴリに分類されます。入力しました:

set -a var=99  

つまり、最後の引数はvar=99で、それがvalueでした(var99に設定していませんでした)。したがって、_はそれに設定されました。そしてそれが報告されているものです:

_=var=99  

少し混乱しますが、最初の=は変数_への代入を示し、2番目は値の一部です。

また、set-aオプションを使用すると、以降に定義されるすべての変数がエクスポートされることにも注意してください。

38
Bob Eager

正しい答えは、使用しているシェルによって異なります。

  • bash の場合、@ BobEagerが適用するすべての内容が適用されます
  • zsh の場合、前のコマンドの最後の引数と、コマンドの環境内のコマンドの完全パス名にのみ設定されます
  • dash のようないくつかのシェルは、対話型セッションを実行するときにのみこの変数を設定します

他のシェルにも他の特殊性があるかもしれません。など、 $_はPOSIXでは 未定義 であるため、使用する際には潜在的な移植性の問題に注意する必要があります。

補足:99の値をvarに割り当て、後続のサブプロセスの環境で使用できるようにする場合、これを実現するための正しい構文は次のとおりです。

export var=99
16

そして、echo $varは何も与えないことに注意してください。 …どうなるの?

bash(1) のそれほど細かくない出力では、

set[--abefhkmnptuvxBCEHPT] [ -ooption-name] [arg…]
set[+abefhkmnptuvxBCEHPT] [+ooption-name] [arg…]


    オプションを指定すると、シェル属性が設定または設定解除されます。オプション処理の後に残っている引数は、位置パラメータの値として扱われ、$1$2、…$n

つまり、set -a var=99は環境変数var99に設定しません。 $1var=99に設定します。 echo "$1"またはecho "$*"をお試しください。

8
Scott