解釈されたプログラミング言語に対するシェルスクリプトの利点は何ですか?[閉まっている]


15

(ここで適切な質問かどうかわかりません)

で記述されているようなシェルスクリプトは、bash多くのことを実行できます。Unixプログラムを呼び出したり、出力をパイプしたり、ファイルとの間でI / Oをリダイレクトしたり、フローを制御したり、ファイルが存在するかどうかを確認したりできます。

しかし、最新のプログラミング言語、例えば、pythonおよびはruby、これらのこともできます。そして、それらは(私が思うに)より読みやすく、保守しやすいです。

bash広く採用されています。しかし、多くのディストリビューションにもpythonインタープリターがインストールされています。

それでは、スクリプトのシェルの利点は何ですか?私が書くことができるならpythonrubyそれともperl学ぶ価値がありますbashか?


3
Unixシステムで多くの作業をする場合は、bashと他の一般的なUnixシェルを学ぶ必要があります。
バーナード

回答:


30

シェルには、ファイルを操作し、あるプログラムから別のプログラムにデータを取得するための特別な機能があります(データがテキストであると想定)。これらのタスクでは、シェルスクリプトはPythonのようなスクリプト言語よりも面倒ではありません。

シェルスクリプトには、使用するコマンドがコマンドラインから使用するコマンドと基本的に同じであるという利点もあります。したがって、シェルで何かを行うことができれば、同じ操作のスクリプト作成の半分以上を実行できます。

たとえば、bashスクリプトは、すべてのPNGファイルを現在のディレクトリから指定されたディレクトリに移動します。

#!/usr/bin/sh
mv *.png $1

これがPythonバージョンです。

#!/usr/bin/python
import sys, shutil, glob
for filename in glob.iglob("./*.png"):
    shutil.move(filename, sys.argv[1])

気づくでしょう:

  • bashスクリプトは、行数を数える場合(シェバン行を除く)、Pythonの3分の1です-文字数でさらに少なくなります
  • Pythonスクリプトには3つのライブラリをインポートする必要がありますが、このタスクに必要なものはすべてbashでネイティブに利用可能です
  • Pythonスクリプトは、ファイルを移動するために明示的なループを必要としますが、これmvはbash のコマンドのセマンティクスの一部です
  • bashスクリプトはより高速に実行できます。おそらくbashから起動しsource、シェルの同じインスタンスで実行するために使用できます。
  • glob.iglob("./*.png") 言うだけでも口いっぱいです *.png

Pythonで基本的なパイプ操作を作成したい場合、その冗長性に驚くでしょう。(もちろん、パイピングなどのいくつかのものはgrep、外部プログラムを使用するのではなくPythonコードに置き換えることができるため、多くの場合、それほどパイプする必要はありません。)

反例として、各ファイル名が特定のディレクトリにある時間を確認するルーチンを作成する必要がありました。特定のOSでサポートされているよりも長い場合は、短縮する必要がありました。これにより、ファイル名が重複する可能性があり、修正する必要があります。Webページからリンクされるため、短縮名は安定している必要があります。つまり、同じ長いファイル名が常に生成されるように生成する必要があります同じ短縮ファイル名。長いファイル名の16進数のmd5を生成し、短縮名にその最初の4文字を追加することでこれを行いました(名前はまだ衝突する可能性がありますが、非常に不自然なので、その状態を確認し、必要に応じて保釈しました) 。

すでにbashで記述されたビルドシステムの一部であったため、bashでこれを行いました。おそらくあなたが考えているのと同じくらい正しくなるのは難しいことでした。Pythonで書くのにかかる時間ははるかに短く、おそらくより明確だったでしょう。

要するに、さまざまな種類のタスク用にさまざまな言語が設計されています。手元のタスクに最適な言語を選択してください。


perl#/ usr / bin / perl mv *.png $1(コメントはフォーマットを保持しません)で同じことを行うことはできません、perlでは、より高レベルの言語機能を使用することもできます。
ポマ

19

既存の回答も有効ですが、まだ誰も言及していない理由が1つあります。それはそこにあるからです。

