Linuxで最も普遍的なスクリプト言語は?


24

私たちはLinuxシステム用のスクリプトを書いていますが、Linuxで現在最も一般的に使用されるスクリプト言語は何かという議論があります。Bash、SH、Posix?何?


3
私は推測しshます。
ブレンダー

ターゲットディストリビューションのリストはありますか?または、強制/望ましいディストリビューションを実行する必要がありますか?

4
「sh」?何「sh」?トムソンシェル?ボーンシェル?/bin/shシステムXまたはYにある bash、ksh、pdksh、ash、zsh ?POSIX sh仕様、SUSv3、SUSv4 sh仕様、LSB sh仕様?「sh」自体は何も意味しません。
ステファンシャゼラス

1
これがソフトウェアのビルドおよびインストールスクリプト用である場合は、システム間コンパイルの問題を解決しようとするAutotoolsをチェックアウトすることをお勧めします。
ライライアン

1
@sch最もポータブルな共通交差点、「明らかに」。Unixシェルになじみのない人があなたのコメントに惑わされる場合、POSIX仕様は、名前shで行く勇気のあるほぼすべての現代のシェルと、sh今日では古くて珍しい不適合(たとえばBourne)によって実装されています。拡張とバリエーションのリストはどんどん増えていきますが、目標が「ユニバーサル」または移植性であれば、反対の方向に進むべきです。ジルの答えは、詳細をより深くカバーしています。
jw013

回答:


38

Unixライクなすべてのオペレーティングシステムで利用可能な2つのプログラミング環境は、チューリング完全であり、他のプログラムを呼び出すことができます:awkおよびsh、Bourne / POSIXシェルファミリー。AWKはテキスト処理に特化しており(より特殊なユーティリティを補完します)、shはプログラムをまとめるためのグルー言語になることを指向しています。Shは LinuxおよびUNIXの世界で使用されている汎用スクリプト言語です。

POSIX SH自体の標準定義必須の機能と関連するユーティリティ。ほとんどのUnixライクなシステムは、POSIX 1003.1-2004(別名、Single Unix v3、別名Open Group Base Specification issue 6)に準拠しています。その標準の最新バージョンはPOSIX 1003.1-2008(別名Single Unix v4、別名Open Group Base Specification Issue 7)です。

すべてのLinux、unix、またはUnixライクなシステムには、パス/bin/shにBourneスタイルのシェルがあり、アンティークではないシステムにはPOSIX準拠のシェルがあります(バグはありません)。最新のUnixライクなシステム(Linuxを含む)はすべてshebangsをサポートしているため/bin/sh、最初の行がの場合、スクリプトを自動的に実行します#!/bin/shsh別の場所にあるPOSIXシステムがあります(通常、実際にはUnixのようなものとは思わないOSのエミュレーション層)。

組み込みLinuxシステムには、すべてのPOSIX機能を実装していない簡略化されたBusyBoxシステムがある場合があります。BusyBoxには、フットプリントの小さなシステムに対応するためのコンパイル時オプションが多数用意されているため、事前に何を期待するかを知ることは難しく、特定のデバイスに合わせてスクリプトを調整する必要があります。BusyBoxは、shおよび各種ユーティリティの最も一般的なフットプリントの小さい実装です。もう1つ遭遇する可能性があるのは、Androidのシェル環境が非常に少ないことです(後のバージョンはそれほど貧弱ではありません)。

非組み込みLinuxシステムには、ほぼ常にダッシュまたはbashがあり/bin/shます。Dashは小さくて高速なシェルであり、POSIX機能を実装するだけです。Bashは、より多くの機能を備えた大きなシェルです。

非組み込みLinuxシステムには、ほとんどの場合Bashがとしてインストールされてい/bin/bashます。したがって、非組み込みLinuxシステムでの移植性のために、bashが使用可能であると想定できます。bashの便利な追加機能には、配列、ドットファイルを簡単に処理する機能pipestatus、パイプライン内のすべてのコマンドの戻り状態を取得する変数、ファイル時間の追加比較演算子、および(最近のバージョンでは)正規表現一致があります。

