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