Isso é para compatibilidade com o shell Bourne. O shell Bourne era um shell antigo que foi lançado pela primeira vez com a versão 7 do Unix em 1979 e ainda era comum até meados dos anos 90 como /bin/sh
na maioria dos Unices comerciais.
É o ancestral da maioria das ksh
, bash
ou zsh
.
Ele tinha alguns recursos estranhos, muitos dos quais foram corrigidos em ksh
e os outros shells e a nova especificação padrão de sh
, um dos quais é este:
Com o shell Bourne (pelo menos aquelas variantes em que não foi corrigido): "$@"
se expande para um argumento vazio se a lista de parâmetros posicionais estiver vazia ( $# == 0
) em vez de nenhum argumento.
${var+something}
se expande para "algo", a menos que $var
seja desfeito. Está claramente documentado em todos os shells, mas é difícil encontrá-lo na documentação do bash
, já que você precisa prestar atenção a esta frase:
When not performing substring expansion, using the forms documented below, bash tests for a parameter that is unset or null. Omitting the colon results in a test only for a parameter that is unset.
Portanto, ${1+"$@"}
expande para "$@"
apenas se $1
estiver definido ( $# > 0
), o que funciona em torno dessa limitação do shell Bourne.
Observe que o shell Bourne é o único shell com esse problema. O sh
s moderno (que é sh
em conformidade com a especificação POSIX de sh
(que o shell Bourne não é)) não tem esse problema. Portanto, você só precisa disso se precisar que seu código funcione em sistemas muito antigos, em que /bin/sh
pode ser um shell Bourne em vez de um shell padrão (note que POSIX não especifica o local do padrão sh
, portanto, por exemplo no Solaris antes do Solaris 11, /bin/sh
ainda era um shell Bourne (embora não tivesse esse problema específico), enquanto o normal / padrão sh
estava em outro local ( /usr/xpg4/bin/sh
)).
Há um problema em que a página perlrun
perldoc em que $0
não está citada.
Consulte o link para obter mais informações.