シェルスクリプト

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
ipfirewallを設定するためのFreeBSDシェルスクリプトの編集

シェルスクリプトコマンドラインインタプリタであるUnixシェルによって実行されるように設計されコンピュータプログラムです。[1]シェルスクリプトのさまざまな方言は、スクリプト言語と見なされますシェルスクリプトによって実行される一般的な操作には、ファイル操作、プログラム実行、およびテキストの印刷が含まれます。環境をセットアップし、プログラムを実行し、必要なクリーンアップまたはロギングを実行するスクリプトは、ラッパーと呼ばれます。

この用語は、より一般的には、オペレーティングシステムシェルを実行する自動モードを意味するためにも使用されます。各オペレーティングシステムは、バッチファイル(MSDos-Win95ストリーム、OS / 2)、コマンドプロシージャ(VMS)、シェルスクリプト(WindowsNTストリームおよび4NTなどのサードパーティの派生物-記事はcmdにあります)を含むこれらの機能に特定の名前を使用します。 exe)、およびメインフレームオペレーティングシステムは、いくつかの用語に関連付けられています。

典型的なUnix / Linux / POSIX準拠のオペレーティングシステムのインストールには、ksh88、Korn Shell '93などのいくつかの可能なバージョンのKornShell( )が含まれています。ksh現在も一般的に使用されている最も古いシェルはBourneシェルsh)です。Unixシステムには、Cシェルcsh)、Bashbash)、リモートシェルrsh)、SSL telnet接続用のセキュアシェル( )、および通常は;と呼ばれるTcl / Tkインストールの主要コンポーネントであるシェルも含まれる場合があります。願いssh tclshGUIベースのTcl / Tkシェルです。CシェルとTclシェルの構文は、前述のプログラミング言語と非常によく似ています。KornシェルとBashは、 ALGOL言語に基づいており、他の多くの要素も追加されたBourneシェルを開発したものです。[2]一方、awksedgrepBASICLispCなどのさまざまなシェルとツールがPerlプログラミング言語に貢献しました。[3]

マシン上で利用可能な、またはダウンロードや購入が可能な他のシェルには、Almquistシェルash)、PowerShellmsh)、Zシェルzsh特に一般的な拡張KornShell)、Tenex Cシェルtcsh)、およびPerlのようなシェル(psh)が含まれます。 PythonRubyCJavaPerlPascalRexxなどのさまざまな形式のシェルなどの関連プログラムも広く利用できます。もう1つの一般的なシェルは、古いシェルです(osh)、そのマニュアルページには、「第6版UNIXの標準コマンドインタプリタの拡張された下位互換性のあるポート」と記載されています。[4]

機能

コメント

コメントはシェルによって無視されます。これらは通常、ハッシュ記号()で始まり#、行の終わりまで続きます。[5]

スクリプト言語の構成可能な選択

シバン、またはハッシュバンは、ファイルの実行に使用するインタプリタを決定するためにシステムが使用する特別な種類のコメントです。shebangはファイルの最初の行で、「」で始まる必要があります#![5] Unixライクなオペレーティングシステムでは、 ""プレフィックスに続く文字#!は、スクリプトを解釈する実行可能プログラムへのパスとして解釈されます。[6]

ショートカット

シェルスクリプトは、特別な環境設定、コマンドオプション、または後処理が自動的に適用されるシステムコマンドの便利なバリエーションを提供できますが、新しいスクリプトが完全に通常のUnixコマンドとして機能できるようにします。

1つの例は、ファイルを一覧表示するコマンドであるlsのバージョンを作成し、l通常はユーザーのbinディレクトリにとして保存される短いコマンド名と、事前に提供されているコマンドオプションのデフォルトセットを作成することです。 /home/username/bin/l

#!/ bin / sh 
LC_COLLATE = C ls -FCas " $ @ "

ここで、最初の行はシバンを使用して、スクリプトの残りの部分を実行するインタープリターを示し、2行目は、ファイル形式インジケーター、列、すべてのファイル(省略なし)、およびブロック単位のサイズのオプションを含むリストを作成します。LC_COLLATE=C、デフォルトの照合順序を大文字と小文字を一緒に折りたたまないように設定し、名前の句読点を無視する副作用としてドット-aファイルを通常のファイル名と混合しないようにします(ドットファイルは通常、のようなオプションが使用されている場合にのみ表示されます)"$@"llsにパラメーターとして渡すために与えられたので、lsに知られているすべての通常のオプションと他の構文を引き続き使用できます。

ユーザーはl、最も一般的に使用される短いリストに簡単に使用できます。

ショートカットとして使用できるシェルスクリプトの別の例は、特定のディレクトリ内のすべてのファイルとディレクトリのリストを印刷することです。

