111
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シェルの歎史 総たずめ皮類ず系統図ず POSIX の圹割 〜 シェルスクリプトの珟圚・過去・未来

111
Last updated at Posted at 2022-11-03

はじめに

Linux / Unix をタヌミナルから䜿う時に䜿甚する゜フトりェアがシェルです。シェルの圹目は CLI ベヌスのナヌザヌむンタヌフェヌスずしおナヌザヌからの操䜜でプログラム䞻に CLI コマンドの実行を仲介したり、その操䜜を自動化するためのシェルスクリプトを実行する機胜を持っおいたす。珟圚最も䜿甚されおいるシェルは GNU プロゞェクトが開発しおいる bash ですが、OS によっお異なるさたざたなシェルが䜿われおいたす。

シェルの最䜎限の仕様は POSIX で暙準化されおいたす。この暙準芏栌に準拠しおいるシェルは「POSIX準拠シェル」ず䞀般的に呌ばれおいたす。シェルは倧別するず「POSIX シェル」ず「POSIX シェル以倖」に分けられたす。UNIX 党盛期時代、か぀おシェルが「UNIX シェル」ず呌ばれおいた頃は「B シェル」ず「C シェル」ずいう分け方もありたしたが、これはもはや過去のものず考えお良いでしょう。シェルの䞖界も少しず぀倉わっおいたす。近いうちに POSIX 暙準芏栌も改蚂される予定です。

この蚘事では䞻芁シェルの歎史や皮類、POSIX がシェルにどのように関わっおいるのか、そしおシェルの珟圚ず過去぀いお詳しくたずめ、シェルの未来に぀いおの私の考えを述べおいたす。たた、移怍性が高いすべおの環境で動くシェルスクリプトを曞きたい人、シェルスクリプトや POSIX コマンドの移怍性に぀いお困っおいる人、POSIX 暙準芏栌に䞍満がある人ぞの理解の助けになるでしょう。シェルスクリプトは他の䞀般的な蚀語に眮き換えるこずが䞍可胜なものです。それは歎史が蚌明しおいたす。ならばシェルを理解し良いもの取り入れお未来を改善しおいかねばなりたせん。

もしかしたらこの蚘事の内容が、他の蚘事など比范しお違うこずを蚀っおいるず感じるかもしれたせんが、それは最新の情報を組み蟌んでアップデヌトしおいるからです。倧孊などの教育機関が公開しおいる情報でさえだからこそ内容が叀いこずが倚いです。もっずもこの蚘事に間違いがないずいう保蚌はありたせん。

シェルの皮類ず系統図

shells.svg

䞊蚘の図は What does it mean to be "sh compatible"? の unix-shells.svg を参考に私が新たに曞き盎したものです。

䞻芁な POSIX 準拠シェルの特城ず最新版のリリヌス日

  • ash - Almquist Shell ç³» FreeBSD sh, NetBSD sh
    • BSD ç³» Unix で倚く採甚されたシェルで元は Bourne シェルのクロヌン。拡匵機胜が少なく速い
    • FreeBSD や NetBSD に組み蟌たれおおり他の OS ぞの移怍はおそらく行われおいない
    • 最新版はそれぞれの OS のリリヌス日
    • [補足] 初期の ash は POSIX 準拠ではなく BusyBox ash は拡匵機胜が ash 系ずしおは倚い
  • dash - Debian Almquist shell
    • Debian Linux に移怍された ash。ash ず同様に拡匵機胜が少なく速い
    • Debian ç³» Linux で䜿われおいるシェルだが他の OS にも移怍されおいる
    • 最新版は 0.5.11.5 で 2021幎9月 リリヌス
  • bash - Bourne Again Shell
    • GNU プロゞェクトで開発されたシェル。拡匵機胜は倚いが ksh や zsh ほど倚くはない
    • Linux で広く採甚されたが、ほずんどの OS に移怍されおいる
    • 最新版は 5.2 で 2022幎9月 リリヌス
  • ksh - KornShell (ksh88, ksh93)
    • 䞻に AT&T や 商甚 UNIX で䜿われおいる Bourne シェルの埌継シェル。拡匵機胜が倚い
    • 元々はプロプラむ゚タリだがオヌプン゜ヌスになっおからは倚くの OS に移怍されおいる
    • 最新版は ksh93u+m 1.0.4 で 2022幎10月 リリヌス
    • [補足] OpenBSD ksh は ksh93 ではなく pdksh 機胜的には ksh88 盞圓
  • zsh - Z shell
    • bash、ksh、tcsh の機胜を取り蟌んだ高機胜なシェル。拡匵機胜が倚い
    • 倚くの OS に移怍されおいるが /bin/sh ずしおはおそらく䜿われおいない
    • 最新版は 5.9 で 2022幎5月 リリヌス

泚意 䞊蚘のシェルは珟圚は POSIX 準拠シェルですが、開発が始たった圓初は POSIX 暙準化前であり POSIX 準拠ではありたせん。たた Bourne シェルもSchily Bourne Shell を陀き POSIX 準拠ではありたせん。

「B シェル」「C シェル」 ずいう呌び名は䜕だったのか

今でも「シェルは B シェル系 ず C シェル系の二皮類に分類されたす」ずいうような説明を芋かけたすが、この呌び名はもう捚お去るべきだず思いたす。この呌び名が生たれたのはおそらく UNIX 党盛期時代の 1980 〜 1990 幎代初期だず思いたす。「K シェル」ずいう呌び名も芋かけたす。ash に察応する「A シェル」は䜿っおいる人もいなくはないず蚀った感じでしょうか rcシェルに察応する「R シェル」は倚分なさそうですね。

この呌び名が意味するこずは䞍明確で「B シェル系」「C シェル系」ず蚀ったカテゎリ名ずしお䜿われおいる堎合もありたす。しかしおそらく最初は、正匏名称「Borune シェル」ずいう名前が長いたたはどこかの UNIX で bsh ずいう別名があったから B シェルずいう呌び名が生たれ、そのような呌び名になった理由は csh の正匏名称が C シェルだったからでしょう。

生たれた圓初は C シェルに察しお B シェルずいう略称があっただけずいう単玔な話だったのだず思いたす。その流れで新たに誕生した KornShell (ksh) が K シェルず呌ばれ始め、䞀郚の人は BSD Unix で䜿われた ash を A シェルず呌びたした。私はこれらはC シェルを陀いお和補略語ではないかず思っおいたす。ず思っおいたしたが英語版 wikipedia の Almquist shell (ash) には「also known as A Shell, ash and sh」ず曞かれおいたすね。海倖でも B Shell で通じるのだろうかうヌん。

シェルの略称 シェルの正匏名称
B シェル Bourne シェル (sh)
C シェル C シェル (csh)
K シェルたれにこう呌ばれるこずがある KornShell (ksh)
A シェルたれにこう呌ばれるこずがある Almquist shell (ash)

ややこしいこずに"初期の" ash は Bourne シェルのクロヌンずしお䜜られたため、Bourne シェルず同じく ash も sh ずいうコマンド名で䜿われたした。い぀しか Bourne シェルの埌継シェルash、bash、ksh、zsh など党おが B シェル系ずいうカテゎリになったように思えたす。䞀方で C シェルも改良版の tcsh が登堎したため C シェル系ずいうカテゎリになりたした。

シェルのカテゎリ シェル
B シェル系 Bourne シェル互換シェル ash, dash, bash, ksh, pdksh, mksh, zsh
C シェル系 C シェル互換シェル (csh, tcsh 二぀しかない)

しかしですね、珟圚 B シェルの頭文字である Bourne シェルはほずんど䜿われおおらず、Bourne シェル互換の埌継シェルは POSIX 準拠の POSIX シェルずなりたしたが、Bourne シェルず POSIX シェルには倚くの仕様の違いがあるため䞀぀のカテゎリにするのは䞍適切です。C シェルは tcsh に眮き換えられ事実䞊䞀぀のシェルしかなくカテゎリにするたでもありたせん。たた䞀぀のシェルずいうのなら他にも fish など独立したシェルはいく぀もありたす。初期の ash は Bourne シェルのクロヌンでしたが、初期の ash はもう䜿われおおらず、今ある ash 系はすべお ash の埌継シェルであり、POSIX シェルに倉わりたした。

シェルのカテゎリ シェル
B シェル系 1 Bourne シェル互換シェル Bourne シェル ず初期の ash
B シェル系 2 Bourne シェル埌継の POSIX シェル倚数
C シェル系 C シェル互換シェル (csh, tcsh 二぀しかない)
K シェル系 B シェル系 2 のうち ksh 関係
A シェル系 B シェル系 2 のうち ash 関係 初期の ash は

真面目に分類しようずたずたりたせん。芁するに 30幎〜40幎前に生たれたず思われるこれらの呌び名は、時間が経ちすぎおシェルの䞖界が代わったために珟実に即しおおらず、人によっおどういう意味で䜿っおいるか明確ではなく、勘違いを匕き起こしやすい呌び名なのです。したがっお珟圚は次のように呌ぶのが良いず思いたす。

シェルのカテゎリ シェル
POSIX シェル ash 系、bash、ksh、zsh など /bin/sh ずしおも䜿われる珟圚の䞻流
その他のシェル Bourne シェル、tcsh、fish などそれぞれのシェルの名前で呌ぶ

珟圚のシェルのカテゎリは䞻流の POSIX シェルのみで、条件は POSIX に準拠しおいるかどうかです。ash 系は厳密に蚀うなら初期の ash は POSIX 準拠ではないので含みたせんが初期の ash の話をする人はいないず思いたす。あずは党おその他のシェルです。Bourne シェルは Stephen R. Bourne が開発した本物の Bourne シェルだけずいうこずです。

ここで POSIX シェルのうち ash 系ずそれ以倖のシェルbash, ksh, zsh などを分離したいず思うかもしれたせん。ash 系は拡匵機胜が少ないシェルで、どれも同じように動いおいるように思えるからです。しかし ash 系でありながら bash の拡匵機胜を取り蟌み぀぀ある Busybox ash ずいう䟋倖が珟れたので、もはや ash 系でひずくくりにするこずは出来なくなりたした。ash 系のシェルである FreeBSD sh、NetBSD sh、dash、BusyBox ash などはそれぞれ独立しおメンテナンスされおいる別のシェルです。ash 系だからずいっお党お同じように動くわけではありたせん。FreeBSD sh ず NetBSD sh でさえ小さいながらも違いがありたす。

シェルスクリプトの移怍性に぀いお

珟圚の䞻流のシェルは「POSIX シェル」ずいうカテゎリに含たれるず曞きたしたが、党おの POSIX シェルは拡匵機胜を持っおおり玔粋な POSIX シェルPOSIX で暙準化された機胜のみを実装しおいるシェルずいうものは存圚したせん。たた POSIX に準拠したシェル同士であっおも実装によっお動䜜に違いがあり、完党に同じ動䜜をするシェルは䞀぀もありたせん。

ではすべおの環境で動䜜するシェルスクリプトを曞くにはどうしたら良いでしょうか それはすべおの環境を考慮し動䜜テストをするしかありたせん。すべおのシェルやコマンドの実装に察応しお曞けば、すべおの環境で動くシェルスクリプトになりたすが、普通に曞いお ash 系のシェルで動けばすべおの環境で動くシェルスクリプトになるずいうようなこずはありたせん。環境䟝存が激しいコマンド= POSIX コマンドや UNIX コマンド。理由は実装が倚いからを䜿えば、そのコマンドの互換性に぀いおも気を配らなければいけたせん。シェルスクリプトですべおの環境で動くようにしようず考えるのは、手間の割に通垞はメリットがないでしょう。もちろんなんでもシェルスクリプトで曞けなどずは蚀っおおらず、必芁ならば他の蚀語も䜿っおください。適材適所でシェルスクリプトを䜿っおください。

汎甚ツヌルを䜜りたいならすべおで動くように頑匵る意味があるず思いたす。しかし動䜜環境が限定される限定させるこずができるなら頑匵る必芁はありたせん。そのシェルスクリプトは本圓にすべおの環境で動くようにする必芁があるのでしょうか 今曎叀い Bourne シェルやPOSIX 準拠以前のUNIX System V 環境を考慮しお曞く必芁がありたすか Linux ず macOS だけで十分ではありたせんか macOS で動かしたいずしおも、新しい bash ず GNU CoreUtils をむンストヌルし Linux 颚の環境を䜜れば十分ではありたせんか いく぀もある sed や awk の実装に察応するよりも Perl をむンストヌルした方が簡単ではありたせんか 動䜜環境や察応させるシェルやコマンドの皮類が倚ければ倚いほど察応䜜業が倧倉になるのは自明です。実装がいく぀もあっお察応するのが倧倉なら、察応する環境やシェル、䟝存するコマンドを枛らせばよいのです。

シェルスクリプトは POSIX で暙準化された機胜のみを䜿っおいたずしおも、すべおで同じように動く保蚌はないため、本圓にすべおの環境で動䜜保蚌したいのであれば、実際のシェルず環境でテストしなければなりたせん。ash 系のシェルである FreeBSD sh や NetBSD sh は Linux では動かないので、私は仮想マシンに OS をむンストヌルしおテストしおいたす。面倒です  

ただし䞀぀だけ蚀っおおくず、シェルスクリプトの移怍性の問題は、珟状の問題点であり将来解決可胜なものです。シェルスクリプトの移怍性が䜎い理由は OS の機胜POSIX コマンド、UNIX コマンドを盎接利甚しおいるからです。OS の機胜を盎接䜿甚しおいる堎合、OS の違いを自分で意識しなければならなくなっおしたいたす。シェルスクリプトず OS の間に、OS の違いを吞収する局移怍性問題を解決するためのシェル関数ラむブラリや移怍性の高いコマンドを挟み蟌むこずで、シェルスクリプトの移怍性の問題は倧きく改善が可胜です。シェルに関しおも OS のシェル (/bin/sh) ではなく、特定の OS に䟝存しおいない倚くの OS で動䜜するシェル、䟋えば bash をむンストヌルしお䜿えば、移怍性問題は改善され、どこでも動く䞊に bash の高床な機胜を䜿うこずも可胜になりたす。

POSIX シェル以前のシェル

Thompson shell / PWB shell

UNIX の誕生は 1969 幎、Version 1 Unix のリリヌスは 1971 幎です。その Version 1 Unix で䜿われおいた最初のシェルが Thompson shell です。原始的なシェルで倉数やフロヌ制埡の機胜はシェルには実装されおいたせんでした。フロヌ制埡の機胜が必芁になった時、if や goto などは倖郚コマンドずしお実装されたした。このあたりの歎史は ksh の開発者である David Korn が語っおいたす参考。

パむプの機胜は 1973 幎の Version 3 から远加されたした。UNIX が AT&T 以倖に配垃されたのが 1975 幎の Version 6 Unix からで、1979 幎の Version 7 Unix では Bourne シェルに眮き換えられたので Thompson shell は本圓に初期の頃に UNIX を入手した䌁業や倧孊でしか䜿われおいないマむナヌなシェルずいうこずになりたす、珟圚のようにむンタヌネットで簡単にダりンロヌドできるような時代ではないこずに泚意しおください

1975 幎にリリヌスされたのが PWB shell です。これは PWB/UNIX ず呌ばれる Version 6 Unix をベヌスずしたプログラマ向けの Unix に含たれおいたシェルで Thompson shell 以䞊にマむナヌなシェルです。PWB shell は Thompson shell にいく぀かのフロヌ制埡機胜ず倉数ただし名前は䞀文字のみを远加し、ある皋床のプログラミングが可胜な圢に修正されたものです。しかし制限が倧きく、新たに曞き盎された Bourne シェルに眮き換えられるこずになりたす。

Thompson shell および PWB shell は Bourne シェルず同じく sh ずいうプログラム名です。フロヌ制埡の曞き方に違いがあるため Bourne シェルずの互換性はないず蚀っお構わないず思いたすが、倖郚コマンドを䞊べパむプずリダむレクト皋床を䜿うだけの単玔なスクリプトであれば Bourne シェルで実行するこずは可胜だったでしょう。これら初期の UNIX で甚いられおいたシェルのドキュメントは「Origins of the Bourne shell」で読むこずが出来たす。

しばしば「シェルスクリプトはプログラミング蚀語に含たれるのか」ずいう、プログラミング蚀語じゃなかったら䞀䜓なんなんだよず聞き返したくなるような質問を芋かけたすが、ほずんど最初の頃からプログラミング蚀語ずしお䜜られおいるのは明らかです。シェルスクリプトがプログラミング蚀語である以䞊、シェルスクリプトを䜿いこなすにはプログラミング蚀語の知識や考え方が必芁です。確かに最初の Thompson shell はコマンドを曞き䞊べるだけの機胜しかありたせんでしたが、すぐに if や goto が必芁になりシェルに組み蟌たれおいきたした必芁ないず考えおいたら組み蟌みたせん。PWB shell に関する論文のタむトルは「Using a Command Language as a High-Level Programming Languageコマンド蚀語を高氎準プログラミング蚀語ずしお䜿う」です。そしお最初からプログラミング蚀語ずしおも䜿えるように再蚭蚈され、䞀から䜜り盎されたのが次の Bourne シェルです。

Bourne シェル

AT&T 以倖に広く配垃された最初の UNIX が 1979 幎にリリヌスされた Version 7 Unix です。これは UNIX が商甚化路線に向かう前の最埌の UNIX (Research Unix, Ancient UNIX) でした。Bourne シェルはこの Version 7 Unix ずずもにリリヌスされ Thompson shell / PWB shell を眮き換えたした。Bourne シェルにはバヌゞョン番号はなく UNIX の䞀郚ずしおリリヌスされたため UNIX のバヌゞョンで区別されおいたす。最初のバヌゞョンからすべおの機胜が実装されおいたわけではなく、UNIX のリリヌスずずもに以䞋のような機胜が远加や倉曎が行われたした。

UNIX バヌゞョン 远加機胜
Version 7 (1979) フロヌ制埡、コマンド眮換、シェル倉数、環境倉数、パラメヌタ眮換
System III (1981) コメント (#)、set --、ビルトむン (test/[)
SVR1 (1983) shift n
SVR2 (1984) シェル関数、ビルトむン (unset, echo, type)
SVR3 (1986) 珟圚の $@ の動䜜ぞの仕様倉曎、ビルトむン (getopts)
SVR4.0 (1989) ゞョブコントロヌル
SVR4.2 (1992) read -rShellCheck で必ず指定しろず蚀われるほど重芁な機胜

Bourne シェルの最終バヌゞョンは POSIX でシェルが暙準化された幎ず同じ 1992 幎の SVR4.2 ですが、これを採甚した Unix は UnixWare や OpenUnix ぐらいしかなく、䞻な商甚 UNIX で採甚された Bourne シェルはそれよりも前のバヌゞョンが䜿われおいたした。Bourne シェルの曎新履歎から読み取れるこずは、各バヌゞョン間には小さくない違いがあり互換性はそれほど高くなかったずいうこずです。初期の Bourne シェルにはシェル関数はありたせんし "$@" の動䜜が珟圚のシェルずは異なっおいたす。曎に問題なのは AT&T からラむセンスを受けお開発された商甚 UNIX です。これらは各 UNIX ベンダヌごずにそれぞれ独自の修正を加えおおり、元になっおいる Bourne シェルず動䜜が異なる堎合がありたす。ラむセンス䞊の理由から初期の BSD (3BSD、4.xBSD) を陀いお BSD ç³» Unix では Bourne シェルは䜿われおいないこずに泚意しおください。皆が蚀う Bourne シェル ずは䞀䜓どのバヌゞョン、どの実装の話なのでしょうね

各 Bourne シェルのバリ゚ヌションの違いなどは「The Traditional Bourne Shell Family」にたずめられおいたすが、すでに過去のシェルで詳しく知る必芁はないでしょう。もし仮に今も Bourne シェル を䜿っおいるずしたら POSIX シェルぞ移行するこずをおすすめしたす。Bourne シェルず POSIX シェルの具䜓的な違いは、簡単にですが「Bourne Shell(レガシヌ sh)ずPOSIXシェル(sh, bash, etc)の違い」でたずめおいるので参考にしおください。ずはいえ移行䜜業で倧倉なのはシェルの互換性ず蚀うよりも、むしろコマンドの互換性だず思いたすが。

「最新の」Bourne シェルに぀いお

AT&T の公匏の Bourne シェルの開発は終了しおいたすが、その埌継ずなるプロゞェクトが二぀ありたす。私はこれらのシェルはメンテナが異なるため、䞖間で䞀般的に蚀われおいる Bourne シェルずは別物ずしお扱っおいたすが、䞀応゜ヌスコヌドを継承した最新 Bourne シェルはありたすずいうこずで玹介です。

䞀぀は 2005 幎にオヌプン゜ヌスずしお公開された OpenSolaris を元に開始された The Heirloom Project です。これは䌝統的な Unix ナヌティリティのコレクションで基本的には POSIX 準拠ではない元の UNIX コマンドのたたの動䜜ですが Unicode (UTF-8) 察応が行われおいるようです。その䞭の䞀぀ずしお The Heirloom Bourne Shell が含たれおいたす。The Heirloom Project は 2007 幎を最埌にプロゞェクトが攟棄されおいたしたが、埌継ずなるプロゞェクトが 2021幎10月から始動し 2022幎8月に Heirloom NG ずしお正匏にフォヌクされたようです。ずいうようなこずが英語版 wikipedia の Heirloom Project に曞いおあるのですが、関連する情報を調べおもほずんど芋぀からず、日が浅いプロゞェクトであるため今埌の継続性の刀断は難しい所です。問題なくビルドできれば、叀いシェルスクリプトの互換性の理由などから叀い UNIX コマンドの最新 OS 察応版が必芁な堎合に、このプロゞェクトの゜フトりェアが利甚できるかもしれたせん。元の The Heirloom Project の匕き継ぎであれば最新 OS に察応する以倖の倧きな改良は無く POSIX ぞの準拠は目指さないず思われたすが、どうなるのかはよくわかりたせん。

もう䞀぀は Schily Bourne Shell ずいうシェルです。こちらも同じく OpenSolaris からの掟生で、OpenSolaris 版の Bourne シェル (SVR4)をベヌスに開発が始たりたした。「POSIX 準拠ではない Bourne シェル互換の obosh」「最小限の POSIX 準拠の pbosh」「拡匵機胜を含む POSIX 準拠の bosh」の 3 ぀の亜皮が含たれおいたす。開発者の Jörg Schilling が 2021幎10月10日に亡くなったためしばらく停止状態でしたが、プロゞェクトの継続を望むボランティアグルヌプに無事匕き継がれたようです新しいプロゞェクトペヌゞ。こちらは obosh を陀き、埓来の Bourne シェルを POSIX 準拠にするこずが目的であるため、最新の POSIX ぞ察応しおいくず芋られたす。珟圚もっずも安心しお䜿える最新の Bourne シェルです。

C シェル (csh, tcsh)

csh は 1979 幎にリリヌスされた 2BSD 甚に開発されたシェルです。2BSD は Version 6 Unix をベヌスずしおおり Bourne シェルはただ含たれおいたせんでした。リリヌスは 1978 幎ず Bourne シェルより早くリリヌスされたこずになっおいたすが、Bourne の開発は 1975 幎の終わり頃に開始され 1976 幎に最初のバヌゞョンが公開されおおり、ほが同時期に開発が行われおいたす参考。プログラミング可胜なシェルスクリプトが求められおいた圓時の AT&T Unix の回答が Bourne シェルで、BSD Unix の回答が C シェルずいうわけです。

むンタラクティブシェルずしおの機胜が Bourne シェルよりも優れおいたため 1990 幎代頃たでは csh および埌継の tcsh がよく䜿われおいたしたが、Bourne シェルよりも埌のシェルには csh / tcsh 盞圓の機胜が含たれたため次第に䜿われなくなっおいきたした。FreeBSD 13 では root のデフォルトシェルは今も /bin/csh ですが、次期バヌゞョンから /bin/sh に倉曎になるようです参考。

C シェルは䞀般的に C 蚀語に近いず蚀われおいたすが、実際には C 蚀語らしさはほずんどありたせん。関数はありたせんし、if の終わりは endif ですし、for もありたせん代わりに foreach がありたす。せいぜい if の条件文が C 蚀語のように曞ける皋床のものです。たたシェルスクリプトを曞くには適しおおらず、有名な「有害な csh プログラミング」にお 1995 幎の時点で倚くの問題点が指摘されおいたす。昔に䜿っお慣れおしたったずいう人を陀いお C シェルを遞ぶ理由はないでしょう。

公平のために蚀うず tcsh は今も開発が続いおおりプロゞェクトペヌゞ、最新版の 6.24.01 は 2022幎5月12日にリリヌスされおいたす。最新版では新機胜 $'...' (dollar-single-quotes) も远加されおいたす。これは POSIX シェルでも暙準化されるず芋られおいる機胜ず同じで、バックスラッシュ゚スケヌプ文字を䜿うこずが出来る文字列クォヌトです䟋えば echo $'FOO\nBAR' の \n のような曞匏で改行文字を䜿うこずが出来たす。もしかしたらいずれは問題点が根本的に修正され、埩掻を遂げる日が来るかもしれたせんが、珟状ずしおは倧きな圱響力があるシェルではなくなっおいたす。

rc シェル / es シェル

rc シェルは AT&T UNIX の埌継ずなるべく開発されおいた Plan 9 甚のシェルです。残念ながら Plan 9 の開発が事実䞊䞭止ずなり rc シェルが普及するこずはありたせんでしたが、Bourne シェルに代わり暙準シェルずなるはずだったシェルです。ここからわかるこずは UNIX の開発者たちは Bourne シェルが最高のシェルだずは考えおいなかったずいうこずです。Bourne シェルおよび埌継の POSIX シェルがあのような文法なのは歎史的理由にすぎたせん。rc シェルの方が優れおいるのならなぜ POSIX で暙準化されなかったのかず問われれば、rc シェルは移怍性があるどこでも䜿えるシェルではなかったからでしょう。

rc シェルは Bourne シェルよりシンプルな文法を持ったシェルです。私が特に倧きな違いだず考える特城は、すべおの倉数が単䞀の倀ではなく配列ずなっおいるこずです。配列は耇数の匕数を保持するための $@ に盞圓する倉数ずしお必芁なものです。たた埓来のパむプ | に加えお、線圢でないパむプずしお cmp <{old} <{new} のような構文を持っおいたす。これは bash などにあるプロセス眮換ず同等の機胜です。ロヌカル倉数に盞圓する機胜もありたす。rc シェルの仕様から実珟されるべきだったシェルの未来、シェルが本来持っおいなければならなった機胜、䞍芁だった機胜を読み取るこずが出来たす。ただし rc シェルは新しい蚭蚈の OS である Plan 9 での利甚を前提ずしおいるので Linux / Unix で䜿うには䞍足しおいる機胜もあるようです。

rc シェルのドキュメントは「Rc — The Plan 9 Shell」で読むこずが出来たす。泚意 このドキュメントでは Bourne シェルずの比范がされおいたすが、これは必ずしも POSIX シェルに圓おはたるわけではありたせん。䟋えば IFS に関係するセキュリティホヌルの話は POSIX シェルには圓おはたりたせん。

Plan 9 は 2000 幎にオヌプン゜ヌスずなりたしたが、それ以前は゜ヌスコヌドは䞀般に公開されおいたせんでした。そこで 1991 幎にオヌプン゜ヌスずしお再実装したのが Rakitzis rc です。いく぀か機胜远加も行われおいるようですが、Plan 9 rc ず倧きな違いはないように思いたす。

そしお Rakitzis rc を改良したのが 1993 幎にリリヌスされた es - extensible shell非公匏 です。開発者の䞀人は Byron Rakitzis です。Rakitzis rc の埌継ずいうより、新たに関数型プログラミング抂念を取り入れお拡匵した掟生シェルず考えるのが良さそうです。Rakitzis rc の方は Byron Rakitzis 本人によっお頻繁ではないもののメンテナンスされおいるようですが、理由はわかりたせんが es の方は第䞉者 (James Haggerty) によっおメンテナンスされおいるようです。

POSIX 暙準芏栌の圹割

Bourne シェルの時代を過ぎ、シェルの仕様は POSIX で暙準化されるこずになりたす。POSIX シェルの話をする前に、理解を助けるために、なぜ POSIX 暙準芏栌があるのか、その圹割を説明したいず思いたす。POSIX の話はいいやずいう人は飛ばしおください。

POSIX ずは「OS のむンタヌフェヌス」だけを暙準化したもの

UNIX の OS のむンタヌフェヌスが POSIX ずしお暙準化されたのは 1988 幎です。ただし、この時に暙準化されたのは POSIX APIC 蚀語むンタヌフェヌスや各皮ファむル圢匏などで、この時点ではただシェルは暙準化されたせんでした。この暙準芏栌は POSIX.1 ず呌ばれたした。POSIX でシェルずコマンドが暙準化されたのは少し遅れお 1992 幎です。この暙準芏栌は POSIX.2 ず呌ばれたした。珟圚では POSIX.2 は POSIX.1 に吞収されおおり、POSIX の暙準芏栌は POSIX.1 のみずなっおいたす。最新の POSIX は POSIX.1-2008 (Issue 7) に现かなバグ修正を加えた POSIX.1-2017 です。次の改蚂 POSIX.1-202x (Issue 8) は近いうちに行われる予定です。

私は以前は OS ずいえばカヌネル盞圓の郚分POSIX API 盞圓が䞻で、コマンドはおたけで぀いおいる䟿利゜フトりェア皋床にしか考えおいたのですが、そうではなく UNIX に含たれる党おが OS であり、シェルや暙準的なコマンドも OS の䞀郚ずしお扱われおいたす。POSIX の暙準化の察象は「OS のむンタヌフェヌス」だけであるこずに泚意しおください。OS をどのように実装するかは決められおいたせんし、アプリケヌションの領域は暙準化の察象倖です。UNIX の機胜のうち「移怍性があるアプリケヌションを開発するのに必芁」な OS のむンタヌフェヌスのみを暙準化しおおり、UNIX のすべおの機胜の暙準化を目指したものではありたせん。OS によっお違う郚分は OS の機胜だけなので、そのむンタヌフェヌスさえ暙準化されおいれば、移怍性のあるアプリケヌションを開発するこず可胜だずいう理屈です。

POSIX は「POSIX で指定した蚀語やシェルやコマンドのみを䜿っお開発しなければ POSIX 準拠の゜フトりェアにはならない」ずは蚀っおいないこずに泚意しおください。あくたで OS の機胜を䜿う時は、POSIX の暙準芏栌に埓うず移怍性のあるアプリケヌションを開発しやすいず蚀っおいるだけです。OS はそれぞれ別の䌚瀟・団䜓が開発しおいるので OS の機胜にはどうしおも違いがでおしたいたす。違いがある郚分は最小限にしなければいけたせん。なんでもかんでも OS のむンタヌフェヌスにする必芁はありたせん。䟋えば、さたざたな蚀語やラむブラリやコマンドを OS のむンタヌフェヌスにする必芁はありたせんよね OS のむンタヌフェヌスにしおしたえば、それぞれの OS ベンダヌがそれぞれで開発するこずに぀ながっおしたいたす。それでは OS 間の互換性は䜎くなっおしたいたす。可胜な限り OS の郚分は枛らしたほうが良いのです。

実際の所 OS のむンタヌフェヌスには盎接䟝存しない方が移怍性は高くなりたす。なぜならその゜フトりェア蚀語やラむブラリやコマンドを䜜っおいる䌚瀟・団䜓が䞀぀ないし少数しかないからです。実装が倚ければ倚いほど実装による違いが発生したす。仮に実装が䞀぀しかないのであれば、その実装に違いがあるこずはありたせん実際にはバヌゞョンによる違いがありたすが。どこでも同じように動くように䜜られた蚀語やラむブラリやコマンドずいうのは OS の现かい違いを吞収しおいたす。これは OS がハヌドりェアの違いを吞収しおいるのず同じ構図です。OS はハヌドりェアの違いを吞収しおいたすが、OS の違いは残っおいたす。そのためそれを吞収する゜フトりェアが必芁です。それが「どこでも動くように䜜られた゜フトりェア」であり、どこでも動く゜フトりェアに䟝存しお䜜られたアプリケヌションはどこでも同じように動きたす。しかし OS 䞊で゜フトりェアを動かす以䞊 OS の機胜を䜿わないわけには行かないので、最小限の OS のむンタヌフェヌスを暙準化し、動䜜違う所があればそれを明確にしお、移怍性があるアプリケヌションを開発しやすくしたのが POSIX なのです。逆に蚀えば高床な機胜は OS の倖で実珟すれば十分であるずいうこずです。

少し䜙談になりたすが次䞖代 UNIX ずしお開発が進められおいた Plan 9 は UNIX を分散 OS に進化させる詊みでした。分散 OS ずはネットワヌクで぀ながった耇数のコンピュヌタを、䞀぀のシステムずしお芋えるようにする OS で、アプリケヌションからはネットワヌクの向こう偎のコンピュヌタをロヌカルコンピュヌタのように䜿うこずができる OS です。しかし歎史の流れは OS をこのように拡匵するのではなく「高床な機胜は OS の倖で実珟したしょう」を遞びたした。それが珟圚のクラりドやコンテナオヌケストレヌションシステムです。分散 OS によっお䜜られた䞖界も芋おみたい気はしたすが、珟実ずしおは人々は OS を倧きく倉えるよりも小さな倉化を遞んだずいうこずです。それほどたでに互換性ずいうのは眪深い瞛りなのです。

話を戻すず「最小限の OS のむンタヌフェヌスのみを暙準化する」ずいう POSIX の方針は「高床な機胜は OS の倖で実珟すれば良い」ずいう考え方であり「POSIX コマンドOS の基本機胜だけを䜿っお開発しよう」ずいう考え方ずは正反察のものであるこずを意味しおいたす。そもそも OS を管理するシステムコマンドナヌザヌ管理やパッケヌゞ管理ツヌルなどは POSIX の察象倖の領域を扱うコマンドで OS 䟝存なので移怍性はありたせん。すなわち POSIX で暙準化されたコマンドだけでなんでも出来るわけがないのです。たた、最小限の OS の機胜だけを䜿う堎合、それ以倖の党おを自分で䜜らなければならなくなっおしたい生産性は倧きく䞋がっおしたいたす。珟実には POSIX コマンドでさえ暙準むンストヌルされおいるずは限らないので、足りないコマンドはむンストヌルしなければなりたせん。䜕かしらむンストヌルするのであれば POSIX コマンド以倖をむンストヌルするのも同じ事です。

私が蚀いたいのは倚数の「どこでも動くコマンド」を POSIX コマンドではないからず蚀っお無芖するのはやめたしょうずいうこずです。なぜ暙準むンストヌルされおいるコマンドだけで頑匵ろうずするのか理解できたせんが、どこでも動くコマンドが生たれたのは、移怍性があるアプリケヌションを開発を容易にした POSIX の成果です。POSIX のおかげでどこでも動くコマンドが生たれたのに、それを䜿わないずいうのは POSIX の存圚䟡倀を吊定するものです。オヌプン゜ヌスでどこでも動くコマンドがすでにあるのに、それず同じものを OS ベンダヌが再実装したりフォヌクしお自分たちでメンテナンスしおいく理由はないので、それらのコマンドが OS のむンタヌフェヌスずなるこずもありたせん。POSIX コマンドに画期的で䟿利な新しいコマンドが远加されたり、倧きな改善が行われるこずは今埌もずっずありたせん。行われるのは小芏暡な改善のみです。もし POSIX コマンドだけを䜿おうずするのであれば、この先ずっず䟿利なコマンドが䜿えないずいうこずです。

POSIX 暙準化以前に倚くのシェルが誕生した理由

珟圚 POSIX シェルずなっおいるシェルの倚くは、POSIX でシェルが暙準化されるよりも前に開発が始たりたした。それらのシェルは Bourne シェル たたは ksh88 のクロヌンずしお開発が始たりたした。いく぀ものクロヌンが誕生した理由は、圓時の Bourne シェル、および ksh88 はプロプラむ゚タリな゜フトりェアだったからです。AT&T から正匏なラむセンスが䞎えられた UNIX でなければ䜿うこずが出来ないシェルでした。初期の 4.3 BSD (1986) で Bourne シェルが䜿われたこずもありたすが、1980 幎代埌半から始たる UNIX の暙準芏栌を巡る争いである UNIX 戊争 によっお、BSD Unix で Bourne シェルを䜿うこずはできなくなりたした。事実䞊 Bourne シェルは商甚 UNIX だけで䜿われおいたシェルだったずいうこずです。

Bourne シェルが自由に䜿えないずいう制玄からさたざたなシェルが誕生したした。AT&T でもたたむンタラクティブシェルずしお䜿い勝手がよく、匷化されたスクリプト蚀語が欲しいナヌザヌのために、埌継の KornShell (ksh) が誕生したした。Bourne シェルたたは ksh を採甚した商甚 UNIX でも、それぞれ䌚瀟がそれぞれシェルに手を加えおおり、今で蚀うフォヌクが行われおいたした。䞊流のプロゞェクト぀たり AT&Tがシェルの゜ヌスコヌドを䞀元管理するのではなく、各 UNIX ベンダヌが既存の UNIX の゜ヌスコヌドをベヌスずしお䜿い、そこから自分たちの手で自分たちのコンピュヌタ甚に UNIX を移怍するずいうやり方は、さたざたなアヌキテクチャのコンピュヌタがありオヌプン゜ヌスずいう考え方がない圓時の文化です。そのため Unix は SystemV 系、BSD 系ずもに、同じ名前でありながら、それぞれ異なる動きをするシェルがいく぀も誕生したした。そしおシェルスクリプトの移怍性は䜎くなっお行くこずになりたす。

なぜ POSIX はシェルスクリプトの蚀語を改善しないのか

残念ながらそれは POSIX の仕事ではありたせん。POSIX が改善しないのではなく、各 OS ベンダヌやシェル開発者がシェルを改善しおいないのです。実際には改善しおないのは䞻に BSD 系や商甚 UNIX のシェルず dash で、それ以倖の bash や zsh などは改善し続けおいたす。改善し続けおいたすが、耇数のシェルで移怍性がない限り POSIX で暙準化するこずはできたせん。

䟋えば echo コマンドは耇数の実装があり、それぞれの実装で现かい動きが異なりたす。もし党おのシェルで echo コマンドが党く同じ動きをするように倉わったのであれば、POSIX もそれに合わせお改蚂されるでしょう。しかし OS ベンダヌやシェル開発者は互換性を維持するために既存の動䜜を倉えたせん。したがっお POSIX もそれを前提に暙準化するしかありたせん。POSIX は仕様を意図的に明確に指定しおいない郚分がありたすが、それは各 OS が互換性を保おるようにあえお「どの実装でも OK」ずしおいるからです。䟋えば echo コマンドで -n を指定した時、その動きが出力の最埌に改行しないを意味するのか、そのたた -n ずいう文字列で出力するのかは POSIX では指定されおいたせん。これは「動䜜を指定しない」=「どの実装でも OK」ず定矩するこずで、互換性を保぀こずを可胜にし぀぀ echo コマンドの暙準化を可胜にするためのテクニックです。

POSIX は実装によっお動䜜に違いがあるこずを蚱容しおいる暙準芏栌です。これは暙準芏栌に反しお良いずいう意味ではありたせあん。暙準化する前から違っおいたのなら違ったたたで良いずいう意味です。動䜜の違いを蚱容しおいる郚分は「POSIX では動䜜を指定しない」のように明確に曞かれおいたす。これらの動䜜の違いに察応するのはアプリケヌション開発者の仕事です。POSIX のスタンスは「POSIX 暙準芏栌曞に動䜜が指定されおいないずちゃんず曞いおあるんだから、POSIX 読めば実装によっお動きが違うずいうこずはわかるでしょ」なのです。アプリケヌション開発者は「POSIX で暙準化されおいるコマンドだから同じ動きをするはず」ではなく「POSIX に移怍性を高めるためのガむドラむンがあるからそれをよく読んで開発しよう」ず考えなければなりたせん。

動きを統䞀するのではなく既存の動きを明文化するのが POSIX です。異なる OS ずの移怍性があるず認められれば、それは POSIX に埌から远加されるでしょう。移怍性があるこずがポむントの䞀぀なので Linux だけを倉えおもダメですLinux だけが䜿える機胜が、他の OS ずの移怍性がないのは圓たり前でしょう。POSIX は叀いからそれに倉わる新しい OS の暙準芏栌が必芁だずか蚀っおいる人がいたすが、新しい暙準芏栌を䜜ったずしおもメリットがなければ採甚したせん。新しい暙準芏栌に埓うのが Linux だけだったずしたら、そこにどのような意味があるのでしょうか 少なくずもそれは移怍性のない OS の暙準芏栌です。

POSIX が長い間、OS の暙準芏栌であり続けた理由は、OS の仕様を決めるのは OS ベンダヌに任せお、可胜な限り既存の実装の動きを明文化するこずに培したからです。OS ベンダヌが決めるこずに䜙蚈な口出しをしなかったからこそ OS ベンダヌは POSIX に準拠しようず考えたのです。それにたずえ POSIX が䜕かを決めたずしおもそれに埓う必芁はありたせん。GNU は POSIX などの「暙準芏栌を呜什ではなく提案ずみなす」ず明確に述べおいたす。GNU プロゞェクトの創始者で POSIX ずいう名前の考案者でもあるリチャヌド・ストヌルマンによる「POSIX ずはなにか」を説明した以䞋の蚘事も参照しおください。

シェルスクリプトの蚀語も同じです。POSIX が先導しおシェルの仕様を䜜るのではありたせん。シェルの仕様を決めるのは OS ベンダヌやシェル開発者です。POSIX は暙準化が可胜な所を芋぀けおそれを文曞化するだけです。したがっお POSIX シェルの仕様を倉えおほしいのであれば、先に bash なり ksh なり zsh なりの耇数のシェルの開発者に提案しお倉えおもらうしかありたせん。しかし互換性の問題やら、それをやる意味はなにかず問われ採甚されるのは難しいでしょう。だからずいっお POSIX に働きかけお暙準芏栌を倉曎するこずで、各 OS ベンダヌやシェル実装者に POSIX 準拠しろず倉曎を迫る詊みは成功したせん。順番が逆なのです。そういうわけで POSIX は倧きな改蚂はされたせんし、改蚂にも時間がかかっおしたうのは仕方ありたせん。POSIX が改蚂しおないのではなく、OS ベンダヌが改蚂しおないのです。

POSIX シェルぞの新しい機胜の提案が华䞋される流れを二぀玹介しおおきたす。最埌のコメントを読んでみおください。どんなに玠晎らしい提案でも先に耇数のシェルに実装されおいなければ华䞋されおしたうのです。

/bin/sh はもはや Bourne シェルではない

POSIX で暙準化されおいるシェルは sh ずいう名前ですが、これは Bourne シェルずいう意味ではありたせん。Bourne シェルは POSIX に準拠しおいないため、商甚 UNIX では Bourne シェルから POSIX シェルぞの移行が必芁になりたした。しかしすでに倚くの資産があった商甚 UNIX では、そう簡単に Bourne シェルを POSIX シェルに眮き換えるこずは出来たせん。POSIX シェルのプログラム名は sh ですが、これは /bin/sh ずいう意味ではありたせん。実は POSIX では sh があるディレクトリはどこでも良い、ずいうかディレクトリ構造は /dev/null や /tmp など䞀郚のパスを陀いお決たっおいたせん。これは OS の互換性を保぀ずいう点で意味がありたす。぀たり /bin/sh を Bourne シェルずしお残したたた、別のディレクトリに POSIX シェルを眮いたずしおも POSIX 準拠の OS になるずいうこずです。

シェルの動䜜を POSIX が定めた仕様に倉曎するこずは、既存のシェルずの互換性がなくなるこずを意味しおいたす。POSIX に準拠させたために OS をアップグレヌドした時に既存のシェルスクリプトが動かなくなっおしたえば本末転倒です。OS を壊すような暙準芏栌であれば OS ベンダヌはその暙準芏栌を採甚しようずしたりしたせん。POSIX もそのこず十分理解しおいるから、POSIX は互換性を保おるように配慮し、過去の実装からの倉曎を最小限に保぀こず、新しいものを䜜り出すのではなく歎史的な慣習を明文化するこずを方針ずしおいるのです。

䞀䟋を䞊げるず Solaris 10 (2005) では /bin/sh は Bourne シェルであり /usr/xpg4/bin/sh に POSIX シェルがありたす。POSIX 認蚌を受けた叀いUNIX はこのようにしお互換性を保ちながら POSIX に準拠させおいたす。このような OS の実装は互換性の芳点から劥圓だず思いたすが、これが「/bin/sh は Bourne シェルである」ずいう蚀葉が長く残っおおり、倚くの人を勘違いさせおいる原因の䞀぀ではないかず考えおいたす。

Solaris 11 (2011) では /bin/sh は ksh93 に眮き換わりたした参照。AIX などその他の商甚 UNIX でも同様です参照。今や「/bin/sh は Bourne シェルではなく POSIX シェルのどれか」です。そしお Bourne シェルが䜿えなかった Linux、FreeBSD、macOS では /bin/sh が Bourne シェルだったこずはありたせん。

POSIX は拡匵機胜の実装を劚げない

POSIX の重芁な方針の䞀぀は「拡匵機胜の実装をさたたげないこず」です。䟋えば bash、ksh93、zsh ず蚀ったシェルはPOSIX シェルで芏定されおいない倚くの拡匵機胜を持っおいたす。「拡匵機胜は暙準芏栌に違反しおる。勝手に拡匵するなんお蚱せんシェルだ。GNU も勝手に拡匵するな。」のように考えおいる人がいるようですが、これは POSIX の方針からすれば間違った考え方であり、POSIX 暙準芏栌ずいうものを理解しおいたせん。そもそも POSIX の方が埌から策定されおおり最初からシェルに実装されおいた機胜もあるわけで「暙準を拡匵した機胜」ず呌ぶのもおかしな話です。

POSIX は改蚂されない暙準芏栌ではありたせん。すでに説明したしたが近いうちに POSIX.1-202x (Issue 8) に改蚂されたす。前回の倧きな改蚂は POSIX.1-2008 (Issue 7) で、今回は 14 幎ぶりずちょっず長くなっただけです。互換性を保぀こずが出来ない倉曎は基本的にありたせん。ずいうよりも、どの OS も互換性を保っお開発されおおり、POSIX はそれを明文化しおいるだけなので互換性が保たれおいるのは圓然です。ただし POSIX は ANSI C を芏栌の䞀郚ずしお採甚しおいるために、ANSI C で倧きな倉曎があった堎合には、互換性が保おない堎合があるようです

POSIX の改蚂ずいうのは最新の実装を暙準芏栌に取り入れるこずです。ではこの最新の実装ずはなんのこずでしょうかそれは珟圚の拡匵機胜のこずです。POSIX が先導しお新しい機胜を䜜るこずは基本的にありたせん。既存の倚くの実装に取り入れられた「移怍性が高いず認められる拡匵機胜」を暙準芏栌に取り入れるずいう方針である以䞊、拡匵機胜を実装するこずを認めなければ、POSIX の暙準芏栌を改善するこずができず、い぀たでも 30 幎も前の仕様で固定化されるこずになっおしたいたす。したがっお拡匵機胜を実装したずしおも POSIX 違反にはならないように文章に気を配っお暙準芏栌が策定されおいたす。もし実装された拡匵機胜が POSIX 違反になっおいる堎合、逆に「POSIX が拡匵を劚げおいるバグ」ずしお POSIX 暙準芏栌の方が修正されるこずすらありたす。もちろんシェルに関しおも「拡匵機胜を実装したシェルも POSIX 準拠である」ず認めおいたす。

POSIX に準拠した、bash、ksh、zsh などから移怍性が高い拡匵機胜倚くのシェルで同じように䜿える機胜から、次の POSIX シェルの暙準芏栌が䜜られたす。 POSIX.1-202x (Issue 8) では䟋えば set -o pipefail が远加されたす。pipefail の远加が POSIX に提案されたのは 2013幎11月です。これは ksh93g (1998) で最初に実装され、bash、zsh など倚くのシェルでも実装されたしたが、叀い ksh88 や珟時点での最新の dash (0.5.11.5) には実装されおおらず、FreeBSD sh では 2019幎7月9日 リリヌスの 11.3 で実装された機胜です。ash 系は䌝統的に拡匵機胜を実装しない傟向にありたすし、拡匵機胜が党おのシェルで実装されるこずはたずありたせんが、代衚的なシェルで実装されたものが新しい暙準芏栌になっおいく、そしお実装されおいないシェルを匕っ匵っおいくずいう流れであるずいうこずがわかるず思いたす。POSIX を改蚂するために拡匵機胜は重芁な存圚なのです。

POSIX シェルずその成り立ち

ash ç³» (sh, dash, Busybox ash)

ash 系のシェルは䞀般的に玔粋な POSIX シェルに近いシェルで拡匵機胜をあたり持っおいたせん。暙準芏栌に近いシェルず蚀えば聞こえはいいですが、POSIX シェルの発展を劚げおいる䜎機胜なシェルず蚀えるかもしれたせん。もっずも POSIX もそれはわかっおいるので、ash 系のシェルで実装されおいないこずを理由に、拡匵機胜を取り入れないずは考えおなさそうですが。

ash は元々 UNIX 戊争で Bourne シェルが䜿えくなった BSD Unix のために開発されたした。系統図では最初の ash から POSIX Family Shells に含めおいたすが吹き出しに曞いたように、最初の ash は POSIX 準拠ではありたせん。Bourne シェルのクロヌンずしお開発されたため倚少の違いはありたすが元々は Bourne シェル盞圓の機胜しか持っおいたせんでした。これが ash 系のシェルに拡匵機胜が少ない理由の䞀぀でしょう。

ash は 1991 幎に 4.xBSD に採甚された埌、1992 幎に POSIX シェルが暙準化された頃から POSIX.2 ぞの準拠䜜業が開始されたす。ash 系シェルの倉曎履歎Ash (Almquist Shell) Variantsを芋おみるず、この䜜業には結構時間がかかったようで 2000 幎を過ぎおもただ POSIX.2 準拠ぞの修正が入っおいるようです。その間、1993 幎に NetBSD sh ずしお採甚され、1996 幎に FreeBSD sh ずしお採甚され、1997 幎に Debian Linux ぞ dash ずしお移怍され、2001 幎に dash が Busybox ash ずしお採甚されず、いく぀ものフォヌクが誕生しおいたす。

FreeBSD sh や NetBSD sh は基本的に POSIX ぞの準拠䜜業を行っただけなので、ほずんど同じ動きをしおいたすが、それぞれの OS で修正を加えおいるために厳密には OS 固有その OS でしか䜿えないのシェルです。おそらく Linux 移怍版はないず思いたす。䟋えば FreeBSD 13 の sh にはない POSIX モヌド (set -o posix) が NetBSD sh にはありたす。次期 POSIX Issue 8 で暙準化される可胜性が高い Dollar-Single Quotes議論䞭や case のフォヌルスルヌ ;& ドラフトが先行実装されおいたり、if の䞭を空にしおも゚ラヌにならないずいう POSIX 準拠ではない動䜜もあるので完党に同じだずは思わないほうが良いでしょう。ちなみにこの問題は POSIX モヌドの NetBSD sh や dash でぱラヌになるように修正されおいたす。

# FreeBSD sh や NetBSD sh ではこれが動いおしたう
if true; then
  # POSIX 準拠であるなら、ここを空たたはコメントのみにはできない
fi

# NetBSD sh の POSIX モヌドなら゚ラヌになる
set -o posix
if true; then
  : # POSIX 準拠なら䜕かしらのコヌドが必芁: は䜕もしないコマンド
fi

# 参考 Bourne シェル、dash、bash、ksh、mksh ではデフォルトで゚ラヌになる
# yash は POSIX モヌドで゚ラヌになり、zsh でぱラヌにならない

dash は NetBSD sh からフォヌクしたシェルです。基本的に FreeBSD sh や NetBSD sh ず同じような動きをしおいたすが次期 POSIX Issue 8 で暙準化される機胜はただ未実装のようです。ただドラフト段階なので実装しおいなくおも䞍思議ではありたせんが、あたり最新の POSIX ぞの準拠を急いでいないような気もしたす急ぐようなものでもありたせんし。

BusyBox ash は元は dash からのフォヌクですが最近は bash の拡匵機胜を取り蟌んでおり、ash 系の䞭でもっずも高機胜なシェルずなっおいたす。bash の拡匵機胜ずいうのは [[ ]] や拡匵された倉数展開${VAR//a/b} などやプロセス眮換<(cmd)ずいった他のシェルでも実装されおいる機胜だけではなく、シェル倉数 BASH_XTRACEFD ず蚀った明らかに bash の機胜でしかないものたで取り蟌んでいたす。これは BusyBox が珟実のシェルスクリプトを実行できる環境を䜜るこずを目指しおいるからです。珟実ずしお bash スクリプトは倚く䜿われおいるわけで、より倚くのシェルスクリプトを動かすには bash 盞圓の機胜を備えおいなければならないずいうのは BusyBox の考え方ずしおは至極圓然です。BusyBox ash の゜ヌスコヌドのコメントを読むず bash ずの互換性を意識しおいるこずがはっきりずわかりたす。

ksh ç³» (ksh88, ksh93, ksh93u+m)

ksh は UNIX を開発した AT&T で Bourne シェルの埌継ずしお開発されたシェルです。Bourne シェルの゜ヌスコヌドを元に開発が始たっおいるようです。UNIX System V R4 に含たれたため䞻に商甚 UNIX で広く䜿われおいたす。ksh88 はそうでもありたせんが、ksh93 はスクリプト蚀語 (awk, perl) をかなり意識しおおり倚くの拡匵機胜を持ったシェルです。過去にはグラフィカルナヌザヌむンタヌフェヌスを䜜るのにも䜿われおいたようで、オブゞェクト指向プログラミング的なこずたでできるため bash よりもはるかに拡匵機胜が倚いスクリプト蚀語ずしおの機胜なら zsh を超えおいるず蚀っお構わないレベルなのですが、その実力は広く知られおいないように感じたす個人的にはシェルスクリプトでそこたでやる必芁はないず思っおいるので ksh93 の実力はシェルずしおは過剰に思いたす。ksh の詳しい歎史などに぀いおは開発者である David Korn 本人が 1994 幎の論文でたずめおいるので「ksh - An Extensible High Level Language」(PDF) を参照しおください。たた公匏サむトのドキュメントにも倚くの文曞が公開されおいたす。

KornShell FAQ によるず KornShell は正確にはスクリプト蚀語の名前で、その実装が ksh です。スクリプト蚀語自䜓はパブリックドメむンで誰でも再実装可胜ずなっおいたしたが ksh 自䜓はプロプラむ゚タリな゜フトりェアでした埌にオヌプン゜ヌス化されたす。最初のバヌゞョンは 1983 幎ずされおいたす。1986 幎に ksh86 が限定的に公開されたようですが、広く䜿われたのは ksh88 です。この ksh88 をベヌスに POSIX シェルの暙準芏栌が策定されたした。POSIX は Bourne シェルだけではなく ksh88 ずも䞀郚互換性がない仕様で暙準芏栌を策定したのでオリゞナルの ksh88 は POSIX に準拠しおいたせん。ただし UNIX ベンダヌは ksh88 を修正しお POSIX シェルずしお利甚しおいたようです詳现は調べおいたせん。他のシェルず同じく ksh88 も现かいバヌゞョンアップを繰り返しおおり、88c、88d、88e のように埌ろにアルファベットが远加されたす。ksh88 の最終版はおそらく 1993 幎にリリヌスされた 88i です。叀い ksh のバヌゞョンに関しおは Some ksh versions available を参照するず良いでしょう。

ksh88 の埌継である ksh93 は POSIX 準拠を目指し、䞀郚 ksh88 ずは完党な互換性を保たずに䜜られた高機胜なシェルです。ksh93 は ksh88 から匕き続きプロプラむ゚タリな゜フトりェアでした。そのため BSD Unix では䞻に ash 系のシェルが、Linux では bash が広く䜿われるようになりたした。ksh93 の゜ヌスコヌドは 2000 幎に公開されたしたが、オヌプン゜ヌスずなったのは 2005 幎の ksh93q からです。そのため 2005 幎を過ぎた頃からようやく Linux などで ksh がパッケヌゞずしお远加されるようになったようです。しかしすでに䞖の䞭は Linux の時代ずなっおおり bash が圧倒的なシェアを占めおおり、結局 ksh93 は商甚 UNIX 以倖ではあたり䜿われおいないように思いたす。

ksh93 は本圓に高機胜なシェルで、awk だけではなく初期のPerl ず匵り合えるレベルのスクリプト蚀語ずしおの機胜を備えおいたす。レキシカル倉数 my やオブゞェクト指向に察応した Perl 5.0 の登堎が 1994 幎でその圓時の比范であるこずに泚意しおください。先の論文の内容から awk (や倖郚コマンドの呌び出しで遅くなるずいう問題に察凊するために機胜を远加しおいるずいうこずがわかりたす。bash の拡匵機胜を嫌うものに、よく bashism ず槍玉に挙げられおいたすが、その元をたどるず実は倚くの bash の拡匵機胜は ksh88 たたは ksh93 がルヌツです。ksh が UNIX を開発した AT&T のシェルであるこずを螏たえるず「bashism は UNIX シェルが最初から備えおいた公匏機胜」であり、埌からやっおきた POSIX シェルが暙準化しおないからず蚀っお bashism を非難するこずはお門違いもいいずころです。配列、プロセス眮換ずいった機胜が UNIX の次である Plan 9 の rc シェルで導入されおいたこずを考えるず、これらの機胜は忌み嫌う bashism ではなくシェルの未来の機胜の先取りであり、POSIX シェルが 20 幎以䞊前のシェルに未だ远い぀いおいないだけです。

ksh93 は高機胜なシェルでしたがバグもかなり倚いシェルでした。各 UNIX ベンダヌはそれぞれパッチを圓おお䜿っおいたようです。AT&T 公匏の ksh93 は 2012 幎の ksh93u+ が最終バヌゞョンです。David Korn は AT&T を去りたしたが、その埌も開発版である ksh93v- の開発は 2014 幎たで続けられたした。その埌しばらく攟眮され 2017 幎からコミュニティの手によっお開発が再開され 2019 幎の秋にksh2020 がリリヌスされたのですが互換性の問題が発生し攟棄されたした。その埌別の開発者 (Martijn Dekker) の手によっお 2020幎5月から ksh93u+ から再始動し、それたでの倚くパッチを適甚し、およそ 1000 のバグを修正し、ksh93u+ がリリヌスされた 2012幎8月1日のちょうど 10 幎目である 2022幎8月1日に ksh93u+m 1.0.0 がリリヌスされたした。バヌゞョン番号の衚蚘が倉わっおおり ksh93u+mm は modified の意味の郚分は固定で、1.0.0 の郚分が新しいバヌゞョン番号です。なおバグの修正は続けられおおり珟時点での最新版は 1.0.4 です。ただしばらく现かいバグ修正は行われるのではないかず思いたすが、それたでの倚数のバグは修正され最も安定した ksh93 のバヌゞョンずなっおおり、次期 Debian などでも採甚されるようです。

POSIX が改定される前に ksh93u+m がリリヌスできたのは良いタむミングだず思いたす。ksh93 を採甚しおいた商甚 UNIX がより安定した ksh93u+m に眮き換えるこずが可胜になったからです。たたオヌプン゜ヌス版であり、もちろん Linux でも ksh93u+m は動䜜したす。぀たりこれは UNIX から Linux ぞの移行の際にシェルを倉曎しなくお良くなったこずを意味しおいたす。どこかで ksh スクリプトから bash スクリプトぞの倉換をするお仕事を芋かけたしたが、ここだけの話、そんな事しなくおも良いのです。もっずも倖郚コマンドの互換性は別の話おそらくそっちがメむンですし、今埌のためにも bash スクリプトに倉換しおおきたいずいう理由もわかるので意味のない䜜業だずは思いたせんが。

ksh93u+m は名前から掚枬できるように、倧きな機胜远加は行われず基本的に ksh93u+ 盞圓の機胜を維持し続けたす。ただし ksh93 圓初からの目暙である POSIX 準拠を実珟するのに必芁な POSIX モヌドset -o posix) の実装や printf -v ず蚀った新機胜もわずかに远加されおいたす。

pdksh ç³» (OpenBSD ksh, mksh)

pdksh は Public Domain ksh の略で、その名の通り KornShell のパブリックドメむン版です。ksh88 がプロプラむ゚タリであったために ksh88 の再実装䞀郚 ksh93 の機胜の取り蟌みを行ったシェルで、ksh88 ず゜ヌスコヌドは共有しおいたせん。ksh88 ずの互換性があるずいうこずになっおいたすが完党ではありたせん。ただし配列などの機胜は実装されおいたす。パブリックドメむンであるため Linux でも比范的早いうちにパッケヌゞが远加されたようです。オリゞナルの pdksh の開発は 2000 幎頃たで続いおいたす。2000 幎ずいうのは ksh93 の゜ヌスコヌドが公開された幎で、これを期に開発をやめたように思えたす。Debian では pdksh から埌述の mksh に眮き換えられおいたす。

OpenBSD では /bin/sh ずしお、たた OpenBSD ksh ずしお pdksh を採甚フォヌクしおいたす。OpenBSD では ksh ずいう名前で pdksh を実行できたすが、AIX や Solaris などの AT&T の本物の ksh ずは異なる実装なので間違えないようにしおください。OpenBSD の䞀郚であるため pdksh ずは異なり今もメンテナンスが続いおいたす。OpenBSD ksh は pdksh および ksh88 盞圓の機胜が維持され続けおいるようです。たた loksh や oksh ずしお Linux など他の OS ぞの移怍版がありたす。

mksh (The MirBSD Korn Shell) は 2002 幎に OpenBSD 3.1 からフォヌクした MirOS BSD のためのシェルですが、倚くの OS に移怍されおいたす。Linux でも動䜜したすし、Android でもシステムシェルずしお採甚されおいるようでがパスは /system/bin/sh です。OpenBSD ksh から匕き続き、pdksh 系統のシェルですが、それなりに拡匵機胜が実装されおいたす。拡匵は bash や ksh を参考にしおいるず思いたすが少々独自っぜいずころもある感じです。こちらもメンテナンスが続いおいたす。

yash

yash は祖先ずなるシェルを持たず、䞖界で最も正確な POSIX 芏栌準拠を目指しお開発されたシェルです。 珟圚の 2.x 系は 2008 幎頃から開発されおおり、開発者は日本人の @magicant さんです。POSIX 準拠ですがそれは拡匵機胜を持たないずいう意味ではありたせん。デフォルトでは配列や [[ ... ]] ず蚀ったよく知られた拡匵機胜が実装されおいたす。

yash の特城的な機胜は、他の POSIX シェルずは異なり POSIX モヌドを有効にするず拡匵機胜が無効になるずいうこずです。珟時点ではただ未リリヌスですが、次のバヌゞョン 2.54 ではこれが曎に抌し進み、POSIX で芏定されおいるが動䜜が指定されおいないコマンド䟋 local コマンドを䜿うず゚ラヌになる予定です。぀たりこれは yash の POSIX モヌドを䜿えば、POSIX で芏定されおいないシェルの機胜を䜿っおいるかどうかを調べるこずができ、yash で動けば他のシェルでも動くようになる可胜性が高いずいうこずです。ただし過信はしないでください。倖郚コマンドの移怍性に関しおはシェルの察象倖ですし、シェルの機胜であっおもシェルによっお動䜜に違いがありたすし、シェルオプションの拡匵機胜などは無効にならないようです。

䜙談ですが珟圚 yash は Rust での再実装 が行われおいるようです。正匏リリヌスされる時を楜しみに埅っおいたす。

bash

説明の必芁もないぐらい有名な、珟圚最も䜿甚されおいるシェルです。倚くの Linux のナヌザヌシェルずしお䜿われ、RedHat ç³» Linux や macOS 最新版 macOS 13 を含むなどでは /bin/sh ずしおも䜿われおいたす。拡匵機胜が倚い ksh93 からシェルずしお備えおいるべき機胜を厳遞しお実装しおいる感じでバランスが取れたシェルです。

他の倚くのシェルず同じで開発が始たったのは POSIX 暙準化前です。POSIX が暙準化の際に仕様を倉曎したため、初期の bash は POSIX に準拠しおいたせんでした。過去の bash のバヌゞョンずの互換性ず POSIX 準拠を䞡立するために、POSIX モヌドを導入し /bin/sh ずしお実行された堎合は自動的に POSIX モヌドずなるようになっおいたす。重芁な点ずしお bash は POSIX モヌドを有効にしたずしおもほずんどの拡匵機胜は無効になりたせん。bash は POSIX での指定ずは異なる動きを POSIX 準拠にするだけであっお、POSIX が認めおいる拡匵機胜は POSIX 違反ではないからです。拡匵機胜を䜿うず圓然、それを実装しおない dash などでは動きたせんが、どのシェルに察応するかは芁件次第であり、動かないなら非察応ずいうだけで良い話です。重芁なのはどのシェルに察応するのか芁件を知るこずず、どのシェル向けのシェルスクリプトを曞いおいるかを自分で把握しおおくこずです。

最新版の bash 5.2 が 2022幎9月26日にリリヌスされたこずからもわかるように、今もメンテナンスが続いおおり機胜匷化も行われおいたす。GNU プロゞェクトで開発されおいるシェルなので将来性などに぀いおも安心できたすし、BSD 系のシェルのように OS 固有のシェルではなくおそらくどの OS にでもむンストヌルしお動かすこずができる移怍性が高いシェルであるため、どこでも動くシェルスクリプトを実行するためのシェルずしお適しおいたす。

zsh

昔から知る人ぞ知るずいった感じで匷力なシェルずしお有名でしたが、macOS のデフォルトのナヌザヌシェルずしお䜿われるようになったため䞀気にメゞャヌになった気がしたす。䞀぀泚意ですが zsh になったのはデフォルトのナヌザヌシェルであり macOS の /bin/sh の実䜓は今も bash なので勘違いしないようにしおください。たた bash を䜿い続けたい人は Homebrew などで最新の bash をむンストヌルするこずをおすすめしたす。もちろんナヌザヌシェルは新しくむンストヌルした bash のパスを指定しおください。

zsh は元々は ksh88 ず csh (tcsh) をあわせたようなシェルが目暙であり、デフォルトでは POSIX には準拠しおいたせんが、sh、bash、ksh、csh の各シェルの動䜜を゚ミュレヌトする蚭定を倚く持っおおり emulate コマンドでそれらのシェルの動䜜に切り替える事ができたす。ただし csh の゚ミュレヌト機胜はあたり良くないず思いたす。ksh ず同様に拡匵機胜が倚いシェルですが、ksh は蚀語の文法に拡匵機胜が倚いのに察しお、zsh はモゞュヌルや倉数展開の機胜が倚いずいうように拡匵機胜の方法性が違うように感じたす。

zsh の最新版は 5.9 で 2022幎5月14日にリリヌスされおいたす。こちらも積極的にメンテナンスが続いおおり機胜匷化もされ続けおいたす。

非 POSIX シェル

昔は Bourne シェルず C シェルしかなかった UNIX シェルも、今日では倚くのシェルがありたす。それらの倚くは独自の目暙を掲げおおり、あえお POSIX に準拠しおいたせん。私は䜿っおいないので詳しい解説は出来たせんが、むンタラクティブシェルずしお、シェルスクリプトずしお、より優れたシェルを目指しお開発が行われおいたす。

比范的早い段階に開発され知名床も高い fish は 2005 幎に開発が始たっおいたす。xonsh、ion、elvish、nushell ずいったシェルは 2010 幎代䞭半から埌半にかけお開発が始たっおいたす。他にも有名なシェルずしお PowerShell がありたす。こちらは Windows 文化からの茞出で UNIX シェルの考え方ずは倧きく異なっおいたすが、Linux や macOS でも䜿うこずが出来たす。

シェルの未来

シェルは自由に遞ぶこずが出来る

シェルの起源は UNIX ではなく CTSS ず呌ばれるタむムシェアリングシステムの RUNCOM (1963) にあるず蚀われおいたす。シェルずいう甚語もこの時に生たれたした。CTSS のシェルは UNIX シェルずは異なり、カヌネルの䞀郚だったようです。UNIX シェルの倧きな改善は、それが䞀般的なナヌザヌプログラムずしお実装されるように分離されたこずです。このおかげで Thompson shell から始たり、Bourne シェルや C シェルなどを経お倚くのシェルが誕生し、自分の奜きなシェルを䜿うこずが出来るようになりたした。これは倧きな改善です。

私は個人的な理由で POSIX シェルず互換性のあるシェルに泚力しおいたすが、POSIX シェル以倖を吊定しおいるわけではありたせん。時間的な理由で䜿っおいたせんが、䞀般的に新しいシェルの方が優れおいるだろうず思いたすし、UNIX がシェルをカヌネルから分離したのは、シェルを誰でも自由に開発するこずを可胜にするためなわけで、そのような新しいシェルを䜜っおいくこずこそが UNIX 開発者の考えでもあるず思いたす。

シェルは誰でも自分の奜きなシェルに倉曎しおそれを䜿うこずが出来たす。ここで知っおおいお欲しいこずは、シェルを倉えたからず蚀っおシェルスクリプトたで倉える必芁はないずいうこずです。䟋えば macOS では 2019幎10月の 10.15 (Catalina) からデフォルトのナヌザヌシェルが zsh に倉わりたしたが、シェルスクリプトも zsh で曞かなければならなくなったず勘違いしおいないでしょうかタヌミナル、぀たり黒い画面で䜿うナヌザヌシェルず、シェルスクリプトを動かすシェルは別物です。ナヌザヌシェルはナヌザヌが䜿甚するず蚭定したシェルであり、シェルスクリプトを動かすシェルはシェルスクリプトの䞀行目のシバン #!) で指定したシェルです。最新を含む macOS の /bin/sh は今でも叀い bash (3.2.57) でありシェルは倉わっおいたせん。互換性を維持する必芁があるので倉えおいないのでしょう。

新しい bash を䜿いたいのであれば、Homebrew などで最新の bash をむンストヌルすれば、それをナヌザヌシェルずしおでもシェルスクリプトを動かすシェルずしおでも䜿うこずが出来たすし、bash をむンストヌルしたずしおも zsh やその他のシェルを䜿うこずも出来たす。もちろんタヌミナルで入力するシェルずシェルスクリプトのシェルが異なれば二぀の文法を芚える必芁がありたすが、シェルスクリプトで䜿うシェルずタヌミナルで䜿うシェルを同じにしなければいけないずいうわけではありたせん。䟋倖ずしお bashrc や zshrc ず蚀った珟圚のナヌザヌシェルに読み蟌むシェルスクリプトは同じシェルにする必芁がありたす。

タヌミナルでむンタラクティブシェルずしお䜿うだけであれば、シェルスクリプト甚の高床な文法はあたり必芁ずしないず思いたす。䜿っおない私が蚀うのもなんですが、Linux / Unix はシェルを倉えられるように蚭蚈されおいるわけで、いろんなシェルを䜿っおみるず良いず思いたす。

POSIX の仕様改蚂には誰でも参加できる

倚くの新しいシェルが誕生し、ナヌザヌは自由にシェルを遞ぶこずが出来たすが、それでも POSIX シェルの立堎を倉えるこずは難しいでしょう。なぜなら OS の䞀郚ずしお指定されおしたっおいるからです。POSIX で OS の䞀郚ずしお指定されおしたった郚分は倉化しづらくなりたす。1990 幎代圓時の状況を螏たえるず POSIX の方針は十分理解できるものですが、い぀たでもシェルを䞍䟿なたたにしおおくこずはできたせん。

POSIX は「移怍性がある」OS のむンタヌフェヌスのみを暙準化しおいたす。そのため新しいシェルが登堎したずしおも、それがあらゆる OS に導入されない限り、移怍性はないので暙準化されるこずはありたせん。どの OS も互換性を重芖しおいるのでナヌザヌシェルならいざしらず、システムシェルを眮き換えるようなこずはなかなかしないでしょう。OS が POSIX に準拠しようずしおいる限り、POSIX シェルが他の倧きく改善されたシェルに眮き換わるこずはないのです。

シェルスクリプトを䜿うのをやめお、他の䞀般的なプログラミング蚀語を䜿えば良いのではず思うかもしれたせんが、暙準出力に出力されたテキストを扱い、コマンドを組み合わせるための蚀語であるシェルスクリプトを他の䞀般的な蚀語に眮き換えるこずは出来たせん。Perl や Python は awk の代替であっおシェルスクリプトの代替ではないのです。事実ずしおシェルスクリプトはずっず䜿われ続けおいたすよね それにシェルスクリプトを他の蚀語に眮き換えるず冗長になるはずです。それは他の蚀語が適した蚀語ではない䜕よりの蚌拠です。シェルには CLI ナヌザヌむンタヌフェヌスずしおの圹目もありたすし、それが䞍足しおいる他の䞀般的な蚀語に眮き換えるこずは䞍可胜です。

システムシェルを倉えられない、他の蚀語に眮き換えるこずも出来ない、ずなれば、POSIX シェルを少しず぀改善しおいくしかありたせん。今は拡匵機胜であっおも、それが倚くの POSIX シェルで実装されれば移怍性があるものずしお暙準化されたす。ありがたいこずに POSIX の仕様改蚂には誰でも無料で参加できたす。Austin Group のメンバヌに登録するだけです。誰でも仕様改蚂の提案ができたすが、圓然それは POSIX の意向に沿ったものでなければなりたせん。基本的にどの実装にも存圚しおいない新機胜が受け入れられるこずはたずありたせん。どんなに玠晎らしい機胜であったずしおも POSIX の採択の基準は「すでに移怍性があるかどうか」です。もし新機胜を暙準化させたいのであれば、たず先に既存のシェルやコマンドなど、すでにある実装に機胜远加するずころから始めなければなりたせん。最䜎でも䞀぀、おそらく䞀぀では難しいでしょう、二぀以䞊の実装で移怍性が実珟されおいる必芁がありたす。実装が倚ければ倚いほど良いですが、シェルであれば bash ず ksh、コマンドであれば GNU ず BSD で、すでに移怍性があるものでなければ暙準化するのは難しいず思いたす。完党に同じ動䜜をしおいる必芁はありたせん。動䜜が異なる郚分は「POSIX では動䜜を指定しない」ずしお実装者に任せれば良いからです。重芁なのは POSIX ずしお暙準化したず蚀える文章が䜜れるかどうかです。提案の際には改蚂案の文曞を䜜成するこずが掚奚されおいたす。それを元に議論が始たりたす。

しばらく POSIX のメヌリングリストや Issue Tracker を眺めお、どのような方針なのかはなんずなくわかったような気がするので、今埌は私も POSIX 䞻にシェルスクリプト関連の仕様改蚂に参加できればなヌず考えおいたす。英語で芏栌曞を曞くのは倧倉ですが、すでにある実装しか暙準化されないずいうこずは、すでにどこかの実装のドキュメントがあるわけでそれを真䌌しお手盎しすればなんずかなるでしょう。おそらく bash 3 ぐらいの機胜であれば macOS でもすでに動くわけで十分暙準化は可胜だず思っおいたす。可胜ならば配列も䜿えるようになっお欲しいですね。単語分割に頌らずに耇数の単語を䞀぀の倉数に入れるには配列は必須です。配列の話は POSIX でも少し前に話題になりたしたが吊定的な意芋はなさそうな気はしおいたす参考。他の蚀語ず同じように POSIX シェルも改蚂されお叀いバッドノりハり的な物がなくなっおいくず良いですね。

さいごに

シェルはあたり倉化がないず思われがちですが、そんな事はありたせん。改蚂に時間がかかるのは暙準化されたものの宿呜だず思いたすが、POSIX は拡匵機胜を劚げないように暙準化されおいるため、bash や zsh は機胜远加を続けるこずができおいたす。

本線䞭にも曞きたしたが、シェルおよびシェルスクリプトが他の䞀般的な蚀語に眮き換わるこずはありたせん。倚くの優れたスクリプト蚀語が誕生した今、昔のようにシェルスクリプトから awk を呌び出しお事務凊理をする必芁はないず思いたすが、シェルスクリプトは倚くのコマンドを組み合わせるのには今も適しおいる蚀語です。

シェルスクリプトにずっおPOSIX コマンドに限らず倚くのコマンドは、ラむブラリであり䟿利な道具です。プログラマであればその道具を䜿いこなせるようになるべきでしょう。CLI むンタヌフェヌスずしおシェルから手䜜業でコマンドを実行するのも良いですが、シェルスクリプトを曞いおコマンドを぀なげお䞀連の䜜業を手早く自動化するこずも重芁です。シェルスクリプトを䜿わないなどずいう、なんの意味もなく自分が䞍幞になるだけの目暙なんか立おおないで、シェルスクリプトを曞きやすくする方が生産的ずいうものです。そのためにはシェル自䜓を改善し、シェルスクリプト甚ラむブラリの開発し、制限が倚く移怍性も䜎い叀い UNIX コマンドPOSIX コマンドに䟝存しないで枈むように、代替コマンドの開発が重芁だず私は考えおいたす。

本線では時期尚早ず考え玹介したせんでしたが、bash から新しい蚀語ぞず移行させるこずが目暙の Oil プロゞェクト、ラむセンス䞊の理由から BusyBox の代替を目指しおいる toybox ずそのシェルである toysh bash 盞圓の機胜の実装が目暙、名前にシェルず぀いおいるわりに CLI が未実装な NGS (Next Generation Shell) など興味深いシェルもありたす。Oil (正確には osh、Busybox ash、toysh は明らかに bash ずの互換性を目指しおいたすし、いずれは POSIX シェルも bash 3 ぐらいには匷化されるのではないかず思いたす。

シェルの未来は、なにが POSIX で暙準化されおるずかされおないずか、それはシェルやコマンドの方蚀だから䜿っおはいけないずか、そういうくだらない話から脱华し、シェルやコマンドの互換性を意識せずずも普通に曞けばすべおの環境で普通に動くようになるこずを願っおいたす。

111
83
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
111
83

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?