より長い説明

より長い説明

を実行した後、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変数は再び含まれません。何が問題なの?

答え1

下線は実際には特殊なシェル変数です。ここに表示されるのは、値が_.var=99の underscore() 変数です。読み取り専用で、シェルで維持されます。これは:

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

あなたの例は2番目のカテゴリに属します。入力した内容は次のとおりです。

set -a var=99  

だから最後の主張var=99設定中です(varに設定されていません99)。とにかく_そう決まっています。報告される内容は次のとおりです。

_=var=99  

少し混乱していますが、最初は=変数への割り当てを表し、_2番目は値の一部を表します。

-aこのオプションのset結果は次のとおりです。後で定義されるすべての変数輸出を待っています。

答え2

_=出力の行の先頭にある一般的なセットは、bashに_(アンダースコア)という変数があることを示します。その値は次のとおりです=。 (bashで)test_varという名前の変数を設定するのと同じです。12345

$ test_var=12345

$ set | grep test_var
test_var=12345

$ declare -p test_var
test_var=12345

この特殊な bash 変数は、前の行の最後の引数に設定されます。

$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello

$ echo "$_"
_=myvar=hello

$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello

$ declare -p _
declare -- _="_=myvar=hello"

参考にしてください二つ =この出力から。


より長い説明

を実行するとset -a var=99サムあなたの質問に関連するさまざまなことが発生します。

  1. 変数のエクスポートのオプション()を設定します-a(反対の操作を実行)。set +a
  2. 位置パラメータは、オプションに続く項目として「設定」されます($1に設定var=99)。
  3. シェル変数の下線は$_最後の引数(拡張)に設定されます。

剛毛

実行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

変数設定=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"

答え3

正解は、使用するシェルによって異なります。

  • ~のためbash、@BobEagerが言った内容はすべて適用されます。
  • ~のためzsh、前のコマンドの最後の引数にのみ設定され、コマンド環境でのコマンドのフルパス名
  • 一部の殻は次のとおりです。dashこの変数は、対話型セッションを実行するときにのみ設定されます。

他の殻には他の特産品もあります。そう、$_うん限定されないPOSIXでは、使用時に潜在的な移植性の問題を知っておく必要があります。

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

export var=99

答え4

私はecho $var何も与えられないことがわかりました。 …どうしたの?

少ない小文字で大きな打撃(1)、私たちは発見

set[--abefhkmnptuvxBCEHPT][-o オプション名][アルギニン… ]
set  [+abefhkmnptuvxBCEHPT][+o オプション名][アルギニン… ]

            ︙
    オプションを指定すると、シェルプロパティを設定または設定解除します。オプション処理後、残りの引数は位置引数の値として処理され、割り当てられます。$1$2、…$n

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

関連情報