#!/ bin / sh

クリア
ls -al

この場合、シェルスクリプトは通常の開始行#!/ bin / shで開始されます。これに続いて、スクリプトは次の行に進む前にすべてのテキストの端末をクリアするコマンドclearを実行します。次の行は、スクリプトの主な機能を示しています。ls -alコマンドは、スクリプトの実行元のディレクトリにあるファイルとディレクトリを一覧表示します。lsコマンドの属性は、ユーザーのニーズを反映するように変更できます。

注:実装にclearコマンドがない場合は、代わり にclrコマンドを使用してみてください。

バッチジョブ

シェルスクリプトを使用すると、コマンドラインインターフェイスで手動で入力するいくつかのコマンドを自動的に実行でき、ユーザーがシーケンスの各段階をトリガーするのを待つ必要はありません。たとえば、3つのCソースコードファイルがあるディレクトリでは、それらから最終的なプログラムをビルドするために必要な4つのコマンドを手動で実行するのではなく、代わりにPOSIX準拠のシェル用のスクリプトを作成できbuildます。 、それらを自動的にコンパイルします:

#!/ bin / sh 
printf  'コンパイル中... \ n'
cc -c foo.c
cc -c bar.c
cc -c qux.c
cc -o myprog foo.o bar.o qux.o
printf  '完了。\ n'

このスクリプトを使用すると、ユーザーは編集中のファイルを保存し、エディターを一時停止してから、実行./buildして更新されたプログラムを作成し、テストしてから、エディターに戻ることができます。ただし、1980年代以降、このタイプのスクリプトは、プログラムの構築に特化した makeなどのユーティリティに置き換えられました。

一般化

単純なバッチジョブは、分離されたタスクでは珍しいことではありませんが、シェルループ、テスト、および変数を使用すると、ユーザーの柔軟性が大幅に向上します。JPEG画像をPNG画像に変換するPOSIXshスクリプト。画像名は、スクリプト内にリストされるのではなく、コマンドラインで(場合によってはワイルドカードを介して)提供されます。このファイルを使用して作成できます。通常、次のようなファイルに保存されます。/home/username/bin/jpg2png

#!/ bin / sh 
for jpg ;  do                                   #指定された各ファイル名の代わりに$ jpgを使用し、次に
    png = $ { jpg %.jpg } .png                       #.jpgを.pngに置き換えてファイル名のPNGバージョンを作成しますprintf'converting 
    "  %s" .. .. \ n '  " $ jpg "     #変換する場合、スクリプトを実行しているユーザーにステータス情報を出力します
    " $ jpg " jpg.to.png ; 次に、#convert(ImageMagickが提供)を使用して、一時ファイル
        mv jpg.to.png " $ png "にPNGを作成します。                         #機能する場合は、一時的なPNG画像の名前を正しい名前に変更し
    ますelse                                      #...それ以外の場合は、文句を言ってスクリプトを終了します
        printf > 2'jpg2png  :エラー:「jpg.to.png」に保存された出力に失敗しました。\ n ' 
        exit  1 
    fi                                        #「if」テスト構造の
終了                                         #「for」ループの終了
printf  'すべての変換が成功しました\ n'         #ユーザーに朗報を伝えます

jpg2pngコマンドは、JPEG画像でいっぱいのディレクトリ全体で実行できます/home/username/bin/jpg2png *.jpg

プログラミング

最新のシェルの多くは、制御フロー構造、変数、コメント、配列、サブルーチンなど、通常はより高度な汎用プログラミング言語でのみ見られるさまざまな機能も提供します。このような機能が利用できるので、かなり洗練されたアプリケーションをシェルスクリプトとして書くことができます。ただし、ほとんどのシェル言語は、データ入力システム、クラス、スレッド化、複雑な数学、およびその他の一般的な完全な言語機能をほとんどまたはまったくサポートしておらず、コンパイルされたコードや記述されたインタプリタ言語よりも一般的にはるかに遅いという事実によって、依然として制限されていますパフォーマンスの目標としてスピードを持っています。

標準のUnixツールsedおよびawkは、シェルプログラミングのための追加機能を提供します。Perlは、 Tclなどの他のスクリプト言語と同様にシェルスクリプトに埋め込むこともできますPerlとTclにはグラフィックツールキットも付属しています。

その他のスクリプト言語

大きすぎたり複雑すぎて通常のシェルスクリプトでは快適に処理できないタスクのために、多くの強力なスクリプト言語が導入されていますが、スクリプトの利点が望ましく、本格的なコンパイル済みプログラミング言語の開発オーバーヘッドは不利になります。 。スクリプト言語と高級プログラミング言語を区別するものの詳細は、頻繁に議論される情報源ですが、一般的に言えば、スクリプト言語はインタプリタを必要とする言語です。

