🐚
【シェルスクリプトの実行について】sourceコマンドとzshコマンドを例に
概要
シェルスクリプトの実行について、$ source シェルスクリプト
と$ zsh シェルスクリプト
の違いを例に説明します。
例えば、echo $SHELL
で返ってくるのがzshである場合$ zsh シェルスクリプト
と$ source シェルスクリプト
は同じだと思ってましたが全然違いました。
※shebangも実行権限も与えられていない以下のようなシェルスクリプトが前提です
homesize-noshebang.sh
du -h ~ | tail -n 1
※パターンAもパターンBもLinuxカーネルではなくシェルが解釈するので、
#行はコメントとして無視されます。shebangが有効なのはシェルにファイル名だけが入力されたときです。
パターンA: $ source シェルスクリプト
$ source シェルスクリプト
- 引数に渡したシェルスクリプトの内容を、今まさに開いているターミナル(カレントシェル)に直接入力しているイメージ
特徴
- 現在進行形で開いているカレントシェルが実行するので、そこでの設定の影響を受ける(当然)
- シェルスクリプト単体で実行するわけではない(カレントシェルが実行している)からシェルスクリプト自体に実行権限は不要
- ターミナルを再起動する手間を省いて、カレントシェルに設定更新を反映させたい!というときに用います。(逆にそれ以外あまり使わない気がします、、)
パターンB: $ zsh シェルスクリプト
※zshに限らず、sourceコマンド以外のシェルコマンドでシェルスクリプトを実行するときの説明です。zshではない人は適宜bash等に読み替えてください。
$ zsh シェルスクリプト
- カレントシェルの内容を引き継いでいない新しいシェル(サブシェル)が起動する
- サブシェルの中でシェルスクリプトが実行される
- 実行後、カレントシェルに戻ってくる(カレントシェルにはサブシェルでの変更は反映されない)
特徴
- カレントシェルで設定したエイリアスをサブシェルの中で使おうとしたところでサブシェルの中では利用できない(サブシェルはカレントシェルの内容を引き継がないため)
- 反対に、サブシェル内で新たにエイリアスを設定したとしても、カレントシェルには反映されません
- シェルスクリプト単体で実行するわけではない(サブシェルが実行している)からシェルスクリプト自体に実行権限は不要
補足
カレントシェルとサブシェル
- カレントシェル
- 今まさに開いているシェル
- サブシェル
- カレントシェルとは全く別物で、カレントシェルの内容を引き継いでいない新しく起動される子プロセスのシェル
- カレントシェルに影響を与えることも与えられることもない無関係なシェル
参考
Discussion