シェルプログラミングの特徴の1つは、プログラムを使用しているだけでなくsh、多くのユーティリティも使用していることです。Linux上のファイル操作およびテキスト処理ユーティリティのほとんどはGNU coreutilsです(組み込みシステムでは、通常BusyBoxからです)。

Linux以外の移植性が必要な場合、最善の策はPOSIXに固執することです。他のUNIXバリアントにはbashがインストールされていない可能性があります(bashはOSXの標準インストールの一部ですが、* BSDおよびほとんどの商用ユニックスのオプションパッケージです)。LinuxおよびOSX以外のほぼすべてのUNIXバリアント(* BSDおよび商用ユニックス)には、少なくともpdkshのKornシェルのバージョンがあります。bashの便利な拡張機能の多くはkshからのものであるため、両方で実行できるスクリプトを作成すると便利ですが、不明なシステム上でbashまたはkshがどこにあるかを検出するのは少し面倒です。

シェルはすべてを行うことはできません。より洗練された言語が必要な場合、2つのより一般的な選択肢はPerlとPythonです(他のすべてはUNIXスクリプト言語としてはるかに遅れています)。Perlは従来のスクリプト言語であり、組み込みLinuxシステムに組み込まれていないものはほとんどありませんが、Pythonが台頭しつつあります(Ubuntuに推奨されるスクリプト言語になったこともあります)。Linux以外の世界では、PerlはOSXおよびOpenBSDの基本インストールの一部です。これはオプションですが、非常に一般的にFreeBSDにインストールされ、オプションですが、NetBSDにインストールされることがよくあります。


1
「一部は...によって強化された」それは、FedoraおよびRHELシステムでは必須ですが、すべて必要です。
イグナシオバスケス-アブラムス

ほとんどすべてにこれに同意します。いくつかの異なる強調点:*一部のディストリビューションはBusyBoxベースですが、必ずしも埋め込まれているわけではありません(私はAlpineを使用しています)。(確かに、答え「ほぼ常に」と言います。)* BSDは、デフォルトでbashを想定できないUnixライクなシステムの大きなクラスです。* dashは、bashでできることのほとんどすべてを実行できますが、注意が必要な場合があります。*より洗練された言語が必要な場合、はい、PerlとPythonが最も一般的な選択肢ですが、awkはさらにユビキタスであり、多くの目的に適しています。また、一般的に過小評価されています。しかし、PerlやPythonよりも軽量です。
-dubiousjim

2
しかし、公正な警告-FreeBSDはPerlをしばらく前にデフォルトのインストールから削除しました。それ以外は、基本インストールにPerlがない他のディストリビューションは知りません。
TC1

@ TC1 Perlは、NetBSDでは常にオプションでした。OpenBSDのベースシステムにあります。
ジル 'SO-悪であるのをやめる

@dubiousjimデフォルトのインストールでは、Linux(埋め込みではないか、実際には十分な近似値)およびOSXのみがbashを使用しています。* BSDにはpdkshまたはmkshがあり、市販の大学にはATT kshがあります。
ジル「SO-悪であるのをやめる」

11

在庫状況:

  1. sh、しかしPOSIX指定の施設に固執します。
  2. bashですが、シバンで明示的に指定することを忘れないでください。そうしないと、代わりにダッシュが表示される場合があります。
  3. Python。ほとんどの人がそれを使用します。
  4. Perl。しかし、あなたはそれを書きます。

その後、あなたはそれらだけではできないことはあまりないので、誰も本当に気にしません。


10
pythonの前にPERLを置きます。ほとんどのLinuxシステムにはデフォルトでインストールされています。
テルドン

4
Perlは3番目です。そして、あなたはそれを書くことができます、ボーナス!:)
ウォーレンヤング

2
@ignacio perlが#4でpythonが#3であることに同意します。その理由は明らかです。Pythonはperlの進化だと思います。
バガヴァダー

5
@ashwin:いいえ、pythonはperlの進化ではなく、perlのようなものでもありません。perlは、sysadmins用のsysadminsによる言語です。pythonはプログラマーのためのプログラマーによる言語です。その違いは重要です。どちらにも用途があり、ユースケースには多くの重複がある場合がありますが、一部のタスクではperlがより適切な選択肢であり、他のタスクではpythonが明らかに優れています。
cas

