このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトの実行形式

シェルスクリプトの実行形式

 シェルスクリプトの実行形式について理解することは、シェルスクリプトを正しく動作させる上で非常に重要です。特に、異なる環境でスクリプトが動作しないといった問題を避けるために、シェルスクリプトの実行形式やシェバン(Shebang)の仕組みを正しく理解しておく必要があります。

シェバン(Shebang)

 シェルスクリプトを作成する際、ファイルの先頭に #! で始まる行を追加することが一般的です。これをShebangシェバンまたはシバン)と呼びます。シェバンは、スクリプトをどのシェルやプログラムで実行するかを指定する特別な行です。

シェバンの役割

 シェルスクリプトを実行すると、Linuxカーネルはファイルの先頭を確認します。もし最初の行が #! で始まっていれば、その後に記述されたプログラムを使ってスクリプトを実行します。

シェバンの記述例:シェルスクリプトdisksize.shが以下の内容の場合

#!/bin/bash
du -h ~ | tail -n 1

最初の行の例: #!/bin/bash

この場合、スクリプトは /bin/bash シェルを使って実行されます。

シェバンの動作の流れ

シェバンが記述されたシェルスクリプトを実行すると、以下のような流れで処理が進みます。

  • スクリプトの実行コマンド
    $ ./disksize.sh
  • Linuxカーネルがシェバンを解釈
    カーネルはスクリプトの先頭行を確認し、#!/bin/bash と書かれていることを認識します。
  • 実質的な実行コマンド
    $ /bin/bash ./disksize.sh
    カーネルは /bin/bash シェルを起動し、実質的には、コマンドラインとしてスクリプトファイルを引数として渡して実行します。
  • シェルがスクリプトを解釈・実行

シェバンの利点

  • 明示的なシェルの指定: スクリプトがどのシェルで実行されるかを明確にできます。
  • 互換性の確保: シェバンを指定することで、ユーザーのデフォルトシェルに関係なく、スクリプトが意図した通りに動作します。

シェバンのあるシェルスクリプトの作成

以下の内容のdisksize.shを作成します。

user01@ubuntu:~$ nano disksize.sh

disksize.sh の内容

#!/bin/bash
du -h ~ | tail -n 1

解説

  • #!/bin/bash:スクリプトを /bin/bash シェルで実行することを指定しています。
  • du -h ~ | tail -n 1:ホームディレクトリのディスク使用量を表示するコマンドです。

スクリプトに実行権限を付与

シェルスクリプトを直接実行するためには、実行権限を付与する必要があります。

user01@ubuntu:~$ chmod +x disksize.sh

解説

  • chmod +x disksize.shdisksize.sh に実行権限を付与します。

スクリプトの実行

user01@ubuntu:~$ ./disksize.sh

出力結果

20M    /home/user01

解説

  • ./disksize.sh:カレントディレクトリの disksize.sh を実行します。
  • 出力はホームディレクトリの総使用量です。

コメントの仕組み

シェルスクリプトでは、# で始まる行はコメント行として扱われ、シェルから無視されます。

例:
# この行はコメントです
echo "Hello, World!"

シェバンとの関係

  • シェバン行も # で始まりますが、シェルからはコメントとして無視されます。
  • しかし、Linuxカーネルはシェバン行を特別な行として解釈し、指定されたシェルでスクリプトを実行します。

sourceコマンド:ファイルからコマンドを読み込んで実行する

シェルスクリプトを実行する別の方法として、source コマンドを使用する方法があります。

sourceコマンドの特徴

  • 現在のシェルで実行: 新しいシェルを起動せず、現在のシェル環境でスクリプトを実行します。
  • シェバン不要: スクリプトにシェバンがなくても実行できます。
  • 実行権限不要: スクリプトに実行権限がなくても実行できます。

シェバンのないシェルスクリプトの作成

user01@ubuntu:~$ nano disksize-noshebang.sh

disksize-noshebang.sh の内容

du -h ~ | tail -n 1

解説

  • シェバン行がありません。
  • ホームディレクトリのディスク使用量を表示するコマンドが記述されています。

sourceコマンドでの実行

user01@ubuntu:~$ source ./disksize-noshebang.sh

出力結果

20M    /home/user01

解説

  • source コマンドは、スクリプトの内容を現在のシェルに読み込み、実行します。
  • シェバンがなくても問題なく実行できます。
  • 実行権限を付与する必要もありません。

sourceコマンドの処理の流れ

  • sourceコマンドの実行
    $ source ./disksize-noshebang.sh
  • スクリプトの読み込みと実行
    スクリプトの各行が現在のシェルで順次実行されます。
  • 出力
    20M /home/user01
  • シェルに戻る
    $ ←スクリプトの実行が終了すると、再びプロンプトが表示されます。

ドットコマンド(.)による実行

source コマンドと同じ機能を持つコマンドに、.(ドット)コマンドがあります。

user01@ubuntu:~$ . ./disksize-noshebang.sh

出力結果

20M    /home/user01

解説

  • .source コマンドと同等の機能を持ちます。
  • ドット1つだけなので見落としやすいですが、動作は同じです。

注意点

  • 可読性の観点から、source コマンドの使用を推奨します。

実行権限について

直接実行する場合

スクリプトに実行権限が必要です。

user01@ubuntu:~$ chmod +x disksize.sh

sourceコマンドで実行する場合

スクリプトに実行権限は不要です。

user01@ubuntu:~$ source ./disksize-noshebang.sh

不要なファイルの削除

作業が終わったら、不要になったシェルスクリプトを削除します。

user01@ubuntu:~$ rm disksize.sh disksize-noshebang.sh

まとめ

  • シェバン(Shebang)
    ・スクリプトの先頭に #! で始まる行を記述し、使用するシェルやプログラムを指定します。
    ・スクリプトの互換性と意図した動作を確保するために重要です。
  • コメントの仕組み
    # で始まる行はコメントとして扱われ、シェルからは無視されます。
    ・シェバンもコメント行として扱われますが、Linuxカーネルは特別な意味を持つ行として解釈します。
  • sourceコマンド
    ・スクリプトを現在のシェル環境で実行します。
    ・シェバンや実行権限がなくても実行可能です。
    .(ドット)コマンドも同等の機能を持ちますが、可読性のため source コマンドの使用が推奨されます。
  • 実行権限の付与
    ・スクリプトを直接実行する場合は、実行権限を付与する必要があります。
    chmod +x スクリプト名 コマンドで実行権限を付与します。
  • 注意点
    ・シェバンの有無やスクリプトの実行方法によって、動作が異なる場合があります。
    ・スクリプトの移植性や互換性を考慮して、正しくシェバンを記述し、適切な方法で実行することが重要です。

 シェルスクリプトの実行形式を正しく理解し、適切に活用することで、システム管理や自動化タスクをより効果的に行うことができます。