Кто-нибудь может найти пример этой разницы?
Здесь вы 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'
.