Perlのドキュメントでは、perlrun(1)は、バイリンガルのシェル/Perlヘッダーを使用してPerlスクリプトを起動することを提案しています。
#!/bin/sh
#! -*-perl-*-
eval 'exec perl -x -wS $0 ${1+"[email protected]"}'
if 0;
${1+"[email protected]"}
とは 平均? "[email protected]"
を使ってみました 代わりに(Bashを/ bin / shとして使用)、同様に機能するようです。
編集
以下の2つの回答は、${1:+"[email protected]"}
であると想定されていることを示しています。 。 ${parameter:+word}
を知っています (「代替値を使用」)bash(1)に記載されている構文。しかし、私は確信が持てません。なぜなら
-
両方の
${1+"[email protected]"}
および"[email protected]"
パラメータがない場合でも、問題なく動作します。 simple.shを次のように作成した場合#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 "[email protected]"' if 0; #!perl use Data::Dumper; print Dumper(\@ARGV);
およびquestion.shas
#!/bin/sh eval 'exec /usr/bin/perl -x -S -- $0 ${1+"[email protected]"}' 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+"[email protected]"}
を使用しています 、彼が何をしているのかを知っているように見える1人のハッカーを含みます。
おそらく${parameter+word}
${parameter:+word}
の文書化されていない代替(または非推奨)構文です ?誰かがその仮説を確認できますか?
承認された回答:
これは、Bourneシェルとの互換性のためです。 Bourneシェルは、1979年にUnixバージョン7で最初にリリースされた古いシェルであり、90年代半ばまで/bin/sh
として一般的でした。 ほとんどの商用ユニスで。
これは、ほとんどのボーンのようなシェルの祖先です。 ksh
のように 、bash
またはzsh
。
いくつかの厄介な機能があり、その多くはksh
で修正されています。 およびその他のシェルとsh
の新しい標準仕様 、そのうちの1つはこれです:
Bourneシェル(少なくとも修正されていないバリアント)の場合:"[email protected]"
位置パラメータのリストが空の場合、1つの空の引数に展開されます($# == 0
)引数がまったくない代わりに。
${var+something}
$var
でない限り、「何か」に展開されます 設定されていません。すべてのシェルで明確に文書化されていますが、bash
で見つけるのは困難です この文に注意を払う必要があるため、ドキュメント:
以下に説明するフォームを使用してサブストリング拡張を実行しない場合、bashは未設定またはnullのパラメーターをテストします。 コロンを省略すると、設定されていないパラメータに対してのみテストが行われます 。
したがって、${1+"[email protected]"}
"[email protected]"
に展開されます $1
の場合のみ 設定されています($# > 0
)これは、Bourneシェルの制限を回避します。
Bourneシェルがその問題を抱えている唯一のシェルであることに注意してください。現代のsh
s(つまり、sh
sh
のPOSIX仕様に準拠 (Bourneシェルはそうではありません))その問題はありません。したがって、/bin/sh
の非常に古いシステムでコードを動作させる必要がある場合にのみ必要です。 標準シェルではなくBourneシェルである可能性があります(POSIXは標準のsh
の場所を指定しないことに注意してください 、たとえばSolaris 11より前のSolarisでは、/bin/sh
通常/標準のsh
である間、(その特定の問題はありませんでしたが)まだBourneシェルでした 別の場所にありました(/usr/xpg4/bin/sh
))。
そのperlrun
に問題があります その$0
のperldocページ ただし、引用されていません。
詳細については、http://www.in-ulm.de/~mascheck/various/bourne_args/を参照してください。