💻

POSIX標準を理解する

に公開

POSIXとはなにか

POSIX(Portable Operating System Interface)

Unix系OSやUnixライクな環境でソフトウェアやスクリプトを互換性を持って動作させるための一連の規格のことをいいます。

IEEEやThe Open Group, ISO/IECの関係団体が策定をを狙っており、OSのシステムコールやユーティリティ、シェル言語など、多岐にわたる機能の使用を定めています。最新では、POSIX.1-2024がリリースされており、この中には、コマンドインタプリタの動作や標準的なコマンド群の動きなどが公式に定義されています。

シェルとPOSIXの関係

POSIXの仕様の中で、シェル言語は「シェルがどのように動くか/どういう構文を持つか/どのようなコマンドウ操作が求められるか」を規定しています。

  • スクリプトの起動方法
  • 入力の解釈順序
  • 変数展開/コマンド置換
  • ワイルドカード展開
  • 入出力のリダイレクト
  • 条件分岐やループ
  • サブシェルの作成

などの基本的な操作が定義されます。POSIX準拠のShellはこれらの機能を備えており、仕様に忠実であることが互換性をもたせる鍵となります。

POSIX準拠であることののメリットと注意点

POSIX準拠でスクリプトを書く最大の利点は、「異なるUnix系OSやLinuxディストリビューションで同じスクリプトが動く可能性が高くなる」ことです。
例えば、あるLinux環境で書いたshスクリプトがmacOSでも、BSD系でもでも動きやすくなります。

ただし。POSIX標準がすべてのShell機能を規定しているわけではありません。
bashやzshが持つ拡張機能,補完機能,配列処理,文字列操作はPOSIXに含まれないものがあります。

そういった機能を多用しすぎるとPOSIXのみを前提とした環境でエラーや非互換が発生するリスクになります。

POSIX準拠スクリプトをを書く際の注意点

  • スクリプトの先頭でシェバンを/bin/shとする
    →このインタープリタがPOSIX準拠であることを前提にすることができる
  • 条件式に[条件]を用い、[[...]]のようなbash専用構文を避ける
  • ループや制御構造(for, while, if, case等)はPOSIXが定める標準のものを使う。
  • コマンド置換は$(command) 形式を使う。バッククォート`...`も使えるが、互換性の観点から$(...)が推奨される。
  • ワイルドカード展開,リダイレクト,パイプ,環境変数展開の挙動,クォート処理("と'の違い)を正しく理解する

Discussion