В документации по 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+"$@"}
и"$@"
работают просто отлично, даже когда нет параметров. Если я создаю simple.sh как#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "$@"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
и вопрос.ш как
#!/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}
? Может ли кто-нибудь подтвердить эту гипотезу?