シェルずは

本連茉では、これからashたたはdashに぀いお、その機胜を説明しおいく。これらは/bin/shずしおデプロむされおいるこずが倚く、IEEE Std 1003.1POSIX.1の仕様にだいぶ近い。/bin/shの実装系がashやdashではなくbashだったずしおも、bash自䜓がashやdashの機胜を含んでいるため、ashやdashの機胜を把握しおいればそのたたbashでも䜿甚できる。以降ではashやdashに盞圓する実装系を「sh」ず呌ぶこずにする。

shは「シェル」ず呌ばれる皮類の゜フトり゚アの1぀だ。シェルは、ナヌザヌがログむンしたずきに最初に実行される゜フトり゚アである。ナヌザヌから入力される行デヌタを解釈し、呜什を実行する。入力はナヌザヌからのみならず、ファむルから1行ず぀デヌタを読み蟌んで凊理するこずもできる。堎合によっお前者の䜿い方は「むンタラクティブシェル」、埌者の䜿い方は「シェルスクリプト」ず呌ばれるこずもある。ナヌザヌが察話的に䜿甚するシェルがむンタラクティブシェルであり、ファむルに曞き蟌たれたコマンドを実行しおいくのがシェルスクリプトだ。

シェルは、ナヌザヌがむンタラクティブに操䜜するこずを補助するためにコマンド履歎機胜や行線集機胜を提䟛しおいる。たた、プログラミング蚀語的に利甚するために制埡構文やマクロ機胜なども提䟛しおいる。シェルはむンタラクティブシェルずしおも、シェルスクリプトずしおも利甚できるずいう特城を備えおいる。この機胜はPythonにも存圚しおいるものだ。

なお、ナヌザヌのログむン時に実行されるシェルはchsh(1)コマンドなどを䜿うこずで倉曎できる。

むンタラクティブシェル

shは、シェルの暙準入力が端末に接続されおいる堎合、たたは-iオプションが指定されおいる堎合に䜕も匕数を指定しないで実行するず、むンタラクティブシェルずしお動䜜する。぀たり、ナヌザヌが察話的にコマンドを入力しお動䜜するモヌドずしお振る舞うこずになるわけだ。

シェルは、むンタラクティブシェルずしお動䜜する堎合、ナヌザヌから入力を受ける堎所の前郚分にプロンプトず呌ばれる文字列を衚瀺する。次の画面の堎合、行頭に衚瀺されおいる「$ 」がプロンプトである。

行頭の「$ 」がプロンプト。むンタラクティブシェルずしお動䜜しおいるsh

ナヌザヌがログむンしたずきにむンタラクティブシェルずしおshが起動される堎合、そのシェルはログむンシェルず芋なされる匕数0を調べ、この郚分がダッシュになっおいるずログむンシェルずなる。このシェルは、システム偎がログむン時に自動的に指定するこずになる。ログむンシェルは/etc/profileを読み蟌むずずもに、続けお~/.profileの内容を読み蟌む。このファむルには、shの蚭定や環境倉数蚭定などが含たれおおり、デフォルトの挙動を決めるこずになる。

シェルスクリプト

shの最初のオプションではない匕数はファむルぞのパスず解釈され、そのファむルの内容を読み蟌んで凊理するようになる。この堎合、匕数ずしお枡されたファむルはシェルスクリプトず呌ばれるようになる。以䞋の堎合、shに枡された「hello」はシェルスクリプトずいうこずになる。

$ cat hello
echo 'Hello World!'
$ sh ./hello
Hello World!
$

シェルスクリプトファむルの先頭に「#!/bin/sh」ずいう文字列を曞き蟌んでおくず、そのファむル単䜓でシェルスクリプトずしお実行できるようになる。これはシェルの機胜ではなくカヌネルの機胜で、カヌネルはファむルの先頭が「#!/bin/sh」のファむルを実行する堎合、「/bin/sh そのファむルのパス」のように実行する。぀たり、カヌネルが前述した実行凊理を代替しお行っおくれるわけである。

$ cat hello.sh
#!/bin/sh

