ポータブルスクリプトを記述することが重要なのはいつですか?


18

私が書くコードのほとんどはPHPにあります。最近、シェルスクリプトの学習を始めました。私が出会ったほとんどのリソースとチュートリアルは、Bashに固有のものです。バシズムについて警告する人もいれば、警告しない人もいます。私はこことStack Overflowについてたくさん読んでいます。

答えがbashismsを使用するときは常に、誰かが次のようにコメントすることは避けられません。

<bashismをここに挿入>は使用しないでください。ポータブルではありません。

これは、質問にがタグ付けされている場合でも発生しbashます。私にとって、それはPHP 4で使用できないため、PHP 5の新しいコードを使用すべきではないことをPHPプログラマーに伝えるようなものです。 Windowsで。

PHPで作成する場合、最小要件を選択し、前方互換コードを作成ます。下位互換について心配する必要はありません。

#!/bin/bashシバンとして使用する場合、なぜバシズムを使用してはいけないのですか?私は、一部の人々がちょうどそれのためにバシズムをバッシングすること(意図されたしゃれ)を好むという印象を受け始めています。

多くの場合bashshellbashは多くのシステムでデフォルトのシェルであるという事実により、人々は頻繁に使用し、交換可能です。したがって、コードがバシズムを使用していることを警告するコメントを追加することは理解できますが、それらを使用することは間違っているという意味を理解していません。

明らかに、私が個人的に使用するためだけにスクリプトを書いている場合、私は好きな言語でそれを書くことができます。しかし、私が書いたコードの一部は他の人にとっても役立つと思いたいです。

投稿する前に質問の答えを探してみました。移植性をテストする方法に関する多くの情報を見つけましたが、そうすることが重要な場合については何も見つかりませんでした。

それで、いつ移植可能なスクリプトを書くことが重要ですか?

例えば、

  • どんな種類のスクリプトを可能な限り移植可能にするべきですか?
  • Bashがインストールされていないシステムはどのくらい一般的ですか?
  • システムにBashがインストールされている場合、GNUバージョンのfindおよびその他のユーティリティもありますか?

4
私はこの質問に賛成し、答えましたが、それについて考えるほど、最後の2つの質問だけがサイトに適合します。その他は「主に意見に基づく」。
ヨルダン

1
この質問にはメタの側面もあります。最初の質問への回答には役に立たないかもしれませんが、「これは移植性がありません」などのコメントは、数か月または数年後に質問/回答に出くわす他の読者にとって非常に役立ちます。
バナンイン

2
@Bananguin「これは移植性がない」というコメントは私を悩ませません。それは単なる参考です。私はこの種のコメントを自分で作成しました。私を悩ませているのは、「使用すべきではない...」です。答えに何か問題があることを意味します。たとえば、非推奨コードを推奨する回答があった場合、それは有効です。だから、Bashの何が問題なのだろうと思いました。
トキサロット

2
+1。特に質問にbashタグだけがある場合、誰かが「それはバシズムであり、移植性がない」とコメントします。タグ付けされた質問に答えるときC、それが移植可能かどうかは気にしませJavaん。
PP

4
bashGNU固有の拡張機能が何らかのユーティリティに使用されていることを指摘するように(質問がLinuxとしてタグ付けされていたとしても)、それが特定の機能であり、移植性がないことを常に指摘するのは良いことだと思います。「これはバシズムであり、決して使用すべきではない」と言う人を見たことはありません。
マーティントゥルノイ

回答:


15

このコミュニティのメンバーとして、bashをターゲットとするものについてbashismを無視する人はあまりいません。移植性について話すとき、GNUismはbashismよりもはるかに悪いです。bashshebangに使用する限り、を使用してスクリプトが実行されることを期待できますbash。ただし、明示的に確認しない限り、バージョンを保証することはできません。Bashバージョン4は連想配列などの便利な機能をもたらしましたが、Bash v3は依然としてOS XおよびRHEL 5で広く使用されています。

どんな種類のスクリプトを可能な限り移植可能にするべきですか?

これは、あなたのニーズと、開発者としてサポートすることを選択することについての詳細です。すべてのタイプの* NIXをサポートするアプリケーションのインストールスクリプトを記述する場合、移植性が非常に重要になります。

Bashがインストールされていないシステムはどのくらい一般的ですか?

FreeBSDとSolaris 10は、デフォルトでbashがインストールされていないシステムの例です。組み込みシステムを除き、ほとんどのLinuxシステムに搭載されています。

システムにBashがインストールされている場合、GNUバージョンのfindおよびその他のユーティリティもありますか?

いいえ、これは移植性の本当の問題です。移植性が重要な場合は、POSIX標準で定義されているシェルコマンド機能のみを使用する必要があります。GNUユーティリティは、FreeBSDなどの非GNUシステムにインストールできますが、PATHの最初にある可能性は低いため、インストールするツールに依存することはできません。


1
人々がバシズムを無視しているのをよく目にするのは、ここよりもSOだと思います。私は、私を苛立たせ、この質問をするように促すのに十分な頻度で気づいたことを知っています。
トキサロット

1
では、GNUユーティリティがインストールされているが、PATHの最初ではない場合、それらを具体的に呼び出す方法はありますか?それ以外の場合、なぜそれらをインストールしたのですか?
トキサロット

@toxalot:バイナリとスクリプトは、絶対パスを使用して明示的に呼び出されます。
バナンイン

1
@Bananguinだから誰かがBashとGNUユーティリティを(PATHではなく)インストールした場合、スクリプトを編集して絶対パスを使用しfindたり、私が使用した他のGNU固有のユーティリティを使用したりできますか?明らかに、これはインストーラースクリプトにとってユーザーフレンドリーではありません。でも、GitHubに何かを置いて、他の人が欲しければそれをつかむことを考えています。すべてのシステムに移植できるわけではありません。多くのシステムで役に立たないようにしたいだけです。
トキサロット

1
@toxalot:はい、それはうまくいくでしょう。FIND=/opt/gnu/dispicable/bin/findスクリプトの先頭に次のようなものを置き、スクリプトの${FIND}代わりに使用する場合find、インストールパスを配置してスクリプトに正しいツールを使用させるための場所を1つ(!)与えます。
バナンイン

5

それで、いつ移植可能なスクリプトを書くことが重要ですか?

どんな種類のスクリプトを可能な限り移植可能にするべきですか?

作業環境でそれらを使用していて、異なるマシンで作業している(または将来可能性がある)場合-そして、作業を始める前にツールを書き直す必要はありません。

例:ゴミ箱スクリプト/ rm交換


マーク・スチュワート:

...トラブルシューティングツールキットでは、viとKornシェルのみを使用すると想定しています。そして、ほとんどの種類のUnixで機能するコマンドを使用しようとしています。


3
洗練された "Bash-isms"のいくつかは好きですが、トラブルシューティングツールキットでは、viとKornシェルしかないと思います。そして、ほとんどの種類のUnixで動作するコマンドを使用しようとしています。そうすれば、psコマンドがどのように動作するか、Bash、Perl、またはPHPが存在するかどうか、またはそれらがどこにあるかを心配することなく、病気のシステムでトリアージを行う準備ができました。
マークスチュワート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.