$@
se expande para separar palabras (mientras que se $*
expande a una sola palabra), como se explica en el bash
manual . Por lo tanto, cuando escribes
zenity --text="$@"
se expande a
zenity --text="$1" "$2" "$3"
Sin embargo, las asignaciones de variables de shell no sufren división de palabras. Tenga en cuenta que la división de campo / palabra se omite en la lista de expansiones para asignaciones variables en el bash
manual . Este comportamiento es consistente con la especificación POSIX . Entonces, cuando escribes
text="$@"
la variable text
obtiene todos los parámetros posicionales como una sola palabra, equivalente a si hubiera escrito text="$*"
. De hecho, esta es la razón por la cual las comillas dobles a menudo son innecesarias en las asignaciones variables. Ambos
text=$@
y
text=$*
son perfectamente seguros
Entonces,
text=$@
zenity --option="$text"
se expande "$text"
a una sola palabra, razón por la cual esto funciona. Tenga en cuenta que --option="$@"
es solo un argumento normal para el comando zenity
, y no una asignación de variable de shell, por lo que la división de palabras tiene lugar aquí pero no en text=$@
.
zenity --text="$*"
- se"$*"
expande a una sola palabra.