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


29

を実行した後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 -asetこの変数は再び含まれなくなります。何が起こっている?


回答:


16

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

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

セット-a

を実行すると後続のすべての(新規または変更された)変数がエクスポートされたものとしてset -aマークされます(すべてのシェル、およびいくつかの関連シェルを除く)。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などではありません)。位置引数は、「$ @」(または同等の「$ *」、等しくない)で印刷されます。

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

_ = last_argument

また、内部シェル変数の値_は、実行された行の最後の引数に変更されます。これは、bashを除くほとんどすべてのシェル(jsh、ash、yash、dash、lksh、mksh、ksh93、attsh、そしてもちろんcshとtcsh)には当てはまりません

$ 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"

37

下線は実際には特別なシェル変数です。ここに表示されているのは、_値がのunderscore()変数ですvar=99。これは読み取り専用であり、シェルによって管理されます。それは:

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

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

set -a var=99  

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

_=var=99  

少しわかりにくいですが、最初=は変数への割り当てを示し_、2番目は値の一部です。

また、後に定義されたすべての変数をエクスポートする-aオプションを指定setすることも重要です。


16

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

  • bash@BobEagerが適用されたものは何でも、
  • の場合zsh、前のコマンドの最後の引数、およびコマンドの環境内のコマンドの完全パス名のみに設定されます
  • dash対話型セッションの実行時にのみこの変数を設定するようなシェルもあります

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

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

export var=99

2
正しい構文もですunset var;set -a; var=99。すべての適切なシェルで動作します(cshなどではありません)。
矢印

1
@矢印ボブ・イーガーの答えの最後の行によると、これはその後、すべての変数を設定/変更してエクスポートします。
TripeHound

8

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

bash(1)のそれほど洗練されていない印刷では、

set[ --abefhkmnptuvxBCEHPT] [ オプション名 ] [ arg …]   [ ] [ オプション名 ] [ arg …]-o
set+abefhkmnptuvxBCEHPT+o

            ︙
    オプションが指定されている場合、彼らはシェルの属性を設定または解除。オプション処理後に残存する任意の引数は位置パラメータの値として扱われ、割り当てられ、順番に、に$1$2... 。$n

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.