このページで解説している内容は、以下の 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 コマンドで実行する際は、スクリプト内の変更がカレントシェルに影響を与えるため、意図しない副作用を避けるためにも注意が必要です。

 シェルスクリプトの実行方法を正しく理解し、適切に使い分けることで、効率的かつ安全にシステム管理やタスクの自動化を行うことができます。