所定の* nixインストールは、ロードされる場合とされない場合があるオプションパッケージのセットで行われ、すべてのシステムにPythonまたはPerlまたはRubyがあるわけではありません。しかし、システムにインタラクティブ機能が期待される場合、シェルがあります。つまり、シェルスクリプトは、書き込み可能なファイルシステムとbashコマンドラインをサポートするシステムで、サーバーからプログラマーのデスクトップ、秘書のシンクライアントデスクトップ、組み込みデバイスまでのシステムで動作します。

一貫したサーバー環境でしか働いていない人にとっては、これは当たり前のことであり、それほど重要ではありません。より多様な環境で働く人にとって、これは見落とされるべきではありません。


9

あなたの質問の大部分はここで答えられます:

スクリプト言語(Perl、Python、Rubyなど)がシェル言語として適切でないのはなぜですか?

その質問に対する私の答えからの抜粋を以下に示します

考えられる違いがいくつかあります。ここでは、特定の順序でストリーミングを考えていません:

  1. Python&Co.は、スクリプト作成が得意であるように設計されています。バッシュ・アンド・カンパニーは、なるように設計されているだけで、絶対に妥協することなく、スクリプトで良いです。IOW:Pythonはスクリプティングと非スクリプティングの両方が得意となるように設計されていますが、Bashはスクリプティングのみを考慮しています。

  2. Bash&Co.は型付けされていませんが、Python&Co.は強く型付けされています。つまり、数値123、文字列123、およびファイル123はまったく異なります。ただし、静的に型指定されていないため、それらを区別するために、それらに対して異なるリテラルが必要です。例:

    • Ruby:(123数値)、Bash:123
    • Ruby:('123'文字列)、Bash:123
    • Ruby:(/123/正規表現)、Bash:123
    • Ruby:(File.open('123')ファイル)、Bash:123
    • Ruby:(IO.open('123')ファイル記述子)、Bash:123
    • Ruby:URI.parse('123')(URI)、Bash:123
    • Ruby:(`123`コマンド)、Bash:123
  3. Python&Co.は10000、100000、場合によっては1000000までのラインプログラムにスケールアップするように設計されています。Bash&Co .は10 文字のプログラムにスケールダウンするように設計されています。

  4. Bash&Co.では、ファイル、ディレクトリ、ファイル記述子、プロセスはすべてファーストクラスのオブジェクトです。Pythonでは、Pythonオブジェクトのみがファーストクラスです。ファイル、ディレクトリなどを操作する場合は、それらをラップする必要があります。最初にPythonオブジェクト。

  5. シェルプログラミングは基本的にデータフロープログラミングです。それを知っている人は誰もいません。シェルを書く人でさえ、シェルはそれが非常に得意であり、汎用言語はそれほど多くないことがわかります。汎用プログラミングの世界では、データフローはプログラミングのパラダイムほどではなく、並行性モデルとして主に見られているようです。

機能やDSLを汎用プログラミング言語にボルトで固定してこれらの点に対処しようとしてもうまくいかないと感じています。少なくとも、私はまだ説得力のある実装を見ていません。Rubyでシェルを実装しようとするRuSH(Rubyシェル)、Rubyでのシェルプログラミング用の内部DSLであるrush、PythonシェルであるHotwireがありますが、これらのどれも近いものではありませんBash、Zsh、魚、友達との競争に。


壊れたリンク:あなたが今参照しているこの質問(および回答)はどこですか?または、ここに便利なものがすべてコピーされましたか?
ウルフ14

1
@Wolf:ほぼ3年後、話題から外れたため削除されたようです。それは残念です。
ヨルグWミットタグ14

1
ここではその質問のアーカイブされたバージョンがあります:web.archive.org/web/20140528035940/http://stackoverflow.com/...
waldyrious

1

シェルスクリプトは、非常に単純な自動化タスクを実行したい場合に有利です。たとえば、あるサーバーから別のサーバーに毎日5:00にディレクトリをバックアップするスクリプトを作成する場合、ヘビーデューティプログラミング言語を使用するのはやり過ぎです。

一方、プログラミングタスクに制御構造(if / then / else)、反復構造(ループ)、データベースとファイルI / Oなどが必要な場合は、おそらくより高性能なシェルスクリプトよりもプログラミング言語。

