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?