シングルまたはデュアルスタンドとポータブル

シングルまたはデュアルスタンドとポータブル

[ここで「if」ステートメント[[の違いに本当に良い答えを見つけました。特定の名前付きシェルの場合、[[overを使用するのは良いアイデアのようです[(さらに高速です)。

しかし、移植性についてはまだ不明です。私の目標がPOSIX準拠のシェル用のスクリプトを作成することである場合は、#!/bin/shこの構文の許容度を許可するスクリプトでスクリプトを起動します。私が知る限り、二重括弧はPOSIX規格にはありませんが、「実際の世界」ではこれがどれほど大きな問題ですか?

私の言葉は移植可能ですが、2000-2005年のすべての実行可能なPOSIXシェルで実行するのに十分なほど良いスクリプトが欲しいということです。これは、これが標準の一部ではないことを意味します。これは本当ですが、実際には2005年以降のすべてのシェルはほぼ確実にこの構文を受け入れます。

また、スクリプトの移植性とPOSIXに関するより一般的な質問があります。他の作者はこの問題にどのようにアクセスしますか?ユースケースとターゲット顧客がほとんどの決定を下すことを理解しています。しかし、インターネット全体で発生する可能性がある非互換性を減らすために、可能な限りPOSIXに近づけるように努力していますか、またはほとんどのシェルがまだサポートしていないすべての利点を活用していますか? POSIX規格の場合?

私はまず、ほとんどのスクリプトをBourneやPOSIXと互換性があるようにしようとします。しかし、時間が経つにつれて、より多くのBash文書を読んで、オンラインで他の人のスクリプトを見ながら、これらのアドインを活用すると、スクリプトを読みやすくし、多くの場合、より小さくなる可能性があると思います。

ベストアンサー1

私の目標がPOSIX互換シェル用のスクリプトを書くことであれば、#!/bin/shでスクリプトを起動します。[[この構文がどれほど許容できるかがわかります。

別の言葉。多くの最新のLinuxベースのシステムでは、dash基本的に/bin/shこれPOSIX互換これ以上ないので[[動作しません。ここでは最近のすべてダーバンそしてUbuntu分布とその派生物と他の多くの分布。歴史的には、これらのシステムはしばしばBashを代わりに使用し、パフォーマンスを向上させるために意図的に切り替えました。

ほとんどのBSDやほとんどの商用Uniceを含む他の多くのシステムはそれをサポートしておらず、[[決してサポートしません。shPOSIXのみをサポートするか、その拡張に構文は含まれていません[[オープンBSDshBashのバージョンとは少し異なるバージョンをサポートしていますが[[、他の人がこれを行うことはありません。それ以外の場合は、Bashを使用しているシステム/bin/sh(またはあまり頻繁に他のシステム)のみがスクリプトで宣言された操作をzsh実行できます。[[sh


一方、実際にはほとんどのシステムにはBashがインストールされており、bashすべてのシステムでスクリプトを明示的に実行するだけで十分です。とにかくBashのshエミュレーションモードは常に破損しています。

あなたはBashの機能に頼っているので、それをスクリプトとして宣言したい理由はまったくありませんsh。ただ話して#!/bin/bash完了します。[[必要に応じて実行するか、完全に除外することをお勧めします[。最大の移植性が必要な場合はを使用してください。[またはtestPOSIX sh1を使用して慎重に作成してください。

1 一部の商用 Unices には POSIX 以外の実装があったりありました。 Unicesが機能するには、POSIXシステムへのフルパスを使用してスクリプトを実行する必要があります。sh/bin/shsh

おすすめ記事