Bash расширение оператора присваивания в режиме POSIX по сравнению с режимом без POSIX - PullRequest
3 голосов
/ 04 апреля 2020

В руководстве GNU bash есть следующий отрывок, в котором говорится о параметрах оболочки:

Встроенная функция command не предотвращает встроенные функции, которые принимают операторы присваивания в качестве аргументов из расширяя их как операторы присваивания; когда не в режиме POSIX, встроенные присваивания теряют свои свойства расширения оператора присваивания, когда им предшествует команда.

Я не могу понять, о чем идет речь, и мне также не удается написать команду, которая отличается по поведению выражений присваивания между обычным режимом и режимом posix по этой причине.

Кто-нибудь может найти пример такой разницы?

1 Ответ

7 голосов
/ 04 апреля 2020

Кто-нибудь может найти пример этой разницы?

Здесь вы go:

$ touch foo=bar
$
$ bash <<EOD
command declare foo=*
declare -p foo
EOD
declare -- foo="bar"
$
$ bash --posix <<EOD
command declare foo=*
declare -p foo
EOD
declare -- foo="*"

В режиме POSIX foo=* не расширяется до foo=x; он остается как есть, потому что расширение имени пути не выполняется для операторов присваивания.

Но в обычном режиме это происходит, так как предшествующее declare с command имеет bash относительно foo=* как обычный аргумент; таким образом, он подвергается расширению пути.

И еще один:

$ export foo='x y=z'
$
$ bash <<\EOD
command declare bar=$foo
declare -p bar y
EOD
declare -- bar="x"
declare -- y="z"
$
$ bash --posix <<\EOD
command declare bar=$foo
declare -p bar y
EOD
declare -- bar="x y=z"
bash: line 2: declare: y: not found

Здесь разница в том, что разбиение слов выполняется на $foo - так как оно без кавычек - в нормальный режим, приводящий к двум отдельным аргументам: bar=x и y=1. В режиме POSIX его форма сохраняется: bar='x y=1'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...