web-dev-qa-db-ja.com

シェルスクリプトのPOSIX準拠をテストするにはどうすればよいですか?

POSIXがすべてのuniceの中で共通の標準に最も近いものであることを考えると、それを独占的にサポートするシェルがあるかどうか知りたいです。最近のほとんどのシェルはPOSIXをサポートしています(POSIX準拠のスクリプトを問題なく実行します)が、非準拠の機能を指摘することはできません。

非準拠の機能に対してエラーをスローするような方法で、POSIXおよびPOSIXのみを実装するシェルはありますか?

[〜#〜] edit [〜#〜]ポータブルシェルスクリプトを作成するための一般的なヒントを求めていないことを明確にしたいと思います。コメントで言及された関連する質問はすでにこれをカバーしていました。 bash--posixオプションですが、それが、私が探しているものとは異なる一部の初期化動作にのみ影響を与えることを発見するだけです。

78
rahmu

残念ながら、「ポータブル」は通常、シェルスクリプトの「POSIX準拠」よりも強力な要件です。つまり、POSIXシェルで実行するものを書くことはそれほど難しくはありませんが、実際のシェルで実行することは難しくなります。

まず、パッケージマネージャーにすべてのシェルをインストールすることから始めます。特に、debianのposhはあなたが望んでいるように聞こえます(ポリシー準拠の通常のシェル)。 DebianのポリシーはPOSIXですが、いくつか例外があります(echo -n指定、local...)。

それを超えて、テストはさまざまなプラットフォームでいくつかのシェル(特に/ bin/sh)をカバーする必要があります。 Solaris(/ bin/shおよびxpg4/sh)とBSDでテストします。 AIXおよびHP-UXは非常に準拠しており、問題を引き起こしません。 bashは独自の小さな世界です。

ポータブルシェルのAutoconfガイド をお勧めします。これは非常に優れており、多くの時間を節約できます。その大部分は時代遅れですが、それで問題ありません。気にしない場合は、TruUnixとUltrixをスキップしてください。

38
Nicholas Wilson

シェルスクリプトのリンターとして ShellCheck(GitHub) を使用できます。 オンラインバージョン もあります。

POSIX互換性の問題(例 SC2039 )を検出するには、シェルスクリプトの Shebang行#!/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.
33
johnLate

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準拠である場合に適しています。

12