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.