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