Shebangにおける/bin/bashと/usr/bin/bashの違い

shellscript basic 1/N

公開日: 2022-08-11
更新日: 2023-09-28

  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のほうが好ましい



Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)