Pythonと比較したシェルスクリプトの利点[終了]


94

shell(bash)スクリプトを数回学習しようとしましたが、構文に追いやられました。その後、Pythonを見つけ、シェルスクリプトがPythonで実行できるほとんどのことを実行できました。現在、シェルスクリプトの学習に時間を費やす必要があるかどうかはわかりません。だから私は聞きたい:

Pythonと比較してシェルスクリプトが不可欠なツールになる強みは何ですか?

私は職業別のシステム管理者ではありませんが、ホームユーザー向けのLinuxシステムのセットアップに興味があるため、シェルスクリプトの学習が必要になると思います。

回答:


82
  • シェルスクリプティングでは、I / Oリダイレクションの表記が簡単になっています。
  • シェルで既存のプログラムからパイプラインを作成する方が簡単です。
  • シェルスクリプトはプログラム全体を再利用します。
  • シェルは(Unixのようなもので)普遍的に利用可能です-Pythonは必ずしもインストールされていません。

'あなたはシェルで行うことができるPythonですべてを行うことができるというのは本当です; また、Pythonには簡単で、シェルには難しいものがあることも事実です(ちょうど、シェルには簡単だがPythonには難しいものがあるのと同じです)。両方を知ることは、長期的には最善です。


16
1と2、良い点。#3は、Pythonが回避できる多くのオーバーヘッドにつながるため、弱点です。#4は大部分が真実ではないかもしれません。Pythonは現在、ほとんどのLinuxディストリビューションの一部です。
S.Lott、2009

1
@Svante:「test」や「expr」などのコマンドを使用して多数の操作を実行する単純なシェルループを記述し、「os」モジュールを使用するPythonスクリプトと実行時間を比較します。多くの場合、testやexprなどのコマンドは、サブプロセスをフォークして実際の作業を行います。
S.Lott、2009

2
ポイント3は、デメリットではなく、大きなアドバンテージと考えています。たとえば、変換プログラムを使用して、画像でいっぱいのディレクトリのサイズを変更することを検討してください。
Glenn、

7
また、#4に関して注目すべき点は、bashシェルがすべてのLinuxディストリビューション、特に組み込みシステム用のディストリビューション、およびbusybox実行可能ファイルを実行している他のディストリビューションで普遍的に使用できるわけではないことです。bash下位互換性のあるBourneシェル自体をターゲットとするスクリプトは、すべてのPOSIX準拠システムで実行されますが、その言語はによって実装されたものよりもはるかに制限されていbashます。
2010年

5
@intuited:eval "$(history 2 | head -1 | perl -pe 's /(?<= which is)morely / at least /')"; 歴史は$ -d(|ヘッド-1 |歴史2をsedのの/ ^ \ sの*を([0-9] \ +)/ \ 1 / ')
直感

54

「Pythonと比較して、シェルスクリプトが不可欠なツールになる強みは何ですか?」

シェルは必須ではありません。なぜそんなにたくさんあると思いますか?bash、tcsh、csh、shなどなど

Python シェルです。すべてのコマンドの実行に使用するものではありませんが、スクリプト作成には理想的です。

Pythonは、すべてのLinuxディストリビューションの標準的な部分です。

より伝統的なシェルは多くのことを行います。

  1. コマンドを実行するための便利なユーザーインターフェイスがあります。これには、シェルがPATHを検索し、要求されたプログラムをフォークして実行する1行のコマンドが含まれます。また、パイプライン、シーケンス、並行プログラム(およびを使用);|および&リダイレクト(>およびを使用)も含まれ<ます。

  2. 彼らはスクリプトを実行するための不器用な小さなプログラミング言語のような機能を持っています。この言語はかなり使いにくく、非常に非効率的です。この言語のほとんどのステートメントでは、1つ以上の追加プロセスをforkする必要があり、時間とメモリを浪費します。

シェルからプログラムを実行し、stderrをログファイルにリダイレクトします。これは良いことです。シェルでそれを行います。

他のほとんどすべては、Pythonスクリプトとしてより効率的かつ明確に実行できます。

両方が必要です。ただし、従来のシェル言語では、ifステートメントまたはループを含むスクリプトを記述しないでください。


1
@intuited。A)異なるシェルの急増は、「シェル」に追加される機能の数を証明しています。これは重要な役割ではありませんが、機能のすべてを網羅しています。B)Pythonインタープリターは適切なUNIXシェルであり、#!を使用します。C)「単純な」シェルifステートメントは、多くの場合、testプログラムの実行を伴います。シェルは、あらゆる点で不作法なプログラミング言語です。
S.Lott

4
@S ロット:ここの回路には意味的な不協和があるようです。私のUNIXシェルの定義は、その言語が主にUNIXシステムの操作を高レベルで制御することに向けられているインタープリターになるでしょう。この定義によれば、ある種のシェルは確かにUNIXシステムの操作に不可欠であり、Pythonは適格ではありません。その用語をどのように定義しますか?
2010年

