前回の記事ではスクリプトを記述したテキストファイルに実行権を与えて、実行していましたが、実行権を与えず、shコマンドを使用して実行することもできます。

まず、viコマンドで以下のテキストファイルを作成します。

$ vi sample02.sh"
echo "Hello."
echo "bye."

今回はテキストファイルに実行権を与えず、shというコマンドで実行します。

# sh ./sample02.sh

実行結果

Hello
bye

このshコマンドは、シェルそのものです。シェルもまたLinux上のプログラムであるので、コマンドとして実行できるのです。

シェルの引数にスクリプトファイルを指定することで、「shを使ってスクリプトファイル(sample02.sh)を実行する」という意味になります。

shだけでなく、以下例のようにbashで実行することもできます。

# bash ./sample02.sh

実行結果

Hello
bye

引数とは

プログラム(コマンド)に、処理対象となるものを与える場合があります。その処理対象として与えるものを引数といいます。
例えばcpコマンドは、コピー元とコピー先という2つの引数を取ります。whoamiコマンドは引数を取りません。
(cpはファイルなどをコピーするコマンド、whoamiは現在のユーザー名を表示するコマンドです。)

$ cp file1 file2    引数が2つ
$ whoami      引数なし

スクリプトに起動するシェルを記述する方法

スクリプトに起動するシェルを記述することもできます。

$ vi sample03.sh
#! /bin/sh
echo "Hello."
echo "bye."

作成したファイルに実行権を与えて、sample03.shを実行します。

$ chmod u+x sample03.sh
$ ./sample03.sh

実行結果

Hello.
bye.

「sample03.sh」を実行することで、

①まずシェルというプログラムが起動され、
②そのシェルがコマンドを実行する
③コマンドが終了すればシェルも終了する

という流れで実行されます。

補足:
#!から始まる1行目で、スクリプトを読み込むシェルを指定していますが、この行のことをshebang(シバン)と言います。shebangは造語であり、ハッシュ・バンまたはシェル・バンを縮めたもので、shebangという言い方が一般化しています。
上記サンプルでは、スクリプトの先頭行に「#!/bin/sh」と記述しています。shなので、Bourne Shellを使用していると思われるかもしれませんが、今どきのOSでは、Bourne Shellではなく実際にはBourne Shellの機能拡張版であるbashが起動しています。

以下コマンドで「/bin/sh」が「/bin/bash」へのシンボリックリンクになっていることを確認できます。

# ls -la /bin/sh
lrwxrwxrwx. 1 root root 4 Sep 30  2013 /bin/sh -> bash

まとめ

シェルスクリプトの実行方法をまとめる以下になります。

  • スクリプトファイルに実行権を与える方法。起動するシェルは、デフォルトのシェルと同じ。
  • シェル(sh)コマンドの引数として実行する方法。スクリプトファイルに実行権は与えない。起動するシェルは、起動したシェル。
  • スクリプトファイルの1行目にシェルを指定する方法。スクリプトファイルに実行権を与える。起動するシェルは、1行目で指定したもの。

なお、シェルコマンドで実行した場合、スクリプトの1行目でシェルを指定しても、その指定は無視されます。