У документації на 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}
? Чи може хтось підтвердити цю гіпотезу?