1
RubyとPHPはPerlに触発されました。Pythonは、スーパーコライダーで反Perlを作成した物理実験の結果です。(Pythonには何もありません。プラスとマイナス、プラスとマイナス。)
ウォーレンヤング

4

通常はsh... と言いますが、あなたがLinuxを指定したので、私は言うでしょうbash-それは周りのすべてのLinuxシステム上にあることが保証されます(まあ、ミニマリズムをフェチ化する、あいまいでつまらない小さなものを除きます:)。

Linux以外の移植性を気にする必要がない場合(また、小さなディストリビューションやプラスチックボックスルーターなどの組み込みLinuxデバイスで実行する必要がない場合)、次の重要な拡張機能を利用することもできます。それは平野より提供しますsh。それ以外の場合はを使用しますsh

bash(およびsh)の後、Linuxの次に最も「普遍的な」スクリプト言語は、いくつかの方言になりますawk-通常はmawkまたはgawkです。単純なawkに固執し、gawkismsを回避する場合、ほとんどすべてのLinuxシステムでスクリプトが正常に実行されるはずです(小さなディストリビューションや組み込みデバイスでは欠落している可能性があります)。ほとんどのLinuxシステムでは、両方持つことになりますmawkgawk利用できるのが、いくつかのディストリビューション(例えばDebianの、)にmawkデフォルトでインストールされ、あなたがインストールする必要がありgawk、あなたがそれをしたい場合は、自分自身を。

