シェルスクリプトの1つを使用しているときに驚くべき動作が見つかりました。次のコードスニペットを考えてみましょう。
set -u
output()
{
echo "$*"
}
output
私はbash、ksh93、mksh、zsh、dash、およびpdkshを使用してこのフラグメントをテストしました。 pdkshを除くすべてが期待どおりに機能します。
Pdkshが文句を言います*: parameter not set
。
まあ、pdkshは(ある程度)正しいです。パラメータoutput
がないため$*
設定されません。
$*
に置き換えてこの問題を解決しました${*:-}
。
- pdkshが正しいか、過度にトリッキーか、それとも間違っていますか?
- ソリューションは
${*:-}
動作しますか?
Schilysの回答に対するコメントのため、アップデートが開始されました。
- 私はFedora 31を使用しており、パッケージマネージャを介してインストールされていないどこかでpdkshを見つけました。
- pdkshバージョン
@(#)PD KSH v5.2.14 99/07/13.2
- かなり古いバージョン - 私のスクリプトの移植性のテスト中にpdkshを使用しました。
答え1
まず、現在の引数(argベクトル)を$*
反映しているため、定義に従って存在状態がないため、その変数に影響を与えてはいけません。$@
unset
set -u
以前は、より多くのシェルでこの種の問題が発生していましたが、${*:-}
回避策はまれではありませんでした。
pdksh
バグがあることが知られており、もはや自分のプロジェクトで積極的に維持されていないので、バグが修正されるとは思わないでください。
mksh
(シェル)は、移植可能であり、したがって、多くのプラットフォームで利用可能な固定され、MirBSD
積極的に維持されているバリアントです。pdksh
Thorsten Glaserはここで素晴らしい仕事をしました…