Shell: "$@" vs ${1+"$@"}

procenkotanya

Что-то я не понимаю смысл идиомы ${1+"$@"}
Если левая часть ($1) неопределена, + возвращает левую часть, иначе возвращает правую часть ("$@")
Но если $1 неопределён, то параметров нет и "$@" также раскрывается в пустоту (zero fields)
Так что у меня получается, что "$@" и ${1+"$@"} должны быть эквивалентны. Что я упускаю?
Google code search находит много употреблений этой идиомы

Anturag

Пофигу, судя по тому, что пишут в config.status

# 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

procenkotanya

Но явно же была причина писать более сложную форму ${1+"$@"} в сотне мест вместо более простой "$@"?

Anturag

Если внимательно посмотреть места использования по google code search, то 99.9% это ltmain, ltconfig, config.status, ylwrap и т.д., то есть ноги растут из одного места - autotools, что полностью объясняет, почему много результатов выдаётся при поиске, и частично объясняет, почему так криво сделано.
Теоретически, может такая запись важна в csh, ash, ksh или ещё в каком-нибудь экзотичном месте.

procenkotanya

Да. Как выяснилось, в libtool, например, эта шняга для поддержки некоторых старых не-POSIX шеллов, которые не раскрывали "$@" в (no fields) при отстутствии параметров.
Оставить комментарий
Имя или ник:
Комментарий: