POSIXがすべてのuniceの中で共通の標準に最も近いものであることを考えると、それを独占的にサポートするシェルがあるかどうか知りたいです。最近のほとんどのシェルはPOSIXをサポートしています(POSIX準拠のスクリプトを問題なく実行します)が、非準拠の機能を指摘することはできません。
非準拠の機能に対してエラーをスローするような方法で、POSIXおよびPOSIXのみを実装するシェルはありますか?
[〜#〜] edit [〜#〜]ポータブルシェルスクリプトを作成するための一般的なヒントを求めていないことを明確にしたいと思います。コメントで言及された関連する質問はすでにこれをカバーしていました。 bash
に--posix
オプションですが、それが、私が探しているものとは異なる一部の初期化動作にのみ影響を与えることを発見するだけです。
残念ながら、「ポータブル」は通常、シェルスクリプトの「POSIX準拠」よりも強力な要件です。つまり、POSIXシェルで実行するものを書くことはそれほど難しくはありませんが、実際のシェルで実行することは難しくなります。
まず、パッケージマネージャーにすべてのシェルをインストールすることから始めます。特に、debianのposh
はあなたが望んでいるように聞こえます(ポリシー準拠の通常のシェル)。 DebianのポリシーはPOSIXですが、いくつか例外があります(echo -n
指定、local
...)。
それを超えて、テストはさまざまなプラットフォームでいくつかのシェル(特に/ bin/sh)をカバーする必要があります。 Solaris(/ bin/shおよびxpg4/sh)とBSDでテストします。 AIXおよびHP-UXは非常に準拠しており、問題を引き起こしません。 bashは独自の小さな世界です。
ポータブルシェルのAutoconfガイド をお勧めします。これは非常に優れており、多くの時間を節約できます。その大部分は時代遅れですが、それで問題ありません。気にしない場合は、TruUnixとUltrixをスキップしてください。
シェルスクリプトのリンターとして ShellCheck(GitHub) を使用できます。 オンラインバージョン もあります。
POSIX互換性の問題(例 SC2039 )を検出するには、シェルスクリプトの Shebang行 が#!/bin/sh
である必要があります。 --Shell=sh
をshellcheck
に渡すこともできます。
例(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.
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準拠である場合に適しています。