* 構文

[13] 
ファイルの先頭に [CODE[#!]] と書き、
その直後に実行するべき[[命令]]と[[引数]]を書き、
[[改行]]を書きます。
その続きがファイルの本体となります。

** [CODE[#! perl]]

[17] 
[[Perl]] の世界では、環境によって [CODE[perl]] の[[path]]が違うため、
配布用のスクリプトでとりあえず 
[DFN[[CODE[#!perl]]]]
や
[DFN[[CODE[#! perl]]]]
のように書いておく慣習がありました。

[18] 
その後
[CODE[#![[/usr/bin/env]] perl]]
のように書かれるようになりました。
この書き方は [[Perl]] 以外でも行われます。

[19] 
気にせずに [CODE[#!/usr/bin/perl]] や [CODE[#!/usr/local/bin/perl]]
のように決め打ちで書いておくこともよくありました。

-*-*-

[22] 
[CODE[perl]] の [[path]] を書く[[場所を示しておく][placeholder]]
ことに加えて、[[エディター]]類が [[shebang]] として認識して
[[Perl]] モードに切り替えてくれることも期待できます。

-*-*-

[20] 
[[path]] 指定だけで実行する場合や [[CGIスクリプト]]として実行させる場合には、
入手したらまず適切な [[path]] に書き換えて使います。

[21] 
常に [CODE[[[perl]] script.pl]] のように実行するのであれば、気にせずそのままで使います。

** [CODE[#!ruby]]

[24] 
[[Perl]] の [CODE[#!perl]] と同様に [[Ruby]] の世界でも
[DFN[[CODE[#!ruby]]]]
のように書いておく慣習があります。

[25] また、 [[Ruby]] では

>
[PRE[
#!/bin/sh
exec ruby19 -x "$0" "$@"
#!ruby
# coding: utf-8
]PRE]

のような場合、 [CODE[#!ruby]] が [[shebang]] の扱いになります。 [SRC[>>26]]
[SEE[ [[# coding:]] ]]

[27] 
つまり [CODE[-x]] が指定されたとき、 [CODE[#!]] で始まり
[CODE[ruby]] を含まれる[[行]]が [[shebang]] になります。 [SRC[>>26]]

[REFS[

- [26] 
[CITE@ja-JP[多言語化 (Ruby 1.9.3)]], [TIME[2016-08-28T13:48:39.000Z]], [TIME[2025-11-06T13:57:59.066Z]] <https://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fm17n.html#encoding>

]REFS]

** 環境変数 [CODE[ALTERNATE_SHEBANG]]

[16] [[Perl]]
は[[環境変数]]
[DFN[[CODE[ALTERNATE_SHEBANG]]]]
によって [[shebang]]
を [CODE[#!]]
以外に変更できます。
[SRC[>>14]]


[REFS[

- [14] [CITE@en[perl5/dosish.h at blead · Perl/perl5 · GitHub]], [TIME[2025-11-03T14:19:12.000Z]] <https://github.com/Perl/perl5/blob/blead/dosish.h#L74>
- [15] [CITE@en[perlfaq3 and perlrun have "ALTERNATIVE_SHEBANG", everywhere else it's ALTERNATE_SHEBANG · Issue #6617 · Perl/perl5]], [TIME[2025-11-03T14:19:26.000Z]] <https://github.com/Perl/perl5/issues/6617>

]REFS]

* 処理

[5] [[プラットフォーム]]が実行時に読んで、[[実行]]するべき[[命令]]を決定します。

[10] [[Unix]] では[[カーネル]] ([CODE[execve]]) が読んで解釈します。

[11] 
[[Cygwin]] や [[MSYS]] / [[MSYS2]] / [[Git Bash]] でも [CODE[execve]] / [CODE[exec]]
が読んで解釈します。

-*-*-

[6] [[Perl]] や [[Ruby]] は起動時に読んで、[[オプション]]を認識します。

[7] [[awk]] も実装によっては読んで[[オプション]]を認識するとされます。

[8] [CODE[tcksh]] や [CODE[sh]] も読んで認識することがあるとされます。

-*-*-

[9] [[bash]], [[sh]], [[ksh]], [[Python]] は[[コメント]] ([CODE[#]]) として認識し無視します。

-*-*-

[12] 
[[エディター]]類 ([CITE[Emacs]], [CITE[Vim]], その他各種)、
[[構文ハイライト]]ツール (専用のもの、[[ページャー]]に組み込まれたもの、
[[差分]]表示ツールに組み込まれたものなど各種)、
その他[[プログラム]]開発支援ツール ([[lint]] など)、
[[ファイル形式]]の [[sniffer]]
などが[[ファイル形式]]の判定の材料として使うことがあります。


[23] 
この用途の場合、厳密な [[path]] の指定を認識する意味はないので、
[[正規表現]]などによって [CODE[perl]] が含まれているか、
[CODE[ruby]] が含まれているか、のような大雑把な検査で決定する場合が多いようです。


* JavaScript の前に書く shebang



[29] [CITE@en[Executable scripts]], [TIME[2025-11-06T18:43:56.000Z]], [TIME[2025-11-07T14:48:39.172Z]] <https://docs.deno.com/examples/hashbang_tutorial/#creating-an-example-script>


[30] [CITE@en-GB[Node.js — Run Node.js scripts from the command line]], [TIME[2025-11-07T14:50:35.000Z]] <https://nodejs.org/en/learn/command-line/run-nodejs-scripts-from-the-command-line>

[31] 
[CITE@en-US[Getting Started | google/zx]], [TIME[2025-10-19T13:48:24.000Z]], [TIME[2025-11-07T14:51:57.288Z]] <https://google.github.io/zx/getting-started>



* 関連

[SEE[ [[コメントの中身が意味を持ってしまう]] ]]

[SEE[ [[ファイル形式の識別]], [[拡張子]], [[creator code]] ]]

[SEE[ [[permission]] ]]


[SEE[ [[資源ヘッダー]], [[sniffing]] ]]

* メモ

[3] [CITE@ja[本の虫: Shebangという謎な事実上業界標準について]], [TIME[2023-07-04T21:38:48.000Z]], [TIME[2023-07-05T07:32:22.170Z]] <https://cpplover.blogspot.com/2013/08/shebang.html>


[1] [CITE@en[Shebang (Unix) - Wikipedia, the free encyclopedia]]
([TIME[2009-10-09 02:48:32 +09:00]] 版)
<http://en.wikipedia.org/wiki/Shebang_(Unix)>

[2] [CITE[shell - How to use multiple arguments with a shebang (i.e. #!)? - Stack Overflow]]
( ([TIME[2014-10-03 00:30:31 +09:00]] 版))
<http://stackoverflow.com/questions/4303128/how-to-use-multiple-arguments-with-a-shebang-i-e>

[4] [[URL]] の [CODE[#!]] とは無関係です。
[SEE[ [CODE[#!]] ]]

[28] [CITE@ja[Shebang集 #UNIX - Qiita]], [TIME[2025-11-07T14:43:48.000Z]] <https://qiita.com/cielavenir/items/6063c117f25f9188b84c>