経験則は次のとおりです。

automatingSimpleTask ? shellScript() : programmingLanguage();

2
笑ってはいけませんshellScript() if automatingSimpleTask else programmingLanguage()
ガフア

1
@gahooa haha​​はフェンスのどちら側にいるかを示しています!
CFL_ジェフ

1

python / ruby​​ / whateverプログラムからプログラムを起動できますが、シェルでは異なります。APIを使用して何かを起動する必要がある場合があります-fork()など。シェルスクリプトでは、プログラムは従来のプログラミング言語の関数のように動作し、最小限の労力で実行、パイプ処理などが可能です。パイプを使用しても、データの流れは非常に明確です。


0

特定のタスクに使用するプログラミング言語を完全に自由に選択できる場合、bashの学習をほぼ完全に回避し、Perl、Python、またはRubyですべてのスクリプトプログラミングタスクを実行できます。これは、特に他のUnixツールのシーケンスを呼び出すスクリプトが必要な場合に、より冗長なソリューションにつながる場合がありますが、より複雑な場合には正しいです。これらの最新のスクリプト言語は、より良い保守可能なコードを書くためのより多くの可能性を与えます(難読化されたコードを書く可能性もありますが、それはあなたの選択です)。

一方、多くの場合、最も好きな言語を自由に選択することはできません。これは、レガシーコードまたはbashを知っていても名前を付けたスクリプト言語の1つを知らない人が作成したコードを使用する必要があるためです。


0

シェルスクリプト、解釈されたプログラミング言語です。ここに、perl、python、または他のスクリプト言語ではなくbashでスクリプトを記述することにしたいくつかの理由があります。

どこでも動作:システムの起動時や組み込みシステムなど、より複雑なインタープリターが常に使用できるとは限りません。Bashはbusyboxでも利用可能です。

コマンドラインで動作する:シェルスクリプトに精通している場合は、それらのスキルを使用して、アドホックスクリプトで複雑なことをコマンドラインで実行できます。私はこのスキルを毎日システム管理者として使用しています。

他のプログラムを呼び出すプログラムの作成がより簡単に:複数の既存のプログラムを興味深い方法で連鎖させようとしている場合、高レベル言語を使用するよりもシェルスクリプトで実行する方が簡単です。

プログラムが30行以下の場合、通常はシェルスクリプトを使用して記述します。複雑な操作、複雑な処理、または分析が必要な場合は、Pythonまたはperlを使用して実行します。


-1

coffeescriptを見てください。彼らの言葉:

これらの厄介なブレースとセミコロンの下には、JavaScriptの中心に常に豪華なオブジェクトモデルがあります。CoffeeScriptは、JavaScriptの優れた部分を簡単な方法で公開する試みです。

CoffeeScriptの黄金律は、「JavaScriptだけです」です。

さて...ここに超初心者の答えが来ます。

過去6か月間、自動学習の初心者として、最後の数日間にC、C ++、Javascript、およびその他のBashscriptを少し試してみました...

bashで記述されたシェルスクリプトのようなシェルスクリプトは、多くのことを実行できます。Unixプログラムを呼び出したり、出力をパイプしたり、ファイルとの間でI / Oをリダイレクトしたり、フローを制御したり、ファイルが存在するかどうかを確認したりできます。

そして、これは単純な幻想ではありません?ループと変数?うわー!

pythonとrubyもこれらのことができます。そして、それらは(私が思うに)より読みやすく、保守しやすいです。

これを見た場所を教えてください。私は中bashscript書いgeditのさえにgeany(?タブ)、と私はフォーマットすることができ、私は他の言語での比較ですにおける光使用bashscriptの速度で私のコードを読んで。

この言語には秩序を維持するための他のツールがありますか?オブジェクト指向は多くのコードを保存することを知っていますが、... bashscriptもオブジェクト指向であると言われています!WOW 2!ここが私のポイントです。に行く:

シェルスクリプトの利点

この質問の中にあります:このbashdamnthingがperlまたはphytonまたはrubyでできることをどのように行うのですか?それは簡単です?

bashdamnthing = xdotool


WTFはここで起こっていますか?ドージェの答えのようなものです
。– naught101
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.