シェルまたはサブシェルでコードを実行する間の予期しない違い

シェルまたはサブシェルでコードを実行する間の予期しない違い

シェルまたはサブシェルでコードを実行することの間にこれらの違いは予想されますか?

$ a() { echo ${@: -1} ; }
$ echo "echo ${*: -1}" > b
$ chmod +x b
$ a 1 2 3
3
$ ./b 1 2 3
bash
$ 

Debian Seed
Bash バージョン 5.2.15

答え1

ここで:

$ echo "echo ${*: -1}" > b

"${*: -1}"二重引用符で囲まれているので、すぐに拡張されます。 orでスライス表記を使用すると、、、...から始まる位置引数のリストだけでなく、、...のリストも表示されます$*$@負のインデックスは最後から逆に計算されるため、at から始まるリストの最後の要素が提供されます。$0$1$1-1

対話型シェルには位置引数がない可能性があるため、このリストの最後の要素はシェル名を指定するために$0使用されます。あなたの場合は該当するように見え、bashファイルbにはecho bash

関数内で${@: -1}関数自体の位置パラメータを確認してください。そのうち最後のパラメータはです3

echo ${*: -1}文字列をファイルに保存するには、単一引用符を使用して拡張を避けてください。拡張が発生したときに引用符を付けるために二重引用符を追加するのも良い考えです。

echo 'echo "${*: -1}"' > c

ただし、これにはサブシェルはなく、関数と外部スクリプトのみがあります。

関連情報