zsh で $argv が空になるのはなぜですか?

zsh で $argv が空になるのはなぜですか?

ファイル

#!/bin/zsh
echo $*
echo $0

echo ---

echo $argv
echo $argv[0]

コマンドが

./a 1 2

それが示している:

1 2
./a
---

[0]

コマンドが次の場合:

zsh ./a 1 2

それが示している:

1 2
./a
---
1 2

明示的なコマンドとして 'zsh' があると結果が変わるのはなぜですか? また、argv[0] が割り当てられないのはなぜですか?

答え1

$0は位置パラメータではなく、 の一部でもなく$@、スクリプト/関数の名前です。$*、および はすべて、位置パラメータの同じ通常の(非スパース)配列で$@あり$argv、オプションを有効にしない限り、zsh ではすべての配列インデックスは 1 から始まりますksharrays

ただし、配列インデックスを 0 から開始するオプションを有効にすると、または が最初の位置パラメータであるksharraysことがわかります。$argv[0]${@[0]}$1

bash混乱の原因は、ksh93 のようなシェル ( を含む)の配列にある可能性があります。この場合、 の展開には は含まれませんが、 は に${@:0:1}なります。この混乱は、Korn がシェル配列のインデックスを 0 から開始することを選択した結果です。ただし、Korn のベースとなっている Bourne シェルや、このシェルで使用される他のほとんどのシェルとツールでは、配列のインデックスが 1 から開始することを選択しています。$0"$@"$0

詳細はZsh 配列の最初の要素が 0 ではなく 1 でインデックス付けされる理由はありますか?

関連情報