コマンド
sh
シェル (Bシェル、ボーンシェル)
ユーザインタフェイスが弱いので、ログインシェルとしてはあまり使われないが、速度が速く書式が洗練されているので、シェルスクリプトとしてよく使われる。
sh に便利なユーザインタフェース機能を追加したものが bash である。ログインシェルには bash や tcsh などの高機能なシェルを使うべし。
なお、FreeBSD では本来の sh でなく、機能を拡張した ash が使われている(しかし普通は、この ash を sh と呼ぶ)。また、Linux では sh は存在せず、sh は bash へのハードリンクになっている。
なお、sh は Bourne (ボーン) 氏が作ったので、B シェルと呼ばれる。
読み方
sh
(UNIXコマンド) [しぇる] [えす・えっち] [しぇ] [びー・しぇる]
"SHell" の略。作者の名前をとって Bourne Shell(B Shell)と呼ばれる。
1975年リリースの最初の UNIX である Version 6 UNIX では、ケン・トンプソンが作成した sh が搭載されていた。これを Thompson Shell と呼ぶ。Thompson Shell はあまり使い勝手がよくなかったため、その後 スティーブン・R・ボーン (Stephen R. Bourne) が新しいシェルを作った。これが Version 7 UNIX に sh として搭載されたのだが、リダイレクト・パイプライン・ifなどの制御機構の評判がよく、有名になる。
bash は「Bourne-Again Shell」の略だが、英語の「born again」は再生・生まれ変わりという意味であるため、
・生まれ変わった Bourne シェル
というダブルミーニングになっている。
ちなみに Bourne さんは Algol68 プログラマであったそうで、Algol68 の if〜fi や case〜esac などの文字を逆順にするという特徴を Bourne shell にも取り込んでいる。それだけではなく、Bourne shell のソース自体も Algol68 風になっており、
#define LOCAL static
#define PROC extern
#define TYPE typedef
#define STRUCT TYPE struct
#define UNION TYPE union
#define IF if(
#define THEN ){
#define ELSE } else {
#define ELIF } else if (
#define FI ;}
#define BEGIN {
#define END }
#define FOR for(
#define WHILE while(
#define DO ){
#define OD ;}
#define REP do{
#define PER }while(
#define DONE );
#define LOOP for(;;){
#define POOL }
#define SKIP ;
#define DIV /
#define REM %
#define ANDF &&
#define ORF ||
といったマクロを設定した上で、
LOCAL VOID exfile(prof)
BOOL prof;
{
REG L_INT mailtime = 0;
REG INT userid;
struct stat statb;
/* move input */
IF input>0
THEN Ldup(input,INIO);
input=INIO;
FI
などと、なかなかにアレなソースになっている (「V7/usr/src/cmd/sh」 などで検索すると見つかる)。
この Bourne shell のソースがきっかけとなり、IOCCC (国際難読化 Cコードコンテスト) が開催されるようになった。