しかし、一口にシェルと言っても、B shell、C shell、bash などいろいろな種類があるんですね。
使用しているディストリビューションがサポートしているならどれでも使えるということなので、それぞれ特徴を考慮してどれを使うかを選択すればいいようです。
しかし、そう言われても特徴を意識しなければならないほど難しいことをしようと思っているわけでもないですし、どれを使うか戸惑ってしまいます。
Linux の標準は一応 bash らしいので、bash を使うことにしましたが、オープンソースの世界ならではの利点というか欠点というか...ビシッと統一してもらいたいというのが本音です。(せめて文法くらいはね^^;)
と、シェルの種類自体もいろいろあるのですが、その実行方法にもいろいろあるようです。
シェルスクリプトを直接実行する
シェルスクリプト名を記述するだけで実行できればそれが一番楽です。しかし、この方法ではシェルスクリプト自身に実行権限がなければ実行できないのが難点です。
例えば、以下のように実行権限が与えられていないシェルスクリプトを実行しようとすると権限エラーになります。
$ ls -l -rw-rw-r-- 1 user user 1238 1月 12 11:07 test.sh $ ./test.sh -bash: ./test.sh: 許可がありません
以下のように実行権限を付与すると、正常に実行できます。
$ chmod u+x test.sh $ ls -l -rwxrw-r-- 1 user user 1238 1月 12 11:07 test.sh $ ./test.sh test
ただ、カレントディレクトリ上にあるシェルスクリプトを実行する場合でも、パスの記述は必要なようで、単にシェルスクリプト名を記述しただけでは以下のようにエラーになってしまうようです。
$ test.sh -bash: test.sh: command not found
ちょっとうっとおしいですね。
シェルの起動時に引数としてシェルスクリプトを指定する
シェルの起動時にシェルスクリプト名を指定する方法もあります。$ bash test.sh test
この方法だとシェルスクリプト自身に実行権限がなくても実行できます。
ドットコマンド(source コマンド)の引数としてシェルスクリプトを指定する
通常は上記のいずれかの方法でシェルスクリプトを実行するのが一般的なようですが、いずれの方法も、元のシェルから新たなシェルが起動されてシェルスクリプトが実行されるため、シェルスクリプト間で変数や関数を共有するができません。シェルスクリプトの中から別のシェルスクリプトを呼び出して、両シェルスクリプト間で変数や関数を共有したい場合は、ドットコマンドを使用します。
test1.sh
#!/bin/bash VAR1="test1" . test2.sh echo "VAR2=$VAR2"test2.sh
#!/bin/bash VAR2="test2" echo "VAR1=$VAR1"
$ bash test1.sh VAR1=test1 VAR2=test2
この方法でもシェルスクリプト自身に実行権限がなくても実行できます。
これらの実行方法もTPOに応じて適宜選択すればいいようですが、混乱を避ける意味でもある程度のポリシーは決めておいたほうがいいかもしれませんね。