あなたの質問の1)のみをカバーしています。
当然のことながら、APIは作成者の意思で常に変更される可能性があり、したがって、どの言語の依存ソフトウェアも破損する可能性があります。そうは言っても、UnixツールのI / O "API" の素晴らしいアイデアは、実際には何もない(おそらく0x0a
行末として)ということです。優れたスクリプトは、データを作成する代わりにUnixツールでフィルタリングします。つまり、入力または出力の仕様が変更されたためにスクリプトが破損する可能性がありますが、スクリプトで使用される個々のツールのI / O形式(実際には1つではない)が変更されたためではありません(実際には存在しないため)本当に変えることはできません)。
基本的なツールのリストに目を通すと、フィルターだけではなく、producerの属性もあります。
- wc-バイト数、ワード数、行数を出力します- 非常に単純な形式であり、変更される可能性はまったくなく、さらにスクリプトで使用される可能性も非常に低いです。
- diff-さまざまな出力形式が進化していますが、問題は聞いていません。また、監督なしでは通常使用されません。
- 日付 -今ここに私たちは本当に、特にシステムのロケールについて、私たちが生産何世話をする必要があります。ただし、それ以外の場合は、出力形式を自分で正確に指定しないと、RFCに準拠します。
- cal-それについては話さずに、出力フォーマットがシステム間で大きく異なることを知っています。
- ls、who、w、last -lsを解析したいのなら仕方がありません。意図したものではありません。また、最後に、誰がよりインタラクティブなリスターです。スクリプトでそれらを使用する場合は、何をするかに注意する必要があります。
- 別の投稿で時間が指摘されました。しかし、ええ、それはlsと同じです。インタラクティブ/ローカルでの使用向け。また、bashビルトインはGNUバージョンとは大きく異なり、GNUバージョンには長年修正されていないバグがあります。それに頼らないでください。
バイトストリームであるよりも特定の入力形式を期待するツールは次のとおりです。
- bc、dc-電卓。すでによりハック的な側面で(実際、スクリプトでは使用していません)、おそらく非常に安定したI / O形式です。
破損のリスクがはるかに高い別の領域、つまりコマンドラインインターフェイスがあります。ほとんどのツールには、システム間およびタイムライン全体で異なる機能があります。例は
- 正規表現を使用するすべてのツール -正規表現は、システムロケール(LC_COLLATEなど)に基づいて意味を変更でき、正規表現の実装には多くの微妙さと特徴があります。
- 派手なスイッチを使用しないでください。
man 1p find
たとえば、システムのマンページの代わりにPOSIX検索のマンページを読むために簡単に使用できます。私のシステムには、manpages-posixがインストールされている必要があります。
そして、そのようなスイッチを使用していても、通常は微妙にエラーが発生することはなく、データを汚染します。ほとんどのプログラムは、未知のスイッチでの動作を単に拒否します。
結論として、シェルは実際には最も移植性の高い言語の1つになる可能性があると言えます(移植性のあるスクリプトを作成すると、シェルは移植可能になります)。微妙なエラーが発生するお気に入りのスクリプト言語、またはコンパイルを放棄するお気に入りのコンパイル済みプログラムと比較してください。
さらに、非互換性のために破損が発生する可能性のあるまれな場所では、おそらく誘導された時間ではなく、異なるシステム全体の多様性のためです(つまり、あなたのために働くなら、それは20年前と20年後にそうなりました) 、も)。これは、ツールのシンプルさの結果です。