web-dev-qa-db-ja.com

Bashスクリプトの使用はもうありますか?

私は大学のCS学生として2年目を終えたばかりなので、「現実世界」の知識が不足しています。私はJava私の最初の年、Javaに続き、2番目のCとシンプルなBashスクリプトを取り上げました。この夏、Perl(God私はPython少し前に手を出しました。

私の質問は、Python、Ruby、Perlなどの非常に読みやすく、非常に書き込み可能なスクリプト言語があるからです。なぜBashスクリプトを書くのですか?私が見逃しているものはありますか?私のLinuxボックスにはPerlとpythonがあります。彼らは十分にユビキタスではありませんか? Bashで他のhllよりも簡単にできることは本当にありますか?

69
Daniel Harms

とりわけ、bashは、mostが行うことの多くが、さまざまなプログラム間で通信およびパイピングを行う場合に役立ちます(多くは標準でもあります)。また、bash(または少なくとも POSIX Shell )は利用可能ですが、PerlとPythonは利用できません。

そしてもちろん、インタラクティブbashとスクリプトbashを区別する必要があります。 Ubuntuは最近、デフォルトのスクリプトシェル(#!/bin/sh)から dash へ。ただし、- bash にはダッシュにはない便利なインタラクティブ機能があります(- zsh の方が良いです、IMHO)。

57

Bashは、システム管理、Webアプリケーションの展開、データのクランチ、致命的なバックアップ、さらには getting-things-done day by day management で非常に便利です。 BASHのような「ベテランIT兵士」を判断するのは時期尚早だと思います。

グーグルの編集:

TextMate 成功したOS-Xプログラムには、内部に多くのBash機構があります。

34
microspino

Bashスクリプトを使用すると、同じ言語を使用してコマンドラインタスクを自動化することができます。

$ PATHをリストする簡単な例

Bash

#!/bin/sh
echo $PATH

Python

import os
print os.getenv("path")
24
mikek3332002

Bashとpythonの本当の違いは、pythonはpython $ ===が汎用スクリプト言語であるのに対し、bashは単純に無数の(そして多くの場合、非常に高速な一連のプログラム。Pythonはこれを行うことができますが、最適化されていません。プログラム(sort、find、uniq、scp)は非常に単純に非常に複雑なタスクを実行します。 bashを使用すると、これらのタスクを非常に簡単にパイピングで相互運用し、ファイルやデバイスなどからの出力をフラッシュすることができます。

Pythonは同じプログラムを実行できますが、同じことを達成するためにpythonスクリプトでbashスクリプトを実行することを強制されます。 both python and bash。どちらも問題ありませんが、これらを組み合わせても何も改善されません。

24
daramarak

多くのタスクでは、bashは非常に簡潔です。現在のディレクトリのすべてのファイルで文字列を検索し、それらの行を出力するコード:

Bashの場合:

grep -ir "search_term" .

Pythonの場合:

for file in os.listdir('.'):
  file_content = open(file).readlines().split('\n')
  for line in file_content:
    if line.count("search_term") > 0:
      print file, ": ", line
14
n1kh1lp

pythonは多くのタスクでbashほど自然ではないという強い議論は、誰もシェルとしてpythonインタープリターを使用しないという単純な事実だと思います。明らかにこれは可能です:

python> import os, subprocess
python> os.chdir(os.path.expanduser("~/work"))
python> subprocess.call(["vim","README"])

明らかに、シェルに対してpythonを使用するのは馬鹿げています。Bashは他のプログラムを実行するために設計されました。Pythonは計算を行うために設計されました。どちらの言語でも、pythonとその逆の場合よりもbashの方が簡単に実行できるタスクが常にあります。

10
Quantum7

まあ、bashで書くときは、スクリプトのコマンドラインにあるすべての可能なツールを直接使用できます。他の言語では、最初にそのコマンドを実行して結果などを取得する必要があります。たとえば、プロセスのリストを取得し、grepを実行して結果を取得する単純なスクリプトは、他の言語でははるかに複雑になります。そのため、bashは今でも簡単なことを書くための優れたツールです。

7
poke

多くの起動スクリプトは伝統的にシェルスクリプトとして記述されており、それらから遠ざかる傾向はないようです。

シェルスクリプトは、他のプロセスを開始し、入力/出力を結合するのに最適です。これは、他のスクリプト言語がそれほど強力ではない領域です。

それとは別に:Perlのような言語でさえ、Python and Rubyがますますユビキタスになり、あなたが実際にいる唯一の言語すべてのunixライクなシステムで保証されているは、 bourne Shell (ただし、必ずしも bash )の形式ではありません).

4
Joachim Sauer

他の人が言ったこととは別に、私は私の意見でBashを学ぶ主な理由を指摘したいと思います:それは(ほぼ)標準のLinuxですShell

他のスクリプト言語は確かに有用であり、おそらくはるかに強力ですが、目の前に端末がある場合に対処するのは... Bashです。

Linuxシステムを管理する場合は、I/O、パイプとプロセスを管理し、変数を割り当てて使用し、少なくともいくつかのループと条件の評価を実行できることが必須です。

4
Massimo

Bashはスクリプト言語であるだけでなく、シェルです。

ジョブ制御言語とシェル
主要記事:シェルスクリプト

スクリプト言語の主要なクラスは、システムプログラムの動作の開始と制御に関連するジョブ制御の自動化から発展しました。 (この意味で、シェルは、IBMのJCL、またはまさにこの目的のために使用されたジョブ制御言語の子孫であると考えるかもしれません。)これらの言語のインタープリターの多くは、UnixシェルやMS-DOS COMMAND.COM。 AppleScriptなどのその他のものでは、英語のようなコマンドを使用してスクリプトを作成できます。これをMac OS XのCocoaフレームワークと組み合わせると、ユーザーはAppleScriptおよびCocoaオブジェクトを使用してアプリケーション全体を構築できます。

Python、RubyおよびPerlは優れていますが、より一般的なツールです。特定のケース(組み込みデバイスまたは他の最小限のシステム)では、肥大化したと見なされるか、セキュリティリスクを引き起こす可能性があります(非常に高いセキュリティを必要とし、不要なパッケージを排除しようとする環境向け)。

場合によっては、OSとの密接な統合により、シェルスクリプトのパフォーマンスが大幅に向上します。

また、bashは無数の管理タスクで実稼働で実証されており、非常に複雑なシナリオ(例外)をカバーし、それらを適切に処理するスクリプトを簡単に見つけることができます。

3
Unreason

おそらく、そうではないでしょう。実際、多くの場合、スクリプトをbashするよりもPerlの方が好きです。ただし、特にLinuxシステムでは、Bashには1つの利点があります。インストールが保証されていることはほとんどありません。そうでない場合、そのほぼ互換性のある父親(sh)は、ほとんどすべてのシステムスクリプトがsh向けに作成されているためです。 Perlでさえ、どこにでもあるわけではありません。

2
cHao

Bash(および元のBourne shおよび無数の派生物)は、1つの観点からすると、信じられないほど高度な言語です。多くの言語が単純なプリミティブを使用する場合、シェルプリミティブはプログラム全体です。

タスクを表現するのに最適な言語ではないかもしれませんが、それが死んだ、死にかけている、またはeven死さえしているという意味ではありません。

2
msw

私はPerlの男ですが、私が日常的に使用および作成するbash(またはksh)関数の数は非常に重要です。関係することについては、Perlスクリプトを作成しますが、ディレクトリ構造をナビゲートするため、特に環境変数の操作 bash/ksh/...が不可欠です。

繰り返しますが、特に環境変数の場合、シェルに勝るものはありません。また、かなりの数のプログラムが環境変数を使用しています。 Perlでは、Perlスクリプトを呼び出すbashエイリアスまたは関数を作成する必要があります。このスクリプトは一時的なbashスクリプトを書き出し、Perlの終了後にソースを取得して、起動している同じ環境で変更を行います。

これは、特にパス変数を大幅に改善するために行いました。しかし、just Perl(またはpythonまたはRuby ...またはCコード)でそれを行う方法はありません。

2
Axeman

多くのGUIを行う場合、おそらく自分のマシンで何らかのカスタマイズを行っているときだけ、bashに出会うでしょう。さまざまなハックやもの。コマンドラインを使用して作業を行う場合、bashは不可欠です。実際、コマンドラインで操作するには、bashまたはその他のシェルの知識が必要です。

ハードドライブをすばやくナビゲートしたいときに、Bashを学んだことでマイルが得られます。さまざまなフォルダーやファイルにすばやく簡単にビームできるナビゲーション/メニューインターフェイスを作成しました。それをbashで書くのは簡単で簡単でした。また、簡単にアクセスできる無料のものがたくさんあり、その方法を紹介します。

また、Bashを学ぶことは、Unixやいくつかの中核的なものが実際にどのように機能するか、そしてPythonのようなツールをどこまで使用したかを理解するのに最適です。

2
brainysmurf

私が理解できないのは、人々がbourne-Shell互換シェルを意味するときにbashと言う理由です。

シェルスクリプトを記述する場合:always古いbourne Shellインタープリターでも機能する構成体を使用してください。それはいつかあなたの多くのトラブルを救います。

はい、今日、シェルスクリプトはPerl、python、csh、zsh、ksh(おそらく?)などとは対照的に、すべてのUNIXに常に存在するため、シェルスクリプトには多くの用途があります。ほとんどの場合、ループやテストなどの構成要素に特別な利便性または異なる構文を追加するだけです。リダイレクト機能が改善されたものもあります。

ほとんどの場合、私は普通のBourne Shellが同様にうまく機能すると言います。

典型的な落とし穴:if ! test $x -eq $yは、より賢い組み込みの "if"演算子を持つbashで期待どおりに動作しますが、 "正しい" if test ! $x -eq $yはすべての環境で動作するはずです。

1
MattBianco

私の経験では、Perlはシェルスクリプトを必要とする可能性のあるニーズの99%のようなものを満たしています。おまけとして、Cygwin以外のWindowsで実行されるコードを書くことができます。ターゲットとするWindowsボックスにPerlをインストールしない場合は、PAR :: PackerまたはPerlAppを使用して実行可能ファイルを生成できます。 Python、Rubyなども同様に機能するはずです。

ただし、シェルスクリプトはそれほど複雑ではありません。少なくとも、シェルでスクリプトを作成する必要があることはそれほど複雑ではありません。かなり浅い知識レベルで必要なことを行うことができます。

変数の読み取りと設定の方法を学びます。関数を作成して呼び出す方法。他のファイルを入手する方法。フロー制御の仕組みをご覧ください。

そして最も重要なことは、シェルのマニュアルページを読むことを学ぶことです。これは面白そうに聞こえるかもしれませんが、私は100%真剣です。シェルスクリプトの詳細をすべて脳に詰め込む心配はありません。代わりに、manページで知る必要があることをすばやく効率的に見つけることを学びます。シェルスクリプトを頻繁に使用していることに気付いた場合は、関連情報が自然に脳に残ります。

それで、はい、基本的なシェルは学ぶ価値があります。

1
daotoad

前述のように、GNUツールは優れており、シェル内で使用するのが最も簡単です。データがすでにプレーンテキストの線形または表形式である場合は特に便利です。単なる例として、先日、Bourne Shellの8行にあるテキストファイルのXHTML Wordクラウドを作成するスクリプトを作成することができました。これは、Bashよりも強力ではありません(より広くサポートされています)。

1
l0b0

Freshmeatで真のボーンを取得できます(たとえば、Mac OS Xでは、/ bin/shは真のボーンではありません)。

従来のボーンシェルを識別する方法は? ...しばしば文書化されていないが特徴的な機能の簡単なチェック:サーカムフレックス^(キャレット)を|の代わりに使用できます。 (パイプ)。

参照: http://www.in-ulm.de/~mascheck/bourne/

1
pete