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