シバン (Unix)とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > 百科事典 > シバン (Unix)の意味・解説 

シバン (Unix)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/08/11 01:56 UTC 版)

シバンまたはシェバン (: shebang) とはスクリプト#!から始まる1行目のこと。起動してスクリプトを読み込むインタプリタを指定する。

シェバンやシバンと呼ばれるようになった理由については諸説あるが、一般的には、そこに書かれる2文字が「#」(ハッシュ番号記号)と「!」(bang! バンびっくりマーク)だから、ハッシュ・バン(hash bang)やシャープ・バン(sharp bang)と呼ばれるようになり、それを短く言う際に訛ってシェバンとなった、と説明されている。あるいは、もはもともとは主にシェルを起動していたからシェル・バン(shell bang)と呼ばれ、それが訛ったと説明されることもある。いずれにせよ現在では、これらを縮めたシェバンという呼び方が一般的かつ簡素である[2]。日本の技術書ではシバンと3文字表記することも多い。

概要

シバンは基本的には、スクリプトを記述したファイルにおいて、スクリプトを実行するインタープリタのバイナリを指定するためのものである。

シバンが無かった時代には、スクリプトを実行させる場合、コマンドを書くたびにいちいち「インタープリタ名 + スクリプトのファイル名」を併せて書かなければならなかった。両方明記しなければスクリプトが動かないようでは、頻繁に実行する場合に特に煩わしい。シバンでインタープリタを指定できる仕組みを導入したことで、実行時にはファイル名だけを書けば済むようになった。

シバンを認識するのは、プログラムローダーである。つまり、オペレーティングシステム (OS) の execve システムコール(exec を参照)を処理するルーチン中のプログラムローダーである[注釈 1]

プログラムローダーはファイルの1行目の最初に「#!」を見つけると、1行目の残りの文字列をインタープリタを指定しているものとして扱い、そのインタープリタにこのファイルのパスを渡す。するとそのインタープリタはこのファイルのデータを入力データ(実行すべきスクリプト)として扱い、それを実行する。

インタープリタはシバンを無視する。なぜならシバンの最初の文字は「#」であり、インタープリタにとって「#」は、その行がコメント文だということを意味するからである。

下のように1行目にシバンを書き、2行目以降にスクリプトの本文を書く。 Bourne Shellのスクリプトだと下のようになる。

#!/bin/sh
echo 'Hello world!'

典型的な例をいくつか示す。

  • #! /bin/sh - Bourn Shellでスクリプトを実行する。
  • #! /bin/bash - Bashでスクリプトを実行する。
  • #! /usr/bin/pwshPowerShellでスクリプトを実行する。
  • #! /usr/bin/env python3 – Python3で、envプログラムを使いパスを探す。


注意点

  • シバン行の最大文字数、指定可能な引数の数などは環境依存である。それを逸脱した場合の動作も環境依存である。特に複数個の引数を与えた場合にどう扱われるかはまちまち(普通に扱われる、2個目以降は無視される、空白の入った1個の引数にされる)であるため、注意が必要である[2]
  • ファイルの先頭がバイト順マークになっているUnicode形式のファイルの場合は動作しない。これはバイト順マークのために、OSのプログラムローダーがシバンを認識できなくなるためである。

envコマンドを使う手法

envを使えるインタープリタがいくつかある。

Ruby言語のインタプリタ rubyenv コマンドを用いて実行する場合だと、下のように書くことができる。

#!/usr/bin/env ruby
puts 'Hello world!'

ただし、envを用いる手法はPATH環境変数に依存する。親プロセスが独自にPATHを設定していた場合、想定外の動作をする可能性がある。ruby インタプリタの場合は -x オプションを利用した以下のようなシェルスクリプトに見せかけるトリックを使用したほうが良い。

#!/bin/sh
# -*- ruby -*-
exec ruby -x "$0" "$@"
#!ruby
puts 'Hello world!'

  • ラリー・ウォールのmetaconfigには、シバンを持たないシステムを検出し、スクリプトの先頭の<code>#!/bin/sh</code>を: use /bin/shに置換する機能があった[注釈 2]
  • ELFでは類似の機能として、プログラムヘッダのINTERP型エントリにインタプリタを記述することが出来る。ここには実行可能バイナリが使用する動的リンクライブラリのパス名を設定する。OSは実行可能バイナリと同時にインタプリタとして指定された動的リンクライブラリもロードして動的リンクの処理をさせる。
  • FreeBSDのカーネルバイナリはインタプリタがカーネルでは使用されないことを逆手に取り、インタプリタとして/red/herringを指定している。[3]


歴史

シバンは、ベル研究所デニス・リッチーにより、Version 7 Unix(Unix 第7版)とVersion 8(Research Unix)の間の時期に導入された。また、カリフォルニア大学バークレー校のコンピューター科学研究グループによるBSDのリリースにも追加されており、2.8BSD には存在し、4.2BSD ではデフォルトで有効になっていた。ベル研究所の Version 8 Unix 以降の版は一般公開されなかったため、シバンが人々に広く知られるようになった最初の例はBSDとなった。

