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


72

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

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

編集ポータブルシェルスクリプトを書くための一般的なヒントを求めていないことを明確にしたい。コメントで言及された関連する質問は、すでにこれをカバーしています。この質問にbashは、--posixオプションがありますが、それが一部の初期化動作にしか影響しないことを発見したとき、私が探しているものではないことがわかりました。



@Gilles:この質問に出くわしたことを言及すべきかもしれませんが、でのテストを提案した回答は1つだけdashです。私は質問の一般的な文脈として移植性に言及しましたが、それは本当の意図ではありませんでした。
ラーム

確かに、これら2つの質問は同じ人々の興味を引く可能性が高いため、これらの質問をリンクしたかったのです。それらは決して複製ではありません。ちなみに、poshはダッシュよりもPO​​SIX準拠のテストとして優れています。
ジル

2
busyboxはPOSIXとPOSIXのみに非常に近いです。つまずく可能性があるのは、他のパッケージ(diffutilsなど)もインストールすると、機能が追加される可能性があることです。alpine linuxのlivecdをチェックしてください。Alpineはmusl Cライブラリを使用しているため、拡張正規表現などの機能を追加できるGNU拡張機能を取得できません。
マイケルフォックス

回答:


37

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

パッケージマネージャーにすべてのシェルをインストールすることから始めることができます。特に、Debianのposhサウンドはお望みのものです(ポリシー準拠の通常のシェル)。DebianのポリシーはPOSIXであり、いくつかの例外があります(echo -n指定、local...)。

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

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


posh実際に私が求めているもののように聞こえます。できるだけ早くいくつかのテストを行います。
ラーム

1
関連する質問を見つける前に答えました!poshはdebianのものなので、すべてのシステムにパッケージ化されるわけではありません。また、シェルは必ずしも最も心配するものではありません。たとえば、sedの非互換性は大きな問題です。
ニコラスウィルソン

Solaris / bin / sh別名Bourne shell(POSIXではありません)への移植は気にしません。すべての現代のUnixなどのSolarisのはそれだけで通常の場所(は/ usr / XPG4 / binに/ SH)であることをないたまたま、POSIXシェルを持っている
ステファンChazelas

残念ながら、少なくともすべての/ bin / shで実行する必要があるスクリプトを出荷しています。それほど悪くはありませんが...私はむしろそれをする必要はありません。
ニコラスウィルソン

2
/ bin / shを重要なものとして扱う理由は、非常に多くのスクリプトでシバンから呼び出されるためです。「/ usr / bin / env sh」はほとんど改善されていません。POSIX以外のシェルで何かを動作させることに努力するなら、各システムの/ bin / shに優先順位を付けてもよいと思います。一部の顧客がデフォルトのシェルでスクリプトを実行するのはそう長くはかからないでしょう。
ニコラスウィルソン

28

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.

1
これらすべての年、私はShellCheckのことを聞いたことがありません...リンクをありがとう!
トンヴァンデンヒューベル

史上最高のツール!特に、オンライン版を持っていると、コードの一部をすばやくチェックすることができます。
メッキー

12

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準拠である場合、これは良い出発点です。


21
POSIXモードでも、bashはのようなPOSIX以外の機能を許可し[[ます。
ヨルダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.