Essa diferença entre executar código no shell ou em um sub-shell é esperada?
$ a() { echo ${@: -1} ; }
$ echo "echo ${*: -1}" > b
$ chmod +x b
$ a 1 2 3
3
$ ./b 1 2 3
bash
$
Debian Sid
Bash versão 5.2.15
Essa diferença entre executar código no shell ou em um sub-shell é esperada?
$ a() { echo ${@: -1} ; }
$ echo "echo ${*: -1}" > b
$ chmod +x b
$ a 1 2 3
3
$ ./b 1 2 3
bash
$
Debian Sid
Bash versão 5.2.15
Aqui:
que
"${*: -1}"
está entre aspas duplas e, portanto, se expande imediatamente. Quando a notação de fatia é usada com$*
ou$@
, ela examina a lista de$0
,$1
, ..., não apenas a lista de parâmetros posicionais começando em$1
. Índices negativos contam a partir do final, portanto, começar em-1
fornece o último elemento dessa lista.Como você provavelmente não tem parâmetros posicionais em um shell interativo, pegar o último elemento dessa lista fornece
$0
, o nome do shell. No seu caso, isso parece serbash
, e o arquivob
conteráecho bash
.Na função,
${@: -1}
veja os parâmetros posicionais da própria função, o último dos quais é3
.Se você quiser armazenar a string
echo ${*: -1}
em um arquivo, use aspas simples para evitar a expansão. Seria melhor também adicionar aspas duplas para que a expansão seja citada quando acontecer, então, por exemploNão há subshell aqui, apenas uma função e um script externo.