次はperl。基本的なperl言語であるAFAIKは、すべての一般的なLinuxディストリビューションにデフォルトでインストールされるため、適切な選択になります。さらに幸運なことに、perl5リリースとのバージョンの非互換性はほとんどありません(perl 5.12または5.14がついに約15年間廃止されていたいくつかのあいまいな機能を削除することになりました...あなたのコーディングスタイルが本当に奇妙で、10年以上の「それをしないでください」という警告を無視したくない限り、perlスクリプトはほぼどこでもうまく動作します。言語は、堅牢で強力ですし、すべて行うことができますawkし、sedより行うことができます。少しの努力でそれができることsh伝統的にも適しています(外部コマンドの実行や出力の使用/パイピングなど)。標準のperlライブラリも非常に包括的なもので、基本的なものだけではありません。

perlの唯一の難点は、考えられることなら何でも(そして、あなたには決して起こらないことはもっとたくさんあります)、CPANモジュールの膨大なライブラリーがあることです-そして、すべてのシステムがperlで利用できるわけではありません。それらは通常非常に高品質であるため、それらを使用するだけの習慣を身に付けるのは簡単です-しかし、それらを使用する場合は、それらがインストールされていることを確認する必要があります。多くのCPANモジュールはLinux用にあらかじめパッケージ化されており、残りはcpanツールで簡単にインストールできます(またはdh-make-perldebian / ubuntu / etcにインストールしてCPANモジュールを.debパッケージに変換します)

python次のことを言いたいのですが、本当にできません。pythonには多くの点がありますが、多くのLinuxシステムにはデフォルトで含まれておらず、率直に言って、バージョンの互換性(python自体とその「標準」ライブラリの両方)は完全な修羅場です。混乱を整理するのに素晴らしい努力をするディストリビューションとそうでないディストリビューションがあります。pythonは基本的にプログラマ(システム管理者ではなく)によってプログラマ向けに書かれた言語であり、彼らのコードがインストールされるシステムは重要であるとは思わないようです。...彼らのコード非常に特別なので、既存のシステムへの統合のような退屈なことに気を使う必要はありません。

(ここで私の皮肉から間違ったアイデアを取得しないでください-私は言語としてPythonが本当に好きです、バージョンと依存関係の管理がPITAであるという事実が嫌いです。独自の* nixで何かをコンパイルして実行するためのコードとパッチ


私は、これは古い記事ですけど、これを回避する最良の方法は、(例えばシェバングでどのバージョンを指定することで/usr/bin/python2/usr/bin/python3)。
イサイアメドウズ14年

1

ksh93またはPOSIXフレーバーに従うことをお勧めします。いつでもbash / zshを使用して実行できます。

Debianベースのディストリビューションは、デフォルトのawkとしてgawkではなくmawkを使用します。そのため、mawkははるかに高速であるため、gawkの追加は避けてください。


0

バッシュではありません。ダッシュまたはアッシュのようなPOSIXに近いshに書き込みます。それは最も普遍的なものになるでしょう。近い競争相手であるものは他にないと思います。(そして、これは私にとって事実的な質問のようであり、コメンテーターの一人が不平を言う「意見」ではないようです。

shよりも少し強力なものが必要な場合(たとえば、実際の連想配列が必要な場合)、awkを使用します。(gawk拡張の回避。awkには多くのバージョンがありますが、大部分は共有コアです。)shとほぼ同じくらい広く利用できるはずです。


1
awk-on-Linuxは一般的にgawkです。デフォルトで別のバリアントを持つディストリビューションは考えられません。
イグナシオバスケス-エイブラムス

5
Linuxのどのバリアントがサポートしていませんbashか?
ジョナサンレフラー

1
確かbashに(ほぼ)任意のLinuxボックスにインストールして実行できますが、多くのdebianユーザーはインストールのみをdash行い、インストールを好みませんbash
ウィリアムパーセル

6
@WilliamPursell bashパッケージには、DebianでEssentialというタグが付けられています(つまり、アンインストールするにはフープを実行する必要がありますが、システムに負荷がかかるという十分な警告が表示されます)。Bashは、非組み込みLinuxシステムでほぼ普遍的です。
ジル 'SO-悪であるのをやめる

1
@JonathanLeffler:逆に埋め込みのものにはBusyboxしかありません。
機械式カタツムリ

0

可用性は次の順序でランク付けされると思います。

  1. sh
  2. awk
  3. Perl(BSDを含む* nixがまだない)

Pythonは良い言語のように聞こえますが、基本インストールでPythonに付属するOSを使用したことはありませんが、Ubuntuで使用されているようです。


0

ここの専門家は、あなたが決めるのに役立つ素晴らしい提案をすでに提供していると思います。さまざまなシェルの使いやすさと可用性については、他の投稿で詳しく説明されています。

別の注意として、私があなただったら、スクリプトで達成したい目標も検討します。すべてのツールには、独自のメリットとデメリットがあります。したがって、私は主にPythonを使用していますが、すべての場合にそれを使用するわけではありません。

いくつかのシナリオを考えて、それらに役立ついくつかのツールに言及することができます。

FTPファイルの往復; それらを処理します。電子メール通知を送信します。等々

この場合、それはシェル(例えば、バッシュ)に固執し、さまざまなユーティリティを使用する方が良いでしょう(たとえば、ftpcronおよびmail)。これは多くの大企業での典型的な使用例です。

クイックテキスト処理

もう一度、シェル。などのユーティリティはgrepawksedpasteなどが、この場合に非常に便利です。

構築する

C / C ++ドメインでは、このための汎用ツールはmakeです。Javaの世界ではApache ANTが好まれます。

展開とリモート制御

シェルまたはPython。たとえば、scpおよびrsyncはそれぞれ、ファイルのコピーまたはファイルの同期に非常に役立ちます。

一方、Pythonにはという非常に便利なモジュールがありfabricます。これは、ファイルのコピー、プロセスの停止、サーバーの起動など、より複雑な操作に役立ちます。さらに、Pythonはモジュールを提供します。pipこれは、関連するパッケージをダウンロードしてインストールすることにより、指定された依存関係を解決できます。

(上記の提案はシェル機能にあまり焦点を当てておらず、利用可能なさまざまなユーティリティに焦点を当てていることに注意してください。)


-1

PerlはFreeBSD、NetBSD、またはDragonflyBSDベースではありません。ごめんなさい。OpenBSDの基本インストールにはPerlがあります。OS Xは現在、UNIXの認定を受けており、何らかのレベルでBSDの一種と考えられており、Perl、Python、Rubyをベースにしています。

多くのプロプライエタリなUNIXは、例えばSolaris、HP-UXもIBM AIXも知らないなど、ベースにPerlがありません...


SolarisでPerlが欠落しているという記述は誤りです。Perlは、少なくとも2005(Solaris 10)以降、Solarisの必須のコアコンポーネントです。
-jlliagre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.