POSIX準拠のためにシェルスクリプトをテストする方法は?

POSIX準拠のためにシェルスクリプトをテストする方法は?

POSIXがすべてのユニックスの普遍的な標準に最も近いものであることを考えると、それをサポートする専用シェルがあるかどうかを知りたいです。ほとんどの最新のシェルはPOSIXのサポートを提供し(問題なくPOSIX互換スクリプトを実行できます)、互換性のない機能を正しく指摘していません。

互換性のない機能に対してエラーが発生するようにPOSIXとPOSIXのみを実装するシェルはありますか?

編集する私は移植可能なシェルスクリプトを書くための一般的なヒントを必要としないことを明らかにしたいと思います。コメントに記載されている関連質問はすでにこの内容をカバーしています。私はオプションbashがあることを知ったときにこの問題を思い出しましたが、--posixそれがまさに私が望むものではなく、いくつかの初期化動作にのみ影響することに気づきました。

答え1

あなたはそれを使用することができますシェルチェック(GitHub)シェルスクリプト用のリンターとして使用されます。まだ一つあります。オンライン版

POSIX互換性の問題の検出(例:SC2039)、これシェルボーンラインシェルスクリプトは#!/bin/sh--shell=shshellcheck

はい( test.sh):

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

結果( shellcheck test.sh):

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.    

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.

答え2

残念ながら、シェルスクリプトの場合、「移植可能」は通常「POSIX互換」よりも厳しい要件です。言い換えれば、POSIXシェルで実行されるものを書くことはそれほど難しくありませんが、実際のシェルで実行できるようにすることはより困難です。

パッケージマネージャにすべてのシェル、特にposh必要に応じて聞こえるDebianシェル(ポリシーに準拠した一般的なSHell)をインストールすることから始めることができます。 DebianのポリシーはPOSIXであり、いくつかの例外があります(echo -n指定されている、local...)。

これに加えて、テストではさまざまなプラットフォームの一部のシェル(特に/ bin / sh)を扱う必要があります。私はSolaris(/ bin / shとxpg4 / sh)とBSDでテストしています。 AIXとHP-UXは互換性が非常に高く、問題を引き起こしません。 bashには独自の小さな世界があります。

おすすめしたいAutoconfポータブルシェルガイド、本当に素晴らしいと多くの時間を節約します。多くの部分は使用されなくなりましたが、大丈夫です。気にしない場合は、TruUnixやUltrixなどをスキップしてください!

答え3

POSIXLY_CORRECT環境変数が設定されると、Bash は POSIX 互換モードで実行されます。マンページから:

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

他の多くのGNUユーティリティもPOSIXLY_CORRECTこれを尊重するので、主にGNUツールであるシステム(例えば、ほとんどのLinuxシステム)を使用し、目標がPOSIX準拠である場合、これは良いスタートです。

答え4

互換性のない機能に対してエラーが発生するようにPOSIXとPOSIXのみを実装するシェルはありますか?

スプリントここで要件を満たしてください。

/bin/shDASHは、できるだけ小さいものを目指すPOSIX準拠の実装です。できるだけ速度を犠牲にすることなくこれを行います。実際、ほとんどの作業ではbash(GNU Bourne-Again SHell)よりはるかに高速です。

シェルスクリプトを作成するときは、次の点に従う必要があります。POSIX シェルコマンド言語、スクリプトをテストするときにDashをソルバーとして使用しました。なぜなら、DashはPOSIXシェル機能のみを実装し、Bashism(配列変数やプロセス置換など)が見つかるとエラーが発生するからです。

/bin/shDashは、DebianベースのシステムのAlmquistシェル(したがってDebian Almquistシェルという名前)のポートです/bin/dash。詳細についてはをご覧ください。アルムキストの殻 - Wikipedia

関連情報