次の例では、変数{_,0}を理解するのに問題があります。
スクリプトからtmp.sh
:
func()
{
echo $_
echo $0
echo $1
}
パラメータxを使用してtmp.shを呼び出します。
~$ ./tmp.sh x
./tmp.sh
./tmp.sh
x
そして、パラメータxを使ってtmp.shを取得します。
~$ . ./tmp.sh x
x
bash
x
私が理解している限り$_
、$0
最初の例に示すように、後者は最初のパラメータとして使用されます./tmp.sh
。 2番目の例では、bashと同じ理由は何ですか?
なぜ拡張すると、.
前者はソースなしのbashの$ 0に対応するソースbashの最後の引数を返します。そうですか?
答え1
Nが数値のときに参照される変数は、$N
スクリプトの位置引数です。 $0
最初のパラメータであるスクリプト自体。 $1
2番目のパラメータ(bashは0から計算し、人間は1から計算を開始するため、1と呼ばれる)のxです。
$_
特定の位置パラメータではなく、実行中のコマンドのフルパスで始まりますが、拡張後に前のコマンドの最後のパラメータ値になる特別なパラメータであるため、少し奇妙です。これが最初の実行と同じ理由です$0
。一方、2番目の実行では、スクリプトを取得すると、その値x
(ソースから解釈された前のコマンドの最後のパラメータ)に展開されます。
これについて詳しくは、bashのマニュアルを読んでください。セクション3.4.1:位置パラメータ
次のセクション3.4.2では$_
。
答え2
0 Expands to the name of the shell or shell script. This is set at shell initialization. If bash is invoked with a file of commands, $0 is set to the
name of that file. If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present.
Otherwise, it is set to the filename used to invoke bash, as given by argument zero.
デフォルトでは、スクリプトを実行するとスクリプト$0
名が提供され、インタラクティブモードではbashが提供されます。.
bashはエイリアスで、実行可能ファイルではなくシェル組み込みであるため、$ 0の値を変更せずにsource
bashを対話モードに保ちます。
_ At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the environment or argument list.
Subsequently, expands to the last argument to the previous command, after expansion. Also set to the full pathname used to invoke each command exe‐
cuted and placed in the environment exported to that command. When checking mail, this parameter holds the name of the mail file currently being
checked.