回答:
を実行するとset -a var=99
、3つの異なることが起こります(質問に関連して):
-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
実際にset -- var=99
は、ダッシュ(-
)で始まる値を持つオプションの解釈を回避する必要があります(そして、セットにはたくさんあります)。
引数のリスト(位置パラメータのリスト)をの後のリストに設定します--
。これは、すべての妥当なシェルで有効です(cshなどではありません)。位置引数は、「$ @」(または同等の「$ *」、等しくない)で印刷されます。
$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3
また、内部シェル変数の値_
は、実行された行の最後の引数に変更されます。これは、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"
下線は実際には特別なシェル変数です。ここに表示されているのは、_
値がのunderscore()変数ですvar=99
。これは読み取り専用であり、シェルによって管理されます。それは:
あなたの例は2番目のカテゴリーに分類されます。入力した:
set -a var=99
したがって、最後の引数はvar=99
であり、それはあなたが設定していた値でした(あなたはに設定var
していませんでした99
)。したがって、それ_
に設定されました。そして、それが報告されているものです:
_=var=99
少しわかりにくいですが、最初=
は変数への割り当てを示し_
、2番目は値の一部です。
また、後に定義されたすべての変数をエクスポートする-a
オプションを指定set
することも重要です。
正しい答えは、使用しているシェルによって異なります。
bash
@BobEagerが適用されたものは何でも、zsh
、前のコマンドの最後の引数、およびコマンドの環境内のコマンドの完全パス名のみに設定されますdash
対話型セッションの実行時にのみこの変数を設定するようなシェルもあります他のシェルにも他の特殊性があるかもしれません。そのため、$_
されて定義されていない、それを使用した場合1は、潜在的な移植性の問題に注意する必要がありますので、POSIXに。
サイドノート:99の値を割り当ててvar
後続のサブプロセスの環境で使用できるようにする場合、これを実現するための正しい構文は次のとおりです。
export var=99
unset var;set -a; var=99
。すべての適切なシェルで動作します(cshなどではありません)。
そして、私
echo $var
は何も与えないことに注意してください。…どうしたの?
bash(1)のそれほど洗練されていない印刷では、
set
[--abefhkmnptuvxBCEHPT
] [ オプション名 ] [ arg …] [ ] [ オプション名 ] [ arg …]-o
set
+abefhkmnptuvxBCEHPT
+o
︙
オプションが指定されている場合、彼らはシェルの属性を設定または解除。オプション処理後に残存する任意の引数は位置パラメータの値として扱われ、割り当てられ、順番に、に$1
、$2
... 。$n
つまり、set -a var=99
環境変数var
を99
;に設定しません。に設定$1
しvar=99
ます。echo "$1"
またはecho "$*"
を試してみてください。