Version 7

シバンの一歩手前の段階。

インタープリター指示子無しで、シェルスクリプトをサポートする、というやり方は1979年の Version 7 Unix のドキュメントに見られる。その説明によると、Bourneシェルの機能が実行権限を与えられたファイルを特別なものとして扱い、スクリプトの冒頭に「:」や「#」など特定の文字がある場合に、シェルがサブシェルを起動し、そのファイル内のコマンドを解釈・実行するという仕組みであった。 この方式では、スクリプトはBourneシェル内から呼び出されたときにのみ、通常のコマンドのように動作した。オペレーティングシステムの exec() システムコールを通じて直接スクリプトファイルを実行しようとしても失敗する仕様になっていたため、スクリプトは通常のシステムコマンドのように一貫して動作することはできなかった。

Version 8

「Unix第8版」(Version 8 Unix。Research Unix)以降では、スクリプトと実行ファイルの扱いが異なる問題は解消された。デニス・リッチーは、1980年1月のメール(下に掲載)で、Unix第8版向けにインタープリター指示子のサポートをカーネルに導入したことについて説明した。

From uucp Thu Jan 10 01:37:58 1980
>From dmr Thu Jan 10 04:25:49 1980 remote from research

The system has been changed so that if a file being executed
begins with the magic characters #! , the rest of the line is understood
to be the name of an interpreter for the executed file.
Previously (and in fact still) the shell did much of this job;
it automatically executed itself on a text file with executable mode
when the text file's name was typed as a command.
Putting the facility into the system gives the following
benefits.

1) It makes shell scripts more like real executable files,
because they can be the subject of 'exec.'

2) If you do a 'ps' while such a command is running, its real
name appears instead of 'sh'.
Likewise, accounting is done on the basis of the real name.

3) Shell scripts can be set-user-ID.

4) It is simpler to have alternate shells available;
e.g. if you like the Berkeley csh there is no question about
which shell is to interpret a file.

5) It will allow other interpreters to fit in more smoothly.

To take advantage of this wonderful opportunity,
put

#! /bin/sh

at the left margin of the first line of your shell scripts.
Blanks after ! are OK. Use a complete pathname (no search is done).
At the moment the whole line is restricted to 16 characters but
this limit will be raised.

上のメールの翻訳は下の通り。

From uucp Thu Jan 10 01:37:58 1980
>From dmr Thu Jan 10 04:25:49 1980 remote from research

システムが変更され、実行されるファイルの先頭に
マジック文字 #! がある場合、その行の残りの部分が
そのファイルを解釈するインタープリターの名前であると
理解されるようになりました。

以前(そして実際には今でも)シェルがこの処理の多くを
担当しており、テキストファイルに実行権限がある場合、
そのファイル名をコマンドとして入力すると、シェルが
自動的に自身を起動してそのファイルを実行していました。

この機能をシステム側[注釈 3]に組み込むことにより、
以下の利点があります:

1) シェルスクリプトが、より一層、本物の実行可能ファイルのようになる。
なぜなら、それらを `exec` の対象にできるからです。

2) そのようなコマンドを実行中に `ps` を使うと、
`sh` の代わりに実際の名前が表示されます。
同様に、アカウンティング(実行記録)も実際の名前で行われます。

3) シェルスクリプトに set-user-ID ビットを設定できるようになります。

4) 別のシェルを使うことがより簡単になります。
たとえば、Berkeley の csh を使いたい場合でも、
どのシェルでスクリプトを解釈するかについて疑問が生じません。

5) 他のインタープリターもよりスムーズに組み込むことができます。

この素晴らしい機会を活かすには、シェルスクリプトの先頭行の左端に

#! /bin/sh

と記述してください。
`!` の後に空白があっても問題ありません。完全なパス名を使用してください(検索は行われません)。
現時点では、この行の全体は16文字に制限されていますが、
この制限は今後引き上げられる予定です。


注釈
  1. ^ システムコールではなく、ライブラリでエミュレートする実装も在った(SVR2ベースのEWS-UXなど)。この場合、スクリプトのsetuidsetgidは無視される。
  2. ^ C Shellからスクリプトを実行された際に、Bourne Shellで実行させる為。
  3. ^ この「システム」はカーネルを意味している。
出典
  1. ^ 記事名の制約につき、記事名としての#記号全角井桁
  2. ^ a b The #! magic, details about the shebang/hash-bang mechanism”. www.in-ulm.de. 2022年11月23日閲覧。
  3. ^ freebsd-src/sys/conf/kern.pre.mk at main · freebsd/freebsd-src”. GitHub. 2024年6月27日閲覧。 リンカへのオプションに--dynamic-linker /red/herringが含まれている。

「シバン (Unix)」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「シバン (Unix)」の関連用語

シバン (Unix)のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



シバン (Unix)のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのシバン (Unix) (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2025 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2025 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2025 GRAS Group, Inc.RSS