У документації на Perl perlrun (1) пропонує запустити скрипти Perl за допомогою двомовної оболонки / заголовка Perl:
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"$@"}'
if 0;
Що ${1+"$@"}означає? Я спробував використовувати "$@"натомість (використовуючи Bash як / bin / sh), і, здається, він працює так само добре.
Редагувати
Два відповіді нижче кажуть, що так і повинно бути ${1:+"$@"}. Мені відомо ${parameter:+word}синтаксис ("Використовувати альтернативне значення"), зафіксований у bash (1). Однак я непереконаний, бо
І те,
${1+"$@"}і інше"$@"працює добре, навіть коли немає параметрів. Якщо я створю просто.sh як#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "$@"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);і question.sh як
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"$@"}' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);Я можу змусити обох працювати однаково:
$ ./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 = [ '' ];Інші джерела в Інтернеті також використовують
${1+"$@"}, включаючи одного хакера, який, здається, знає, що робить.
Можливо ${parameter+word}, це недокументований альтернативний (або застарілий) синтаксис для ${parameter:+word}? Чи може хтось підтвердити цю гіпотезу?