シェルスクリプト: `set -u` と `$*`

シェルスクリプト: `set -u` と `$*`

シェルスクリプトの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ベクトル)を$*反映しているため、定義に従って存在状態がないため、その変数に影響を与えてはいけません。$@unsetset -u

以前は、より多くのシェルでこの種の問題が発生していましたが、${*:-}回避策はまれではありませんでした。

pdkshバグがあることが知られており、もはや自分のプロジェクトで積極的に維持されていないので、バグが修正されるとは思わないでください。

mksh(シェル)は、移植可能であり、したがって、多くのプラットフォームで利用可能な固定され、MirBSD積極的に維持されているバリアントです。pdkshThorsten Glaserはここで素晴らしい仕事をしました…

関連情報