$@
expande para separar palavras (enquanto $*
se expande para uma única palavra), como 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 são submetidas à 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 as aspas duplas são frequentemente desnecessárias em atribuições de variáveis. Ambos
text=$@
e
text=$*
são perfeitamente seguros.
Então,
text=$@
zenity --option="$text"
expande "$text"
para uma única palavra, e é por isso que isso funciona. Observe que --option="$@"
é apenas um argumento normal para o comando zenity
e não uma atribuição de variável de shell, e é por isso que a divisão de palavras ocorre aqui, mas não em text=$@
.