シェルスクリプトとは普段、ターミナル上で実行するコマンドなどがまとまったファイルを指します。
シェルスクリプトは、上から順番にコマンドが実行されていくので、いちいちコマンドを打たなくて済むので便利です。
プログラミング言語のように条件分岐や繰り返し処理も可能です。
実行方法
シェルスクリプトを実行する際、大きく3つの方法があります。
1つ目は、bashコマンドやshコマンドを使う方法です。
sample.shを実行する場合、以下のように記述します。引数にファイル名を渡しています。
$ bash sample.sh
2つ目として、ファイルをコマンドとして実行する方法もあります。この場合は、ファイルに実行権が必要になります。
$ ./sample.sh
3つ目として、sourceコマンドを使う方法です。引数にファイル名を指定してます。
$ source sample.sh
これら3つは、同じ挙動をしているのでしょうか。
1.bashコマンド
bashコマンドは、新たにbashシェルを開いて引数のシェルスクリプトを実行します。実行が終了すると元のシェルに戻ります。
新規にターミナルを立ち上げて実行しているようなイメージです。しかし、ターミナルとシェルは違うものであるため、厳密には正しくありません。
bashコマンドは、bashシェルを開いて実行しますが、ほかのシェル(tcsh,zsh)のコマンドもそれぞれのシェルを開いて実行しています。
2.ファイルをコマンドとして実行
これもbashコマンドと似ており、シェルスクリプトの一行目のshabangを読み取り、そのコマンドで実行します。
そのshabangで指定したコマンドのシェルを新たに立ち上げて実行します。shabangが「#!/bin/bash」である場合、bashコマンドと同じく、新たにbashシェルを立ち上げて実行します。
シェルスクリプトをコマンドとして実行するには、ファイルに実行権が必要です。
3.sourceコマンド
sourceコマンドとは、紹介した2つの方法とは異なり、現在のシェルでシェルスクリプトを実行します。
Linuxで~/.bashrcファイルを編集して反映するため、sourceコマンドを用いると思います。
新たなシェルで実行と現在のシェルで実行とで何が違うの
大半の処理は、新たなシェルで実行しても現在のシェルで実行しても同じになります。
また、ユーザーには新たなシェルで実行したのか現在のシェルで実行のかは見た目では分かりません。
では、何が異なるのか説明します。
sourceコマンドの際、~/.bashrcファイルを編集して反映するため、sourceコマンドを用いると思いますが、もちろんbashコマンドでも実行できます。
bashコマンド、ファイルで実行する場合、新たなシェルで実行するため、~/.bashrcで変更した内容が反映されません。再度、ログインしなければなりません。
一方、sourceコマンドでは、現在のシェルで実行するため、~/.bashrcで変更した内容が反映されます。
また、シェルスクリプト内でcdコマンドを用いる際、bashコマンドやファイルで実行するとcdコマンドは適用されません。
なぜなら、新たなシェルでディレクトリの移動がされても、終了すれば元のシェルに戻ってしまうからです。
まとめ
シェルスクリプトの実行方法を紹介しました。
bashコマンドやファイルで実行する場合、新たなシェルを開いて実行しています。
一方、sourceコマンドでは、現在のシェルで実行しています。
以前の私は、このようなことを知らなかったため、四苦八苦しました。それがこちらの記事になります。