BK_STATARGS
é uma variável cujo conteúdo é a string de 7 caracteres -f '%z'
. Primeiro, vamos ver o que acontece no comando
stat "${BK_STATARGS}" test.txt
O shell primeiro analisa o comando em uma árvore de sintaxe, que consiste em um único comando simples, com três tokens: stat
, o resultado da expansão de ${BK_STATARGS}
e test.txt
. Em seguida, o shell expande o valor da variável para determinar a segunda palavra, que é -f '%z'
(a mesma string de 7 caracteres). Finalmente, o shell executa o comando na primeira palavra, passando as palavras subsequentes como argumentos de linha de comando, então stat
é executado com dois argumentos -f '%z'
e test.txt
.
Vamos agora voltar para o comando mais complexo
stat ${BK_STATARGS} test.txt
O processamento é o mesmo até a expansão do valor da variável. Como a substituição de variável não está entre aspas duplas, seu valor é tratado como uma lista de palavras separadas por espaços em branco. Há um caractere de espaço em branco na string, então ele é dividido em duas palavras e stat
recebe três argumentos: -f
, '%z'
e test.txt
.
As aspas simples fazem parte da sintaxe do shell: elas são reconhecidas no estágio de análise. Eles não têm um significado especial quando estão em uma string, mesmo que a string seja dividida após a expansão da variável.
Como %
e z
não são caracteres especiais, não é necessário citá-los:
typeset -r BK_STATARGS="-f %z"
typeset FILE_SIZE2=$(stat ${BK_STATARGS} test.txt)
Em geral, para passar vários argumentos para um comando, você precisa usar uma matriz em vez de uma string.
typeset -a BK_STATARGS; BK_STATARGS=(-f '%z')
typeset FILE_SIZE2=$(stat "${BK_STATARGS[@]}" test.txt)
"${BK_STATARGS[@]}"
é a sintaxe para expandir uma matriz em sua lista de elementos. Mesmo que pareça uma única palavra devido às aspas duplas, ela é realmente dividida em várias palavras devido ao [@]
subscrito, funcionando como "$@
.