ライフサイクル

シェルスクリプトは、ソフトウェア開発の初期段階として機能することが多く、後で別の基盤となる実装に変換されることが多く、最も一般的にはPerlPython、またはCに変換されます。インタプリタディレクティブを使用すると、ファイル名拡張子として公開されるのではなく、実装の詳細をスクリプト内に完全に隠すことができ、エンドユーザーに影響を与えることなくさまざまな言語でシームレスに再実装できます

「.sh」ファイル拡張子を持つファイルは通常、ある種のシェルスクリプトですが、ほとんどのシェルスクリプトにはファイル拡張子がありません。[7] [8] [9] [10]

長所と短所

おそらく、シェルスクリプトを作成する最大の利点は、コマンドと構文がコマンドラインで直接入力されたものとまったく同じであることです。スクリプトが別の言語で記述されている場合や、コンパイルされた言語が使用されている場合のように、プログラマーはまったく異なる構文に切り替える必要はありません。

多くの場合、シェルスクリプトの記述は、他のプログラミング言語で同等のコードを記述するよりもはるかに高速です。多くの利点には、簡単なプログラムまたはファイルの選択、クイックスタート、およびインタラクティブなデバッグが含まれます。シェルスクリプトを使用して、既存のプログラムに関する順序付けと意思決定のリンクを提供できます。中程度のサイズのスクリプトの場合、コンパイル手順がないことが利点です。解釈的実行により、デバッグコードをスクリプトに記述し、それを再実行してバグを検出および修正することが容易になります。専門家でないユーザーは、スクリプトを使用してプログラムの動作を調整できます。シェルスクリプトは、マルチプロセッシングの範囲を制限します。

一方、シェルスクリプトは、コストのかかるエラーが発生する傾向があります。rm -rf * /(意図されたものではなく)などの不注意な入力エラーrm -rf */は、Unixコミュニティでは民間伝承です。余分なスペースが1つあると、コマンドは、現在のディレクトリに含まれているすべてのサブディレクトリを削除するコマンドから、ファイルシステムのルートディレクトリからすべてを削除するコマンドに変換されます。同様の問題が危険な武器に変わる可能性があり、リダイレクトを誤用cpするファイルの内容が削除される可能性があります。これは、多くのUNIXコマンドの名前が1文字だけ異なるという事実によってさらに問題になります、、、、などmv>cpcddddf

もう1つの重大な欠点は、実行速度が遅く、実行されるほとんどすべてのシェルコマンドに対して新しいプロセスを起動する必要があることです。効率的なフィルターコマンドがほとんどの作業を実行するパイプラインを設定することでスクリプトのジョブを実行できる場合、速度低下は軽減されますが、複雑なスクリプトは通常、同等のタスクを実行する従来のコンパイル済みプログラムよりも数桁遅くなります。

異なるプラットフォーム間の互換性の問題もあります。Perlの作成者であるLarryWallは、「シェルスクリプトよりもシェルを移植する方が簡単だ」と有名に書いています。[この引用には引用が必要です]

同様に、より複雑なスクリプトは、シェルスクリプト言語自体の制限にぶつかる可能性があります。制限により、高品質のコードを作成することが困難になり、元のシェル言語の問題を改善するためのさまざまなシェルによる拡張により、問題が悪化する可能性があります。[11]

一部のスクリプト言語を使用することの多くの欠点は、言語の構文または実装内の設計上の欠陥によって引き起こされ、必ずしもテキストベースのコマンドラインの使用によって課せられるわけではありません。他のシェルプログラミング言語、またはScshSchemeを使用)のような本格的な言語を使用するシェルがいくつかあります

他のオペレーティングシステムでのシェルスクリプト

CygwinMKS ToolkitInterix(Microsoft Windows Services for UNIXで利用可能)、Hamilton CシェルUWIN (AT&T Unix for Windows)などの相互運用性ソフトウェアを使用すると、WindowsNTおよびその後継者であり、MS-DOSWindows 95ブランチ)およびOS / 2用の以前のMKSToolkitバージョンの機能が一部失われています。 Windowsタイプのオペレーティングシステム用の少なくとも3つのDCL実装—コマンドシェル、 Windows Script Host、およびCGIで使用される多目的スクリプト言語パッケージであるXLNTに加えてプログラミング—これらのシステムでも利用できます。Mac OSX以降もUnixライクです。[12]

