OSであるUNIXから生まれたshell(シェル)は、UNIX/Linuxのユーザーインタフェースの基本として文字ベースのCUI(character User Interface)・コマンドライン入力におけるコマンド群をサポートするプログラムであり、単に『シェル』と言うとこの(端末/ターミナル/コンソール上で行う)ログイン・ログアウト機構を含めたコマンド入力プログラムを指し、シェルというその名前の由来は一説にはOSの機能を包み隠すことから木の実の皮・殻(貝でいえば殻)であるといわれています。
UNIX/Linuxでは、その歴史からもシェルにはsh/bash/ksh/csh/tcsh/zshなど派生を含む複数の種類があり、一般に(インストールされていれば)切り替えて使うことができ、シェルの利用を含め、そのシェルの機能を使って明示的にログインするところから始まるのが普通です。
login :
password :
例えば、このようにアカウント名とパスワード(パスフレーズ)を入力してログインし、ログイン後(ログイン中のシェルということでログインシェル)は、シェルの種類に応じて画面上にシェルプロンプトが表示された入力待ちの(シェルが待機している)状態になります。
$
このようにシェルプロンプトが表示された場合、キーボードからの入力を受け付けるようになり、この入力行を特にコマンドラインと呼びます。
コマンドラインは、基本的にshellに処理命令(コマンド)を送る為の入力欄です。
プロンプトが$であれば、(環境変数を変更していなければ普通は)shかbash、kshなどのBourne Shell系のシェルだろうという予測ができます。
$ ps
PID PPID PGID TTY UID STIME COMMAND
1234 5678 2234 1 1000 10:00:00 /usr/bin/bash
...
※process statusの略
ここで例えばpsコマンドを実行すると、このように表示されますが、これにより/usr/bin/のbashというプロセスが待機していることがわかり、この例では一番右側のCOMMAND列にパスが表示されていますが、そこにあるbashがまさにシェルです。
$ who
尚、bashでログインしているユーザーを調べるにはコマンドラインからwhoと入力してEnterを押せば自分以外にも誰かログインしていれば表示され、
$ whoami
複数のアカウントを持つことも珍しくないので自分が誰か(今なんと言うユーザー名でログインしているか)を調べるには同じくwhoamiとすればユーザー名が表示されます。
シェルでの基本操作における操作命令やその操作命令の機能は「シェルコマンド」、または単に「コマンド」、CUIのその入力行を「コマンドライン」、コマンドラインへの入力を「コマンドライン入力」などと言い、他に「シェルスクリプト」「シェル関数」「ワンライナー」「パイプライン」などと呼ばれるスタイルもあります。
尚、使っているPCのOSがWindowsだとしてもシェルを含め利用できるUNIX/Linux環境や方法はいくつもあります。
UNIX/Linuxにおけるコマンドには使用するシェルにあらかじめ組み込まれているシェル組み込みコマンドとそれ以外の(一部同名コマンドもありますが)システムに必須のコマンドとその他コマンドがあります。
また、Linuxの場合、その多くはGNU make/gmake、cc/gcc、dbx/gdb、gprof...などのGNUコマンドであり、シェルの1つであるbashも後述の通りGNUプロジェクトによって拡張されたシェルです。
ただ普通はシェルコマンドもシステムコマンドもGNUコマンドもコンソールからのコマンド入力やスクリプトに記述する際も特に区別して意識することなく利用されています。
更にシェルはPerl、Python、Rubyなどのようにファイルに記述しスクリプト言語として、時にグルー言語として柔軟かつ強力な実装を可能にします。
#!/bin/sh
コマンド
...
シェルスクリプトは他のスクリプト同様に一行めにインタプリタの場所を記述し、shであれば(Bourne Shell)このようにコマンドやシェル関数などを記述し、ファイル名は拡張子の有無含め自由ですが、xxx.shといったシェルとわかりやすい拡張子付きのファイル名で保存することもあります。
尚、インタプリタ指定はbashやkshなどでもshとすればBourne Shell系のshell環境においてスクリプトファイルの相応の互換性を持つこともできます。
もちろん、シェルには条件分岐やループなどの制御構造もあり、クラスこそありませんが、他のスクリプトはシェルの拡張ともいえるのでシェルスクリプトでも様々なことができます。
このようにファイルにシェルコマンドを記述し(実行権限を与えられ)た実行ファイルは「シェルスクリプト」と呼ばれます。
インタプリタとは実行都度ソースコードを解釈する形態で主にシェルを含むそうしたスクリプトを指し、明示的なコンパイルを要するプログラミング言語と対比されることが多いようです。
とは言え、明確な対比は難しく、それなりの用途で使い分けされている面もありますが、コンパイルを要する言語と同じ機能を実装しようとすれば、その処理速度がネックになると考えられているということはあるものの、手軽でありながら簡易ツールから本格的な用途まで使えるという点ではより優れているとも言えます。
また、UNIX/Linuxコマンド群は、かなりの点においてその基本が一貫している上、積極的に相互利用できるものはするのが当然という文化的、歴史的背景もあり、shやbashなどシェルスクリプトにおいては特に普段コマンドラインから利用しているコマンドやその組み合わせであり柔軟性と汎用性があります。
更にコマンドとして、実行権限を付与すればすぐに使えるスクリプトとして、その実行は、コマンドラインから、他のスクリプトファイルから、他のプログラムから、CGIとしてHTMLファイルやWebサーバなどから、自動実行させるcronからと様々な実行環境から手軽に利用できる点も大きな魅力の1つでしょう。
シェルが他のプログラム(スクリプト)とともに利用することもできプログラムをつなげる役割を担うことも可能であることから「糊」に例えて『グルー言語』などと呼ばれる事もありますが、シェルに限らず他のスクリプトでもこのように使われる際にはグルーと呼ばれることがあります。
UNIX/Linuxでは、awk、sed、Perl、Python、Rubyやfind、grepなど他のコマンドとの組み合わせなど含めスクリプトに書いても不思議はない、(一連の処理が1つにまとめられ)一行で書かれた簡潔に完結したコマンドラインから実行されるコマンドを特に「ワンライナー」と呼びます。
尚、one-liner/onelinerを英和辞典で調べてみると「短いジョーク」「気の利いた寸評」「一行に収まるほどの面白い言葉」などと訳されています。
$ perl -e 'print "[簡潔に完結]って面白いでしょ!\n"'
[簡潔に完結]って面白いでしょ!
例えば。。。
こんな感じ!?
(このネタ!?の続きはフロー制御構造サンプルへ)