Table of Contents
Shebang
Def: Shebang
シェルスクリプトの1行目は#!
で始まり, その後にプログラムを解釈実行するインタプリタのパスを書く.
これをshebangと呼ぶ.
インタプリタ | 記法 |
---|---|
Bourne shell | #!/bin/sh |
bash | #!/bin/bash |
perl | #!/usr/bin/perl |
python | #!/usr/bin/python |
REMARKS
- バイナリ形式のファイルは実行権限のみで実行できるが, シェルスクリプトの場合は実行権限 + 読み込み権限が必要
bash <script>
とすれば読み込み権限のみで実行可能
インタプリタの種類
カレントディレクトリにhello.sh
という以下のファイルを作成したとします.
1
2
3
4
#!/bin/bash
echo 'Hello World!'
date
このhello.sh
の実行方法として以下の3つがあります:
1
2
3
4
5
6
7
8
## (1) shebangのインタプリタを利用
$ ./hello.sh
## (2) ユーザー指定でbash インタプリタを使用(shebangは読まない)
$ bash ./hello.sh
## (3) 自身のシェルをインタプリタとして使用(shebangは読まない)
$ source ./hello.sh
(1)
./hello.sh
sequenceDiagram
participant A as シェル
participant B as bash
participant C as hello.sh
A->>C: インタプリタの読み取り
A->>B: shebangに従い<br>子シェルを起動
B->>C: スクリプトの読み込み<br>と実行
(2)
bash ./hello.sh
sequenceDiagram
participant A as シェル
participant B as bash
participant C as hello.sh
A->>B: インタプリタを起動
B->>C: スクリプトの読み込み<br>と実行
(3)
source ./hello.sh
sequenceDiagram
participant A as シェル
participant C as hello.sh
A->>C: スクリプトの読み込み<br>と実行
shebangにおける/bin/bash
と/usr/bin/bash
の違い
shebangでインタプリタを設定する方法は色々ありますが,
#!/bin/bash
#!/usr/bin/bash
というパターンをみることがあります (前者のほうがメジャーですが).
1
2
$ which bash
/usr/bin/bash
なので, terminal上で実行するシェルと起動を合わせようと思うと後者のほうが良さそうですが, どちらも実行可能な場合, Linuxにおいては2つの間に挙動上の差はありません.
/bin/
は/usr/bin
のシンボリックリンク
1
2
3
% ls -lid /usr/bin /bin
13 lrwxrwxrwx 1 root root 7 Jul 15 18:02 /bin -> usr/bin/
32768002 drwxr-xr-x 2 root root 69632 Sep 29 14:43 /usr/bin/
ls -lid
で確認すると, 上記のようにシンボリックリンクであることがわかります.
そのため, 以下のように/bin/bash
と/usr/bin/bash
を比較してみると同じi-node番号なので挙動上差がない事がわかります
1
2
3
% ls -li /usr/bin/bash /bin/bash
32768095 -rwxr-xr-x 1 root root 1396520 Jan 7 2022 /bin/bash*
32768095 -rwxr-xr-x 1 root root 1396520 Jan 7 2022 /usr/bin/bash*
安定実行という観点では#!/bin/bash
のほうが好ましい
Linux環境ならば/bin/bash
と/usr/bin/bash
どちらもbashをインタプレタとして利用できますが,
Macとかだと
1
2
% which bash
bin/bash
で/usr/bin/bash
が存在しないケースがあるので#!/bin/bash
のほうが好ましいといえます.
REMARKS
/sbin/bash
or /usr/sbin/bash
もshebangに指定しても大丈夫だが, 上記と同じ理由で
#!/bin/bash
のほうが好ましい
(注意:GitHub Accountが必要となります)