$@розширюється на окремі слова (тоді як $*розширюється на одне слово), як пояснено в 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="$*"-"$*"розширюється на одне слово.