$@
розширюється на окремі слова (тоді як $*
розширюється на одне слово), як пояснено в bash
посібнику . Таким чином, коли пишеш
zenity --text="$@"
вона розширюється до
zenity --text="$1" "$2" "$3"
Однак призначення змінних оболонок не зазнає розбиття слів. Зауважте, що розділення на поле / слово пропущено у списку розширень для присвоєння змінних у bash
посібнику . Така поведінка відповідає специфікації POSIX . Отже, коли пишеш
text="$@"
змінна text
отримує всі позиційні параметри як одне слово, еквівалентне, якби ви написали text="$*"
. Дійсно, це є причиною того, що подвійні лапки часто не потрібні в змінних призначеннях. І те й інше
text=$@
і
text=$*
абсолютно безпечні.
Тому,
text=$@
zenity --option="$text"
розширюється "$text"
до одного слова, саме тому це працює. Зауважте, що --option="$@"
це просто звичайний аргумент команди zenity
, а не призначення змінної оболонки, тому розбиття слів відбувається тут, але не в text=$@
.
zenity --text="$*"
-"$*"
розширюється на одне слово.