Shell: "$@" vs ${1+"$@"}
# Be Bourne compatible
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
emulate sh
NULLCMD=:
# Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
set -o posix
fi
Но явно же была причина писать более сложную форму ${1+"$@"} в сотне мест вместо более простой "$@"?
Теоретически, может такая запись важна в csh, ash, ksh или ещё в каком-нибудь экзотичном месте.
Да. Как выяснилось, в libtool, например, эта шняга для поддержки некоторых старых не-POSIX шеллов, которые не раскрывали "$@" в (no fields) при отстутствии параметров.
Оставить комментарий
procenkotanya
Что-то я не понимаю смысл идиомы ${1+"$@"}Если левая часть ($1) неопределена, + возвращает левую часть, иначе возвращает правую часть ("$@")
Но если $1 неопределён, то параметров нет и "$@" также раскрывается в пустоту (zero fields)
Так что у меня получается, что "$@" и ${1+"$@"} должны быть эквивалентны. Что я упускаю?
Google code search находит много употреблений этой идиомы