シェルには、ファイルを操作し、あるプログラムから別のプログラムにデータを取得するための特別な機能があります(データがテキストであると想定)。これらのタスクでは、シェルスクリプトは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で書くのにかかる時間ははるかに短く、おそらくより明確だったでしょう。
要するに、さまざまな種類のタスク用にさまざまな言語が設計されています。手元のタスクに最適な言語を選択してください。