In der Perl-Dokumentation schlägt Perlrun (1) vor, Perl-Skripte mit einem zweisprachigen Shell- / Perl-Header zu starten:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
Was heißt ${1+"$@"}
das? Ich habe versucht, "$@"
stattdessen (mit Bash als / bin / sh), und es scheint genauso gut zu funktionieren.
Bearbeiten
Zwei Antworten unten sagen, dass es sein soll ${1:+"$@"}
. Mir ist die ${parameter:+word}
in bash (1) dokumentierte Syntax ("Use Alternate Value") bekannt. Ich bin jedoch nicht überzeugt, weil
Beides
${1+"$@"}
und"$@"
funktionieren einwandfrei, auch wenn keine Parameter vorhanden sind. Wenn ich simple.sh als erstelle#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "$@"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
und question.sh als
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"$@"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
Ich kann beide dazu bringen, identisch zu arbeiten:
$ ./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 = [ '' ];
Andere Quellen im Internet verwenden ebenfalls
${1+"$@"}
, darunter ein Hacker, der zu wissen scheint, was er tut.
Vielleicht ${parameter+word}
ist eine undokumentierte alternative (oder veraltete) Syntax für ${parameter:+word}
? Könnte jemand diese Hypothese bestätigen?