1
@ S.Lott:私は従来のシェルスクリプトで使用される構文の大ファンではありませんが、それは非常に使いやすく、主な目的がプロセスとその出力のフローを制御することである多くの状況で適切であると思います。多くの場合、これには意思決定と反復が必要です。現代のシェル(bash少なくとも)には、意思決定を処理するためのビルトインがあります(たとえば、より用途の広い構成に加えてtestbashビルトインです)。それには確かに弱点がありますが、長所もあります。他の種類の言語とはパラダイムが非常に異なるため、詳細に学習する価値もあります。
2010年

1
@intuited:「かなり使いやすいものを見つける」はあなたのスキルへの敬礼であり、下品な言葉ではありません。Pythonは、熟練していない人でも使いやすくなります。
S.Lott

3
@ S.Lott:興味深いことに、私とは非常に異なる哲学があります。デザインと操作は基本的に鶏と卵であると感じています。つまり、シェルスクリプトはプログラムを実行するプログラムであるということです。これらのプログラムの多くは、当初はますます複雑なシェルスクリプトとして実装されていました。ある時点で、おそらくモジュール化と同じくらい効率的にするために、それらのいくつかをCで、そして後でPythonで書き換えることが価値のあるものになりました。たとえば:いくつかの時点でcat "$1" | ssh "$2" "cat - >\"$1\""生みましたscp。彼らはすでにそれを使用していたので、彼らはそれをどのように設計するのが最善かを知っていました。
2010年

31

シェルは、より複雑なものをはるかに複雑にする代わりに、一般的なアクションと単純なアクションを本当に単純にします。

通常、小さなシェルスクリプトは対応するpythonプログラムよりも短くて単純ですが、pythonプログラムは変更を適切に受け入れる傾向がありますが、シェルスクリプトはコードが追加されるにつれて保守性が低下する傾向があります。

これにより、日々の生産性を最適化するにはシェルスクリプトが必要ですが、それは主に使い捨てスクリプトに使用し、それ以外の場所ではpythonを使用する必要があります。


14

シェルスクリプトでできることは、Pythonではできないことです。シェルスクリプトの大きな利点は、シェルを使用するときと同じコマンドを使用できることです。そのため、ヘビーシェルユーザーの場合、シェルスクリプトは、シェルの作業を自動化するための非常に迅速で簡単な方法になるでしょう。 。

また、Pythonからは絶対に実行可能ですが、Pythonよりもシェルスクリプトでデータのパイプを処理する方が簡単です。

そして最後に、シェルスクリプトを実行するために追加のインターピーターを起動する必要がないため、非常に小さくなりますが、速度とメモリ使用量が著しく向上する場合があります。

しかし、繰り返しになりますが、Pythonスクリプトの方がはるかに保守しやすくなっています。そのため、私は大きな醜いシェルスクリプトからPythonスクリプトに移行しようとしています。Pythonで例外処理とQAを行うのも簡単です。


9

以前のすべての回答が示しているように、シェルスクリプトを学ぶ必要はありません。しかし、学習は決して悪いことではありません。それは本当に個人的な優先事項の問題です。誰かがあなたの時間に値するものと価値がないものをあなたに伝えるのは非常に困難です。

ほとんどのプログラマーは、新しい言語の学習が毎回段階的に簡単になることに気づきます。(同じことが自然言語にもほぼ当てはまります。)そして、あなたが始めるのが早いほど良いでしょう。

プラス:言語を学んだことで、完全な知識と親しみやすさの立場からその限界を贅沢に取り除くことができます。これはおそらくあなたを解雇することはありませんが、あなたの仲間からあなたにビールを稼ぐかもしれません!


8

以前の回答のほとんどに同意します。私は、ファイルシステム指向のタスク(ファイルのコピーと移動、grepなど)を実行するのに最も適したシェルコマンドを検討します。私の意見では、ファイルを読み書きする必要がある場合は、1つの>>file.txtリダイレクトがファイルに追加されるため、たとえばfile=open('file.txt','a'); file.write()、などを必要とする代わりに、シェルが優れています。

現在、個人的な使用のために、Pythonスクリプトを作成し、一部のアクションがPythonよりもシェルで簡単な場合は常にos.system( 'command')またはos.popen( 'command')を呼び出すことの両方を混合しています。


6

シェルはどこでも利用できます。ポータブル機能の比較的基本的なセットに固執する場合、スクリプトは携帯電話、ワイヤレスルーター、DVR、ネットブック、ワークステーション、大きな鉄製のサーバーなどで実行できます。多くのシステムでは、Pythonは必ずしもデフォルトで含まれているわけではなく、環境によっては、インストールが難しい場合があります。

コマンドラインはまさしくシェルなので、いくつかのシェルスクリプトを学ぶことは、いくつかのコマンドラインのトリックを学ぶのにも役立ちます。また、かなり長くて複雑なコマンドラインを使用して、さらに必要になるとわかった後で、それをより一般的なスクリプトに変換するのにも適しています。

シェルには、かなり強力な機能もいくつかあります。パイプラインは、私が知る限り、シェルにのみネイティブな非常に興味深い制御構造です。


5

Pythonのシェルスクリプトを選択するときに考慮すべきもう1つのことは、ターゲットマシンで実行されるPythonのバージョンです。RHEL5(名前を挙げれば)は長い間存在します。RHEL5はPython 2.4で動かなくなっています。Python post-2.4に追加された機能に依存する多くの素晴らしいライブラリがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.