O objetivo de ${1+"$@"}
para portabilidade.
POSIX definido $ @ se expandiria a nada se não houvesse argumentos posicionais . Mas o shell original do Bourne ( /bin/sh
no Solaris 10 e antes) o expandia para a string vazia ""
. Usar ${1+"$@"}
é uma solução para isso, desde quando "$@"
expandiu apenas se $1
foi definido.
Infelizmente, essa construção não funciona no zsh 3.xe no pre 4.3, porque o zsh executa a palavra dividir em ${1+"$@"}
no modo de emulação sh ( shwordsplit foi definido) :
$ set -- '1 2'
$ for i in ${1+"$@"}; do echo $i; done
1
2
"$@"
é tratado corretamente:
$ set -- '1 2'
$ for i in "$@"; do echo $i; done
1 2
Portanto, alias -g '${1+"$@"}'='"$@"'
garante que a divisão de palavras nunca seja executada ao usar ${1+"$@"}
. Isso permite que a construção ${1+"$@"}
seja usada em zsh, já que ela será substituída por "$@"
antes da expansão (você deve usar exatamente a cadeia de caracteres ${1+"$@"}
, sem caracteres iniciais ou finais).
Outro trabalho em torno de você pode fazer, é ignorar completamente usando "$@"
se não houver argumentos posicionais, verificando $#
:
case $# in
(0) func ;;
(*) func "$@" ;;
esac
Demorou mais trabalhos, mas completamente portáteis.