シェルスクリプト #!

シェルスクリプトは先頭の1行にどんなシェルプログラムを利用するかを指定する事になっている。→シェバン(shebang

#! /bin/bash

てな具合。昔はシェルといえば sh (Bourne)しかなかったから気にならなかったけれど、BSDcsh が搭載されるようになると B か C 迷うので対策が考えられた。sh には何もしない(NOP: No operation) コマンドというのがあって、それが先頭にあるとB、コメント # なら C というやつ。

:  ホゲホゲ  ⇦ Bsh 
# シカジカ  ⇦ Csh

古いUNIXの書物(McGraw-Hill の Unix Worldとか、1990年初頭にちょくちょく投稿していた)だと、これが常識。1行目をみて「あ、これはCshなのね」という感じ。   

この小ネタとしては、# は Bsh, Csh ともにコメントで : は Bsh では NOP という事。具体的には # は両シェルとも読み飛ばす(無視)するけど、: はイチよ〜 Bsh は解析するので多少処理時間がかかる。

CentOS 7 の sh はもやは bash だけど(/bin/sh が /usr/bin/bash へのリンク) 1万行の : と # のファイルを実行してみた。すると

$ time bash colon 
real 0m0.028s
user 0m0.025s
sys 0m0.003s<
$ time bash hash
real 0m0.015s
user 0m0.010s
sys 0m0.005s

今でも : の方が処理時間がかかる。くどいけど csh (これまた tcshだけど)でもやってみた。

$ time csh colon 
real 0m0.179s
user 0m0.116s
sys 0m0.063s
$ time csh hash 
real 0m0.051s
user 0m0.036s
sys 0m0.015s

同様に : の方が時間がかかる。というか csh 重いなぁと今更ながら思うのであった。