Nella documentazione Perl, perlrun (1) suggerisce di lanciare script Perl usando una shell bilingue / intestazione Perl:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
Cosa ${1+"$@"}
significa? Ho provato a usare "$@"
invece (usando Bash come / bin / sh), e sembra funzionare altrettanto bene.
modificare
Due risposte sotto dicono che dovrebbe essere ${1:+"$@"}
. Sono a conoscenza della ${parameter:+word}
sintassi ("Usa valore alternativo") documentata in bash (1). Tuttavia, non sono convinto, perché
Sia
${1+"$@"}
e"$@"
funzionano bene, anche quando non ci sono parametri. Se creo simple.sh come#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "$@"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
e question.sh as
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"$@"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
Posso far funzionare entrambi in modo identico:
$ ./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 = [ '' ];
Anche altre fonti su Internet usano
${1+"$@"}
, tra cui un hacker che sembra sapere cosa sta facendo.
Forse ${parameter+word}
è una sintassi alternativa (o deprecata) senza documenti per ${parameter:+word}
? Qualcuno potrebbe confermare questa ipotesi?