linuxコマンドでshスクリプトを実行する方法は全部で3つあります。
本記事では、それらの紹介と違いについて説明しようと思います。
よろしくお願いします!!!
shスクリプトの実行方法
shスクリプトは以下3つの方法で実行できます。
カレントディレクトリのhoge.shを実行する例です。
$ ./hoge.sh
$ bash hoge.sh
-
$ source hoge.sh
または$ . hoge.sh
※source
と.
は同義です
1. $ ./hoge.sh
shスクリプトを直接実行する方法です。
この方法でshスクリプトを実行する場合は、ファイルに実行権限が必要になります。
ちょっと実験してみます。
カレントディレクトリに以下のhoge.shを用意します。
echo hi
権限はとりあえずフルで与えておきます。
-rwxrwxrwx
この状態で$ ./hoge.sh
を実行すると成功します。
$ ./hoge.sh
hi
では、実行権限のみを剥奪して再度実行してみます。
$ sudo chmod 666 hoge.sh
$ ./hoge.sh
zsh: permission denied: ./hoge.sh
するとこんな感じで失敗します。
ちなみに、hoge.shがカレントディレクトリにあるからといって$ hoge.sh
などとしても動きません。
zsh: command not found: hoge.sh
これは、ファイル名のみを指定してスクリプトを実行しようとすると、環境変数PATHに登録されたパスからファイルを検索しようとするためです。
逆に言うと、環境変数PATHに登録されたパス(/binなど)にhoge.shを置くと、$ hoge.sh
は成功します。
2. $ bash hoge.sh
インタプリタを指定する方法です。
やってることはpython hoge.py
とかと同じですね。
1の方法ではファイルに実行権限が必要でしたが、この方法の場合は実行権限は必要なく、read権限のみあれば実行できます。
実験です。
$ sudo chmod 444 hoge.sh
$ bash hoge.sh
hi
成功しましたね。
これは、あくまでもユーザが実行しているのはbashというプログラムであり、ファイルそのものを実行しようとしている訳ではないためです。
bashを起動できれば、ファイルの中身に何が書かれているかさえ分かればファイルを実行できるので、read権限だけあれば良いという訳です。
3. $ source hoge.sh
または$ . hoge.sh
この方法も2と同じく、インタプリタを指定する方法です。
では2と何が違うのかというと、
2は現在実行中のbashとは別のbashでファイルの中身を実行する
3は現在実行中のbashでファイルの中身を実行する
といった違いがあります。
やっていることは2と変わりません。
まとめ
個人的に、現在使用中のシェルに反映させたい処理(環境変数とか)がある場合などを除き、2の方法で実行するのが良いと思いました。
Dockerなどを使っていると知らぬ間にファイルのpermissionが変わっていて、スクリプトの起動コマンドが効かなくなってしまうシーンがちょこちょこ発生します。
read権限のみ残っていればスクリプトを実行できる2の方法はコンテナのそうした事情に割と柔軟に対応できるので気に入っています。