$@
expande para separar palavras (enquanto $*
expande para uma única palavra), conforme explicado no bash
manual . Assim, quando você escreve
zenity --text="$@"
expande para
zenity --text="$1" "$2" "$3"
No entanto, as atribuições de variáveis de shell não sofrem divisão de palavras. Observe que a divisão de campo / palavra é omitida na lista de expansões para atribuições de variáveis no bash
manual . Esse comportamento é consistente com a especificação POSIX . Então, quando você escreve
text="$@"
a variável text
obtém todos os parâmetros posicionais como uma única palavra, equivalente a se você tivesse escrito text="$*"
. De fato, essa é a razão pela qual aspas duplas geralmente são desnecessárias em atribuições de variáveis. Ambos
text=$@
e
text=$*
são perfeitamente seguros.
Assim,
text=$@
zenity --option="$text"
expande "$text"
para uma única palavra, e é por isso que isso funciona. Observe que este --option="$@"
é apenas um argumento normal para o comando zenity
, e não uma atribuição de variável do shell, e é por isso que a divisão de palavras ocorre aqui, mas não em text=$@
.
zenity --text="$*"
-"$*"
expande para uma única palavra.