Postei uma resposta para uma pergunta no AU e descobri que a expansão de parâmetros $@
não funciona com o sh
shell:
<infile xargs -d'\n' sh -c 'echo "${@%%/*}"' _
mas funciona bem em bash
. Esse é o comportamento esperado do sh
shell e como posso executar a expansão lá?
Além disso, sei que com a -n1
opção xargs
posso passar apenas uma linha para o comando por vez, mas estava interessado em saber se sh
pode expandir $@
:
<infile xargs -d'\n' -n1 sh -c 'echo "${0%%/*}"'
infile
contém:
A1 /B1/C1
A 2/B2/C2
A3/B3/C3
Sim, traço parece ser menos útil aqui. Embora não seja culpado, estritamente falando, como não
${@%...}
é especificado pelo POSIX :É estranho, porém, parece que se uma expansão como essa modifica o final de um parâmetro posicional, ela descarta os seguintes. Mas não se não modificar o final:
Bash, ksh e Zsh parecem manipular
"${@#...}"
e"${@%...}"
processar cada parâmetro posicional de forma independente, o que parece ser útil.Suponho que a solução óbvia
dash
seja fazer a modificação de um argumento por vez:Pelo que vale a pena, o comportamento das expansões de remoção de prefixo/sufixo usadas
$*
também varia entre os shells. Bash e ksh parecem modificar os parâmetros primeiro e uni-los depois disso, enquanto Zsh e dash unem os parâmetros primeiro e modificam a string concatenada: