UNIXの部屋 コマンド: sh


※空白区切りで AND 検索 (例:「ファイル 削除」)

コマンド sh シェル (Bシェル、ボーンシェル)

ユーザインタフェイスが弱いので、ログインシェルとしてはあまり使われないが、速度が速く書式が洗練されているので、シェルスクリプトとしてよく使われる。

sh に便利なユーザインタフェース機能を追加したものが bash である。ログインシェルには bash や tcsh などの高機能なシェルを使うべし。

なお、FreeBSD では本来の sh でなく、機能を拡張した ash が使われている(しかし普通は、この ash を sh と呼ぶ)。また、Linux では sh は存在せず、sh は bash へのハードリンクになっている。

なお、sh は Bourne (ボーン) 氏が作ったので、B シェルと呼ばれる。
>> OSオンラインマニュアル(man) Solaris10 sh(1)
>> OSオンラインマニュアル(man) FreeBSD sh(1)

読み方 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コードコンテスト) が開催されるようになった。


頑張って書いたおすすめコンテンツ!