GNU/Linux >> Linux の 問題 >  >> Linux

いつ Bash を使用し、いつ Perl/Python/Ruby を使用するか?

TL;DR - bash のみを使用 より良い言語をインストールするために (まだ利用可能でない場合)、そうしないと、取り返しのつかない貴重な人間の時間を浪費することになります。コマンドラインで間違いなく手動で実行できない場合は、bash/shell でスクリプトを作成しないでください。

2015 年なので、次のことを検討します。

<オール>
  • メモリのオーバーヘッド

    • Ruby/Python のランタイム メモリ オーバーヘッドは、bash に比べてわずかですが (共有ライブラリがあるため)、いずれにしても自明でない bash スクリプト (つまり、100 行を超えるスクリプト) を維持することはおそらく不可能です。したがって、メモリ使用量は重要ではありません。要因
  • 起動時間

    • Ruby/Python の起動は少し遅くなるかもしれませんが、多くの完全な Ruby/Python プロセスを毎秒 100 回のタイトなループで実行することはないでしょう (そのようなニーズがある場合は、bashとにかく /shell はオーバーヘッドが大きすぎるため、おそらく C/C++ に移行する必要があります)
  • パフォーマンス

    • ほぼすべての典型的なデータ処理は、Ruby/Python の方が高速です。少なくとも同等です (または、C/C++/Haskel/OCaml などが必要です)
    • 実行における実際のパフォーマンス/ボトルネック (または生産性でさえ) は、ほぼ 決して 「bash/shell を使用していない」 (起動時の Ubuntu 切り替えダッシュでさえ、bash が実際にどのように問題であるかを示しています。 コードを書いて実行するのは「bash」と「vi」だけです。多くの場合、他のものを追加/ダウンロードまたは保存する方法はありません)
    • ジョブを実行するために他のプロセス (sed/awk/grep など) を実行するのは、実際には、メモリ内のライブ オブジェクトでメソッドを呼び出すよりも大幅に遅くなります
  • 生産性

    • Ruby/Python で「実際の」メソッド、パラメータ、変数、例外を使用する場合と比較して、Bash/shell では間違いを犯しやすい
    • アジャイルが主流ですが、Bash はそれをサポートしていません (単体テスト機能、ライブラリ、オブジェクト指向、モジュール性、リンティング、イントロスペクション、ロギング、メタプログラミングが不足しています。何かを壊さずにリファクタリングすることはほとんど不可能です)
    • 他のシェルとの非互換性が多すぎるため、マイナーな環境変数がスクリプトを完全に破壊する可能性があります (また、Puppet のような一部の重要な開発運用ツールはシバン行を無視し、重要なシェル変数を渡したり書き換えたりします)。一方、Ruby/Python は明確に定義されています。主要なバージョン変更の場合でも比較的スムーズな移行パス
    • シェル固有の問題 (特に、変数名、ブール値なし、例外なしなど) により、シェル スクリプトのデバッグに費やす時間よりも、新しい言語の学習にかかる時間の方がわずかです。
    • 起動スクリプトでさえ地雷です (特に システム中に失敗する可能性があるため スタートアップ)、および bash の最近のセキュリティ上の欠陥を考えると、(優れたライブラリを使用した) プレーンな C を使用する方がよい場合があります - はい、C にはコンパイル、構成などが必要ですが、単純なシェル スクリプトでさえ、リポジトリとバージョン管理が必要になる場合があります。 、とにかくパッケージ化します。
    • sed/awk/grep で利用できるものはすべて、Ruby/Python に既に組み込まれている可能性が高く、依存関係や、プラットフォーム間でのこれらのツールのバージョン間の「違い」はありません (つまり、あなたの セットアップ)
  • 雇用保障
    • 嫌いな仕事を確保する意味は何ですか? (デバッグするのは難しいが作成するのは些細なシェル スクリプトのバグに何時間も費やすのが好きでない限り)
  • Ruby/Python がインストールされている場合、Bash/Shell を使用する理由はないと思います。

    そしておそらく、Ruby/Python をインストールするのに、そもそも bash スクリプトさえ必要ありません (busybox を除いて、いくつかのシステム ツールはとにかく存在する Python/Perl に依存しています)。

    そして、シェル スクリプトを書くたびに、より強力で生産的なことを学ぶのではなく、まさにそれを「練習」しています。

    なぜ人々は最近 Bash を使うのでしょうか?それはひどく、なかなかやめられない習慣だからです。スクリプトが最初の数分で「永久に終了」することはめったにありません。 「これがこのスクリプトの最後のバグだ」という誤謬に加えて。

    結論:絶対に強制された場合にのみ、bash/shell を使用してください に (~/.bashrc のように) 、busybox)、ほとんど決してないからです 今日では「仕事に適したツール」です。


    両方で処理できる問題がある場合は、最も使いやすい方を使用することをお勧めします。最終的には、多くの細かい点があり、それらを理解するには経験のみが教えてくれます。

    Bash は、Python、Ruby、Perl と同様に汎用のスクリプト言語ですが、それぞれに異なる強みがあります。 Perl はテキスト分析に優れており、Python は最も洗練されていると主張しています。Bash スクリプトは「パイプ処理」に優れています。私の言いたいことを知っていれば、Ruby は ...まあ、Ruby は多くの点で少し特殊です。

    ただし、それらの違いは、十分な量のスクリプト作成の経験を積んで初めて問題になります。次の言語に進む前に、1 つの言語を選択し、その限界まで押し込むことをお勧めします。シェル スクリプトでは、ほとんどの人が認めるよりも多くのことができます。どの言語も、作りたいと思うほど難しいものです。いくつかのことを書き込めば、どの言語も「簡単」になります。

    Linux を使用している場合は、シェルに慣れているとすぐに成果が得られるので、そこから始めたいと思うかもしれません。シェル スクリプトで解決できない、または非現実的なタスクを見つけた場合は、別のものを使用してください。

    また、シェルスクリプトの学習は非常に簡単であることを覚えておいてください。その真の力は、awk、sed、tr などの他のプログラムにあります。


    私は主にファイル処理に重点を置いているときに bash を使用します。これには、ファイルの移動、コピー、名前の変更、およびファイルを他のプログラムの入力として使用したり、他のプログラムの出力をファイルに保存したりすることが含まれます。ファイルの内容を実際に調べたり、ファイルに書き込む出力を生成したりする bash コードを書くことはめったにありません。それは、bash 経由で起動する他のプログラム (Perl または Python で作成する場合があります) に任せています。

    ファイルからデータを読み取り、そのデータを何らかの方法で処理し、出力をファイルに書き込むことに主な関心がある場合は、Perl と Python を使用します。 (Perl で) system を使用している場合 コマンド、バックティック、または (Python では) subprocess モジュールが広すぎるため、bash でスクリプトを作成することを検討しています。一方で、bash スクリプトに非常に多くの機能を追加し始めることがあるので、最終的には、変数スコープ、関数、データ構造などに対する bash の制限された (比較すると) サポートに対処するよりも、Perl/python で書き直す方が理にかなっています。 .


    Linux
    1. TCP_NODELAY と TCP_CORK をいつ使用する必要がありますか?

    2. Bash で eval を避ける必要があるのはなぜですか? 代わりに何を使用する必要がありますか?

    3. Python で C コードを使用できますか?

    1. Linuxでいつpthread_exit()を使用し、いつpthread_join()を使用するのですか?

    2. bash から変数をエクスポートして Python で使用する

    3. #!/bin/bash と #!/bin/sh はいつ使用する必要がありますか?

    1. Bashでは、いつエイリアスを作成し、いつスクリプトを作成し、いつ関数を作成するのですか?

    2. Nohupをいつ使用するのですか?

    3. いつ、なぜApt-get Updateを使用する必要がありますか?