電気ひつじ牧場

技術メモ

シェルスクリプト実行方法いろいろ

シェルスクリプトを実行する際にsourceとか./とか実行方法がいろいろあってたまにわからなくなるのでまとめておきます。
bashでscript.shを実行することを想定しています。

準備

以下のような内容のファイルを用意します。

script.sh
#!/bin/bash
echo foo
bar="bar"
hoge
.bashrc
alias hoge="echo hoge"

$source script.sh

sourceはコマンドを実行した現在のbashプロセスを用いてスクリプトを実行します。つまりプロセスがフォークしません。よって現在のインタラクティブシェルを起動した時に読み込まれる.bashrcで定義されている内容を使うことができますし、スクリプト内でシェルを終了させるexitなどを記述するとsourceを実行したシェルが終了します。またスクリプトで定義/変更した変数はスクリプトの実行が終了した後も利用できます。#!/bin/bash(シェバング)を記述しなくても実行できます。

$ source script.sh
foo
hoge

$ echo $bar
bar

エイリアスとして定義されているコマンドを実行できました。変数も利用できてます。

$ . script.sh

. (ピリオド)でもシェルスクリプトを実行できます。これはsourceのエイリアスなので、$ source scriptとした場合と同じ挙動をします。

$ ./script.sh

これはスクリプトの内容をコマンドとして実行するので、新たなbashプロセスを立ち上げます。sourceの時と違い、エイリアスで定義されているコマンドを使ったり、シェバングを省略するとエラーになります。また実行する前に実行権限を与える必要があります。

$ chmod +x script.sh
$ ./script.sh
foo
./sourceTest.sh: line 4: hoge: command not found
$ echo $bar

hogeコマンドが見つからないよと怒られます。またスクリプト終了時に$barが破棄されているのがわかります。

$ bash script.sh

基本的には上の$ ./script.shと同じく別プロセスが立ち上がりますが、ファイルの実行権限は必要ありません。

$ sh script.sh

これはbashの祖先であるBourne Shellを立ち上げます。基本的に$bash script.shで実行した場合と同様ですが、bashで使うことのできる一部の機能が利用できないことがあります。