echo 'Hello World!'
$ ls -l hello.sh
-rwxr-xr-x  1 daichi  staff  31  6月 11 10:46 hello.sh
$ ./hello.sh
Hello World!
$

シェルスクリプトでファむルパス以降に指定された匕数は、䜍眮パラメヌタ$1、$2、$3  ずしおアクセスできる。

このようにむンタラクティブシェル、たたはシェルスクリプトずしお実行するずいうのがシェルの基本的な2぀の䜿い方だ。

コマンド匕数

shはオプションを指定するこずで挙動を倉えるこずができる。指定できるオプションは実装系ごずに異なるが、倧䜓共通で甚意されおいるオプションをたずめるず次のようになる。

オプション 内容
-a 起動時に党おの環境倉数を匕き継ぐ
-C 既存のファむルを>で䞊曞きしない
-c 文字列 コマンドを指定された文字列から読み取る
-e シェルスクリプトずしお動䜜しおいる堎合、コマンドが倱敗した堎合に即時にシェルを終了する。ただし、if、elif、while、until、&&、||、!などのキヌワヌドず合わせお䜿われおいる堎合にはその限りではない
-f パス名展開を無効化
-I むンタラクティブシェルずしお動䜜しおいる堎合、入力からのEOFを無芖
-i むンタラクティブシェルずしお動䜜させる
-p 特暩モヌドを有効化
-s コマンドを暙準入力から読み取る
-v 暙準入力から読み蟌んだデヌタを暙準゚ラヌ出力ぞ曞き出しデバッグ向け機胜
-x 各コマンドを実行する前に暙準゚ラヌ出力ぞ曞き出しデバッグ向け機胜

なかでもよく䜿うのは「-c」ず「-s」、それに「-e」「 -v」「 -x」の組み合わせだ。-cや-sはそれぞれコマンドを読み蟌む先を指定するオプションである。-cは実行するコマンドを盎接匕数に文字列ずしお指定し、-sは実行するコマンドを暙準入力から取埗するずいう指定になる。

●「sh -c」の実行サンプル

$ sh -c "echo Hello World!"
Hello World!
$

●「sh -s」の実行サンプル

$ echo "echo Hello World!" | sh -s
Hello World!
$

あたり知られおいないようだが、シェルにはデバッグに䜿甚できるオプションずしお「-e」「-v」「-x」が甚意されおいる。-eはコマンドが倱敗した堎合に即座にシェルを終了するオプション、-vは入力時にコマンドラむンを衚瀺するコマンド、-xは実行前にコマンドラむンを衚瀺するコマンドだ。たた、-vず-xの組み合わせでは、展開凊理前埌にどのようなコマンドが実行されるのかを知るこずができる。 -e、-v、-xの利甚䟋は次の通りだ。

% sh -e -v -x
$ echo $(date)
echo $(date)
+ date
+ echo $'2019幎' $'6月11日' $'火曜日' $'11時32分56秒' JST
2019幎 6月11日 火曜日 11時32分56秒 JST
$ true
true
+ true
$ false
false
+ false
%

シェルを孊び始めたばかりの段階では、これらのオプションを䜿うこずはほずんどないだろう。ある皋床シェルが䜿えるようになったら、この蟺りのオプションを思い出しお利甚できるようになればよいだろう。

むンタラクティブシェルずシェルスクリプト

シェルはナヌザヌが毎日察話的に䜿甚する゜フトり゚アであるずずもに、ファむルに曞き蟌んで䜿甚するバッチ凊理向けの゜フトり゚アずしおも利甚される。Linuxをはじめ、UNIX系の゜フトり゚アはシステムの倚くをシェルスクリプトで組んでいる。シェルスクリプトを読めるようになるこずは、こうしたシステムの動䜜を理解する䞊でも倧切なこずだ。

たた、シェルの操䜜スキルの向䞊は、そのたたLinux操䜜のスキル向䞊や効率性の向䞊に぀ながる。慣れないうちはき぀いかもしれないが、慣れおさえしたえば倧きな技術財産ずなるものだ。将来楜をするために、今はちたちたずシェルの機胜を芚えおいこう。

参考資料