を実行した後、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
、サムあなたの質問に関連するさまざまなことが発生します。
- 変数のエクスポートのオプション()を設定します
-a
(反対の操作を実行)。set +a
- 位置パラメータは、オプションに続く項目として「設定」されます(
$1
に設定var=99
)。 - シェル変数の下線は
$_
最後の引数(拡張)に設定されます。
剛毛
実行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
答え4
私は
echo $var
何も与えられないことがわかりました。 …どうしたの?
少ない小文字で大きな打撃(1)、私たちは発見
set
[--abefhkmnptuvxBCEHPT
][-o
オプション名][アルギニン… ]
set
[+abefhkmnptuvxBCEHPT
][+o
オプション名][アルギニン… ]︙
オプションを指定すると、シェルプロパティを設定または設定解除します。オプション処理後、残りの引数は位置引数の値として処理され、割り当てられます。$1
、$2
、…$n
つまり、set -a var=99
環境変数をに設定var
せずにに99
設定してみてください。$1
var=99
echo "$1"
echo "$*"