前述のツールに加えて、一部のPOSIXおよびOS / 2機能は、Windows2000までのWindowsNTオペレーティングシステムシリーズの対応する環境サブシステムでも使用できます。MS-DOSサブシステムと呼ばれることが多い3番目の16ビットサブシステムは、これらのオペレーティングシステムに付属のCommand.comを使用して、前述のMS-DOSバッチファイルを実行します。[13]

コンソールの代替案4DOS4OS2FreeDOSPeterNortonNDOSおよび4NT / Take Commandは、Windows NTスタイルのcmd.exe、MS-DOS / Windows 95バッチファイル(Command.comで実行)、OS /に機能を追加します。 2のcmd.exeと4NTはそれぞれ、それらが拡張するシェルに似ており、Windows Script Hostとより統合されています。WindowsScriptHostには、VBScript、 JScriptVBAの3つのエンジンがプリインストールされており、多数のサードパーティエンジンがこれに対応できます。追加され、Rexx、Perl、Python、Ruby、およびTclには、4NTおよび関連プログラムで事前定義された機能があります。PC DOSはMS-DOSと非常に似ていますが、DRDOSはもっと違います。以前のバージョンのWindowsNTは、OS / 2サブシステムによって最新バージョンの4OS2を実行できます。

スクリプト言語は、定義上、拡張することができます。たとえば、MS-DOS / Windows95 / 98およびWindowsNTタイプのシステムでは、シェル/バッチプログラムで、KiXtartQBasic、さまざまなBASICRexxPerlPythonの実装、Windows ScriptHostおよびそのインストール済みエンジンなどのツールを呼び出すことができます。 Unixおよびその他のPOSIX準拠システムでは、awkおよびsedを使用して、シェルスクリプトの文字列および数値処理機能を拡張します。Tcl、Perl、Rexx、およびPythonにはグラフィックツールキットがあり、速度のボトルネックとなるシェルスクリプトの関数とプロシージャをコーディングしたり(C、Fortran、アセンブリ言語などはさらに高速です)、シェル言語では利用できない機能を追加したりできます。ソケットやその他の接続機能、強力なテキスト処理、呼び出し元のスクリプトにこれらの機能がない場合の番号の操作、コードの自己記述および自己変更、再帰などの手法、直接メモリアクセス、さまざまな種類の並べ替えなど、メインスクリプトでは困難または不可能など。Visual Basic forApplicationsおよびVBScriptスプレッドシート、データベース、すべてのタイプのスクリプト可能なプログラム、通信ソフトウェア、開発ツール、グラフィックツール、およびコンポーネントオブジェクトモデルを介してアクセスできるその他のソフトウェアなどを制御および通信するために使用できます

も参照してください

参考文献

  1. ^ Kernighan、Brian W .; Pike、Rob(1984)、「3。シェルの使用」、UNIXプログラミング環境、Prentice Hall、Inc.、p。94、ISBN 0-13-937699-2シェルは実際にはプログラミング言語です。変数、ループ、意思決定などがあります。
  2. ^ 例によるUnixシェル、pp 7-10、
  3. ^ プログラミングPerl、第5版、序文
  4. ^ "osh --manned.org"manned.org 2019年1月16日取得
  5. ^ a b ジョンソン、クリス(2009)。 [1] Pro Bashプログラミング:Linuxシェルのスクリプト作成、Apress、2019年9月27日に取得。ISBN9781430219989 
  6. ^ "exec(3p)–POSIXプログラマーズマニュアル" 2020年7月24日取得
  7. ^ ロビンズ、アーノルド; ハンナ、エルバート; ラム、リンダ(2008)。viとVimのエディターを学ぶp。205. ISBN 9781449313258
  8. ^ イーストーム、チャック(2012)。Essential Linux Administration ::初心者向けの包括的なガイドp。228. ISBN 978-1435459571
  9. ^ Kumari、Sinny(2015年11月23日)。Linuxシェルスクリプトの要点Packt Publishing Ltd. ISBN 97817835523752017年5月7日取得シェルスクリプトにファイル拡張子を使用するのではなく、拡張子のないファイル名を保持し、インタプリタがshebang(#!)を調べてタイプを識別できるようにすることをお勧めします。
  10. ^ テイラー、デイブ; ペリー、ブランドン(2016年12月16日)。Wicked Cool Shell Scripts、2nd Edition:Linux、OS X、およびUNIXシステム用の101スクリプトスターチプレスはありません。ISBN 97815932760272017年5月7日取得シェルスクリプトは特別なファイル拡張子を必要としないため、拡張子を空白のままにします(または、必要に応じて拡張子.shを追加できますが、これは必須ではありません。
  11. ^ クリスチャンセン、トム。「有害と考えられるCshプログラミング」
  12. ^ MSDN [検証するのに十分具体的ではありません]
  13. ^ Windows NT4ワークステーションリソースキット

外部リンク