В настоящее время я получаю 2 мнения от 3 снарядов:
$ bash -c 'set bar; set foo${1+ "[email protected]"}; echo "$# $*"'
1 foobar
$ ash -c 'set bar; set foo${1+ "[email protected]"}; echo "$# $*"'
2 foo bar
$ dash -c 'set bar; set foo${1+ "[email protected]"}; echo "$# $*"'
2 foo bar
Или я упустил некоторые определения POSIX, которые показывают мой пример как поведение, определяемое реализацией?
Обратите внимание, что только "$ @", похоже, вызывает различия. Следующее работает одинаково для всех 3 оболочек:
$ bash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar
$ ash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar
$ dash -c 'set bar; set foo${1+ $*}; echo "$# $*"'
2 foo bar
К сожалению, $ * не совсем то же самое, что "$ @", если аргументы должны содержать пробелы.
BTW, я использую Bash версии 4.4.12 (1) -release.