このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:シェルスクリプトの実行方法による違い
シェルスクリプトの実行方法による違い
シェルスクリプトの実行方法には複数の方法があり、それぞれ動作や効果が異なります。シェルスクリプトを正しく活用するためには、これらの違いを理解しておくことが重要です。ここでは、シェルスクリプトの主な実行方法とその違いについて、具体的な例とともに解説します。
シェルスクリプトの実行方法
シェルスクリプトを実行する主な方法は以下の3つです。
- ファイル名のみを指定して実行する
./script.sh - シェルの引数として実行する
bash script.sh source
コマンドを利用して実行する
source ./script.sh
以下の表に、各実行方法の特徴をまとめます。
実行方法 | 特徴 | シェバン必要性 | 実行権限 |
---|---|---|---|
ファイル名を指定して実行(./ ) | シェバンで指定されたシェルで新しいプロセスとして実行される | 必要 | 必要 |
シェルの引数として実行(bash ) | 指定したシェルで新しいプロセスとして実行される | 不要 | 不要 |
source コマンドを利用して実行 | 現在のシェル環境でスクリプトが読み込まれ、同じプロセスで実行される | 不要 | 不要 |
実行方法による動作の違い
1.ファイル名のみを指定して実行する(./script.sh
)
- シェルスクリプトの先頭にシェバン(
#!
)が必要です。 - スクリプトは新しいシェルプロセスで実行されます。
- カレントシェルの環境(エイリアスや関数など)は引き継がれません。
- スクリプトファイルに実行権限が必要です。
2.シェルの引数として実行する(bash script.sh
)
- シェバンは不要ですが、記述してあっても問題ありません。
- スクリプトは指定したシェルの新しいプロセスで実行されます。
- カレントシェルの環境は引き継がれません。
- スクリプトファイルに実行権限は不要です。
3.source
コマンドを利用して実行する(source ./script.sh
)
- シェバンは不要です。あっても無視されます。
- スクリプトはカレントシェル内で実行されます。
- カレントシェルの環境(エイリアス、関数、変数など)がそのまま引き継がれます。
- スクリプト内で設定した変数やエイリアスはカレントシェルにも影響を与えます。
- スクリプトファイルに実行権限は不要です。
実行方法の違いによる具体的な例
エイリアスを利用するシェルスクリプトの作成
まず、lsl
というエイリアスを利用するシェルスクリプト script.sh
を作成します。
ステップ1:script.sh
の作成
user01@ubuntu:~$ nano script.sh
script.sh
の内容
#!/bin/bash
lsl /
解説
#!/bin/bash
:スクリプトがbash
で実行されることを指定しています。lsl /
:エイリアスlsl
を使用してルートディレクトリの詳細情報を表示します。
ステップ2:エイリアスの設定
カレントシェルに lsl
というエイリアスを設定します。
user01@ubuntu:~$ alias lsl='ls -l'
解説
alias lsl='ls -l'
:lsl
というエイリアスをls -l
に設定します。
実行方法による違いの確認
1.source
コマンドで実行
user01@ubuntu:~$ source ./script.sh
出力結果
合計 3991644
lrwxrwxrwx 1 root root 7 4月 22 2024 bin -> usr/bin
drwxr-xr-x 2 root root 4096 2月 26 2024 bin.usr-is-merged
drwxr-xr-x 4 root root 4096 11月 1 23:34 boot
dr-xr-xr-x 2 root root 4096 4月 24 2024 cdrom
(...以下省略...)
解説
source
コマンドで実行すると、カレントシェル内でスクリプトが実行されます。- 事前に設定したエイリアス
lsl
が有効であるため、スクリプト内のlsl /
が正しく実行されます。
2.ファイル名を指定して実行
まず、スクリプトに実行権限を付与します。
user01@ubuntu:~$ chmod +x script.sh
次に、スクリプトを実行します。
user01@ubuntu:~$ ./script.sh
出力結果
./script.sh: 行 2: lsl: コマンドが見つかりません
解説
- スクリプトは新しいシェルプロセス(サブシェル)で実行されます。
- カレントシェルで設定したエイリアス
lsl
は新しいシェルプロセス(サブシェル)には引き継がれないため、lsl
コマンドが見つからずエラーになります。
エイリアスを設定するシェルスクリプトの作成
次に、エイリアスを設定するシェルスクリプト alias_set.sh
を作成します。
ステップ1:alias_set.sh
の作成
user01@ubuntu:~$ nano alias_set.sh
alias_set.sh
の内容
#!/bin/bash
alias lsla='ls -la'
解説
- スクリプト内で
lsla
というエイリアスをls -la
に設定します。
ステップ2:スクリプトの実行と動作確認
ファイル名を指定して実行
user01@ubuntu:~$ chmod +x alias_set.sh
user01@ubuntu:~$ lsla
出力結果
user01@ubuntu:~$ lsla
コマンド 'lsla' が見つかりません。もしかして:
command 'lola' from deb lola (1.6-1)
次を試してみてください: sudo apt install <deb name>
解説
- スクリプトを実行する前に
lsla
コマンドを試すと、エイリアスが設定されていないためエラーになります。
次に、スクリプトを実行します。
user01@ubuntu:~$ ./alias_set.sh
user01@ubuntu:~$ lsla
出力結果
コマンド 'lsla' が見つかりません。もしかして:
command 'lola' from deb lola (1.6-1)
次を試してみてください: sudo apt install <deb name>
解説
- スクリプトは新しいシェルプロセス(サブシェル)で実行され、その中でエイリアスが設定されます。
- スクリプトの実行が終了すると、そのシェルプロセスも終了するため、エイリアスの設定はカレントシェルには影響しません。そのため、エラーになります。
source
コマンドで実行
user01@ubuntu:~$ source ./alias_set.sh
user01@ubuntu:~$ lsla
出力結果
合計 168
drwxr-x--- 16 user01 user01 4096 11月 10 22:49 .
drwxr-xr-x 4 root root 4096 9月 27 01:59 ..
-rw------- 1 user01 user01 28762 11月 10 14:23 .bash_history
-rw-r--r-- 1 user01 user01 220 3月 31 2024 .bash_logout
(...以下省略...)
解説
source
コマンドでスクリプトを実行すると、カレントシェル内でエイリアスが設定されます。- そのため、スクリプト実行後も
lsla
コマンドが有効になります。
実行方法の選択と注意点
ファイル名を指定して実行するメリット
- シェバンによるシェル指定:スクリプト内で使用するシェルを明示的に指定できます。
- 独立した環境での実行:カレントシェルの環境に依存せず、意図した通りにスクリプトを実行できます。
- 予期しない副作用の回避:スクリプトの実行がカレントシェルに影響を与えないため、安全性が高まります。
source
コマンドを利用する場合の注意点
- カレントシェルに影響を与える:スクリプト内で設定した変数やエイリアス、環境設定がカレントシェルに反映されます。
- 意図しない動作の可能性:カレントシェルの環境によってスクリプトの動作が変わる可能性があります。
- 用途の限定:主にカレントシェルの設定を変更する目的(例:環境変数の設定、エイリアスの設定)で使用されます。
一般的な実行方法の選択
- スクリプトを独立して実行したい場合:ファイル名を指定して実行する方法(
./script.sh
)が推奨されます。 - カレントシェルの設定を変更したい場合:
source
コマンドを使用します。例として、シェルの初期化ファイル(.bashrc
や.profile
)で環境設定を行う際に利用されます。
不要なファイルの削除
作業が終わったら、作成したスクリプトを削除します。
user01@ubuntu:~$ rm script.sh alias_set.sh
まとめ
- シェルスクリプトの実行方法には、主に以下の3つがあります。
・ファイル名を指定して実行する(./script.sh
)
・シェルの引数として実行する(bash script.sh
)
・source
コマンドを利用して実行する(source ./script.sh
) - ファイル名を指定して実行する方法は、スクリプトが新しいシェルプロセス(サブシェル)で実行され、カレントシェルの環境に依存しません。
source
コマンドを利用する方法は、スクリプトがカレントシェル内で実行され、環境設定の引き継ぎや変更が可能です。- エイリアスや環境変数の影響
・ファイル名指定やシェルの引数として実行した場合、カレントシェルのエイリアスや関数は引き継がれません。
・source
コマンドで実行した場合、カレントシェルのエイリアスや関数が有効であり、スクリプト内での設定もカレントシェルに影響を与えます。 - 実行方法の選択
・スクリプトがカレントシェルの環境に依存しないようにするため、一般的にはファイル名指定で実行する方法が推奨されます。
・カレントシェルの設定を変更したい場合や、設定ファイルを読み込む場合には、source
コマンドを使用します。 - 注意点
・source
コマンドで実行する際は、スクリプト内の変更がカレントシェルに影響を与えるため、意図しない副作用を避けるためにも注意が必要です。
シェルスクリプトの実行方法を正しく理解し、適切に使い分けることで、効率的かつ安全にシステム管理やタスクの自動化を行うことができます。