$@expande para separar palavras (enquanto $*expande para uma única palavra), conforme explicado no bashmanual . 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 bashmanual . Esse comportamento é consistente com a especificação POSIX . Então, quando você escreve
text="$@"
a variável textobté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.