Na documentação do Perl, o perlrun (1) sugere o lançamento de scripts Perl usando um cabeçalho bilíngue do shell / Perl:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
O que ${1+"$@"}
significa isso ? Tentei usar "$@"
(em vez disso, usando Bash como / bin / sh), e parece funcionar da mesma forma.
Editar
Duas respostas abaixo dizem que deveria ser ${1:+"$@"}
. Estou ciente da ${parameter:+word}
sintaxe ("Usar valor alternativo") documentada no bash (1). No entanto, não estou convencido, porque
Ambos
${1+"$@"}
e"$@"
funcionam muito bem, mesmo quando não há parâmetros. Se eu criar simple.sh como#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "$@"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
e question.sh como
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"$@"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
Posso fazer com que ambos trabalhem de forma idêntica:
$ ./question.sh $VAR1 = []; $ ./question.sh a $VAR1 = [ 'a' ]; $ ./question.sh a 'b c' $VAR1 = [ 'a', 'b c' ]; $ ./question.sh "" $VAR1 = [ '' ]; $ ./simple.sh $VAR1 = []; $ ./simple.sh a $VAR1 = [ 'a' ]; $ ./simple.sh a 'b c' $VAR1 = [ 'a', 'b c' ]; $ ./simple.sh "" $VAR1 = [ '' ];
Outras fontes na Internet também usam
${1+"$@"}
, incluindo um hacker que parece saber o que está fazendo.
Talvez ${parameter+word}
seja uma sintaxe alternativa (ou obsoleta) indocumentada para ${parameter:+word}
? Alguém poderia confirmar essa hipótese?