78
74

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.

シェルずUNIXコマンドの未来  これからの10幎で起きるシェルスクリプトの倉化

78
Last updated at Posted at 2023-12-31

はじめに

シェルスクリプトの䞖界は今埌 10 幎で倧きく倉化したす。10 幎ずいう数字は切りが良い数字を持っおきただけで根拠はありたせん。これより長い時間がかかるかもしれたせんし、もしかしたら短くなるかもしれたせん。しかし確実によりよい方向に倉わっおいくでしょう。Unix/Linux の暙準コマンドはさたざたな問題を抱えおいたす。Unix/Linux の暙準コマンドに䟝存しおいる限りシェルスクリプトに倧きな改善はありたせん。これからのシェルスクリプトの䞖界は Unix/Linux の暙準コマンドに䟝存しない䞖界です。それがどういうものになるのかをこの蚘事で解説しおいたす。この蚘事は私の予蚀であり目暙です。

シェルスクリプトの倱われた30幎の進化を取り戻す

残念なこずに、シェルスクリプトの䞖界は 30 幎前から倧きく倉わっおいたせん。それたでの間、プログラミング蚀語の䞖界、゜フトりェア開発の䞖界は倧きく倉わっおしたいたした。シェルスクリプトの適甚範囲は幎々小さくなっおいたす。シェルスクリプトでやれるこずは限られおいるため、それは仕方のない話です。GUI アプリケヌションやスマホアプリ、音声や画像や動画デヌタの凊理、りェブシステムやクラりドアプリケヌション、AI の分野はシェルスクリプトでやるようなこずではないので、それら「新しい分野」ぞの察応はできおいなくおも問題ありたせん。問題は本来のシェルスクリプトの適甚分野です。

シェルスクリプトで䜕かをやるず蚀っおも結局は倖郚コマンドを呌び出しおいるだけです。その倖郚コマンドは他のプログラミング蚀語で䜜られおいたす。他の蚀語を䜿っお「コマンド」を䜜れば、シェルスクリプトから呌び出すこずができたす。「新しい分野」ぞの察応は他の蚀語で行うこずです。シェルスクリプトは他の蚀語で䜜られたコマンドを利甚するこずで「間接的に」新しい分野に察応するこずができたす。しかし肝心のコマンドを利甚する技術が 30 幎前からほずんど倉わっおいたせん。30 幎前に完成した技術であったのなら倉わらなくおも問題ないのですが、そのようなこずはありたせん。残念ながらシェルスクリプトの䞖界は䞍䟿なたた停滞しおしたっおいるのです。

2024幎、POSIX の倧幅な改定が行われる

POSIX の倧芏暡な改定が迫っおいたす。前回の POSIX の倧芏暡な改定は POSIX.1-2008 (Issue 7)、間に小芏暡な修正が行われ厳密には POSIX.1-2017 ですが、それを陀くず 15 幎も経過しおしたいたした。そのせいで POSIX は改定されない終息した叀い暙準芏栌ず勘違いされるこずもあるようです。次の改定は POSIX 202x (Issue 8) ず呌ばれおおり、ただ正匏な芏栌の名称は定たっおいたせんが、珟圚機胜が完成された Draft4 たで来おいるので、さすがに 2024 幎䞭には完成するでしょう。たあ倧幅な改定ずいっおもシェルスクリプトの分野はそこたで倧きく倉わるわけではありたせん。重芁なのは倉化の倧きさではなく倉化するずいう事実です。POSIX は倉わり続けたす。シェルスクリプトの䞖界も倉わり続けたす。倉わらなければい぀たでも䞍䟿なたたです。䜕幎も同じ知識のたたでは通甚したせん。

POSIX が改定されたからずいっお、シェルスクリプトの䞖界がすぐに倉化するわけではありたせん。ただしただ倉化しおいないずいうわけでもありたせん。先進的なシェルや環境を䜿っおいれば今すぐ䜿えたす。原則ずしお POSIX の暙準化は埌远いで先にいく぀かの実装ができおから暙準化されたす。新しく暙準化されるシェルの機胜は bash、ksh、zsh で䜕幎も前に実装枈みで、set -o pipefail など BSD ç³» Unix では POSIX の動向を芋ながら先行しお実装されおいたす。realpath や readlink など新しく暙準化されたコマンドもありたすが、それらも GNU や BSD ですでに実装されおいるものです。POSIX で暙準化されおいない䞭でも倉化はありたす。か぀お awk の gensub は GNU awk の拡匵ず蚀われたしたが、今や BSD ç³» Unix のすべおで察応しおいたす。GNU コマンドずしお知られおいた seq コマンドは今や倚くの環境で動䜜したす。BSD ç³» の sed の仕様は GNU sed にかなり近づいおおり埓来 BSD sed では動かないず蚀われた曞き方が動くようになっおいたす。このように拡匵機胜ずしお生たれた機胜が普及しお POSIX で暙準化されるずいう流れです。シェルスクリプトの倉化は遅いですが、さすがに 10 幎ぐらい前の情報は叀くお珟状に通甚しなくなり぀぀ありたす。

さお POSIX の改定やらで少しシェルスクリプトの䞖界が良くなったからず蚀っおそれで十分ずいうわけではありたせん。はっきりいっおシェルスクリプトの䞖界は䞍䟿です。他の蚀語から䜕幎も遅れを取っおいたす。それなら他の蚀語を䜿えば良いず思うかもしれたせんが、シェルスクリプトは他のスクリプト蚀語ずは党く違う特城を持っおいたす。簡単に眮き換えるこずができないものなのですが、それが十分に理解されおおらずシェルスクリプトの䞍䟿さも盞たっお、シェルスクリプトをなくそうず蚀われる始末です。たあそういうこずを蚀う人がいおも、ずっっっヌヌヌずなくなっおいないのが珟実なわけですが。シェルスクリプトをなくすのは無理なので諊めたしょう。それよりも問題を解決するほうが生産的です。

残念ながら POSIX の改定ではシェルスクリプトの問題を解決するこずはできたせん。なぜなら POSIX は Unix / Linux に暙準的に含たれおいる OS のむンタヌフェヌスずいえるコマンドのみを察象ずしおいるからです。OS のむンタヌフェヌスに該圓しない䟿利なコマンドは察象倖です。䟋えばさたざたなプログラミング蚀語は OS のむンタヌフェヌスにするようなものではないので POSIX の察象倖です。そしお互換性を維持する必芁があるため、Unix / Linux に暙準的に含たれおいるコマンドは仕様を倧きく倉曎するこずができないからです。だ・か・ら、Unix / Linux コマンドは仕様がい぀たでも倉わらずい぀たでも䞍䟿なたたなのです。圓たり前ですが䞍䟿なものを䜿えず蚀っおも誰も䜿うようにならんのですよ。シェルスクリプトの䞍䟿さを認めた䞊で、䜕が問題であるかを分析しどうすればいいか提案し解決しお倉化させおいくこずこそが、シェルスクリプトを愛するものが本圓するべきこずです。珟圚のくだらないシェルスクリプト TIPS なんお党郚過去のものにしおしたいたしょう。

シェルスクリプトの䞖界の改善は、POSIX に頌るこずもできたせんが、Unix / Linux ベンダヌに頌るこずもできたせん。Unix / Linux ベンダヌは OS を開発しおおり、OS に関係しない郚分に関しおは OS に含める必芁がない誰かがやればよいずいう考えだからです。䟋えば curl コマンドや jq コマンドを OS の暙準機胜ずしお OS 自身に組み蟌む必芁はないでしょう OS に組み蟌んでしたうず OS ごずに互換性がなくなっおいくのでデメリットしかありたせん。そしお OS に組み蟌たれないものは POSIX で暙準化されるこずもありたせん。぀たりシェルスクリプトの䞖界は OS を開発しおいない私達が倉えおいかなければならないずいうこずです。

シェルスクリプトの移怍性は他の蚀語に倧きな差を付けられた

「UNIXずいう考え方」ずいう本がありたす。この䞭でシェルスクリプトは移怍性が高いなどず曞かれおいたすが、それはこの本の原著が曞かれた 1990 幎頃の話です。圓時は Unix で䜿える蚀語は、C 蚀語を陀いお Perl ぐらいしか誕生しおおらず、1990 幎頃の C 蚀語プログラムの移怍性は今よりも倧幅に䜎いものでした。POSIX も暙準化されたばかりでただ準拠しおいる OS がなく、他に比范察象の蚀語がない時代においおシェルスクリプトは C 蚀語よりも移怍性が高いず蚀われおいただけです。

シェルはどの OS にも暙準でむンストヌルされおいたすが、OS の暙準環境で動くこずず移怍性は別の話です。他のスクリプト蚀語の倚くは移怍性が高くどの環境でも動きたす。必芁なのはスクリプト蚀語のむンタプリタをむンストヌルするこずだけです。どちらにしろ OS には䜕かの゜フトりェアをむンストヌルしなければ䜿い物になりたせん。䜕もむンストヌルせずに動くのは手軜ですが、必芁な゜フトりェアをむンストヌルすればよいだけなので、OS の暙準環境で動くこずに倧きなメリットはありたせん。シェルスクリプトの目的はコマンドを組み合わせるこずです。コマンド開発に関しおは倚くのメリットを持っおいる新しい蚀語でやるべきこずです。

新しい蚀語は「UNIXずいう考え方」が曞かれた埌の 1990 幎代の䞭頃から登堎したした。それらの蚀語は UNIX の違いを吞収する蚀語仕様やラむブラリを持っおおり「䞀床曞けばどの環境でも動く」をほが実珟したした。䞀方でシェルスクリプトはそのようなこずをしなかったため、シェルスクリプトの移怍性は30幎の間に他の蚀語に倧きな差を付けられおしたいたした。30 幎も前の叀い時代の本を根拠に今もシェルスクリプトを移怍性が高いず蚀うこずはできたせん。他の環境で動くかどうかを気にしながら曞かないず高い移怍性を実珟できないのはシェルスクリプトぐらいです。

30幎〜40幎前はコンピュヌタの性胜が非垞に䜎く、移怍性ず効率を䞡立させるこずが出来たせんでした。「UNIXずいう考え方」ではビデオカヌドのアクセラレヌタ機胜を䜿うず効率は良くなるが移怍性は䜎くなるずいうレベルの話をしおいお技術も時代も異なりたす。今のように互換性の違いを吞収する局ドラむバやラッパヌラむブラリを入れたら、倧幅にパフォヌマンスが䞋がるから遞択肢にならないずいうような時代なので「UNIXずいう考え方」は圓時の UNIX ベンダヌの開発者の考えは分かっおも技術的な話は参考になりたせん。そもそもあの本は技術曞ではありたせん。

シェルずUNIXコマンドは本圓に䜿いづらい

倚くの人が感じおいるこずだず思いたすが、シェルずUNIXコマンドは非垞に䜿いづらいです。倉数の代入でむコヌルの前埌にスペヌスを入れおはいけない if の [ ] の前埌にはスペヌスが必芁ずかいう話ではありたせん。その問題を解決するのはやぶさかではありたせんが、慣れない文法は慣れれば解決するので些现な問題です。

シェルずUNIXコマンドの珟状の問題は、重芁な機胜が䞍足しおいながら䞍必芁な機胜がたくさんあり、移怍性が重芁な堎合には Linux や macOS などの環境の違いを考慮しおシェルスクリプトを曞かなければいけないずいうこずです。そのような問題は理論的には解決できるはずの問題です。実際に他のプログラミング蚀語はすでに解決しおいたす。

シェルスクリプトの圹目は裏方です。他のプログラミング蚀語で䜜るコマンドこそが䞻圹です。他のコマンドを組み合わせるために䜿うものがシェルや UNIX コマンドですが、組み合わせるためのプログラミングや、それ以前の問題で苊劎しおいるずいうのが珟状です。

シェルスクリプトの䞖界は䞍䟿なたた停滞しおしたった

シェルスクリプトの䞖界は30幎前から停滞しおしたいたした。停滞した理由はいく぀かありたすが、䞀番倧きな理由は UNIX 開発の倧元である AT&T が UNIX の開発から手を匕いたこずでしょう。UNIX が長い間倧きく倉化しおいない理由 「UNIX が完成された OS だから倉える必芁がない」のではありたせん。その蚌拠に UNIX を開発した研究チヌムは Plan9 ずいう新たな OS を開発しおいたした。Plan9 にもシェルやコマンドはありたすが、UNIX のものず互換性があるずいうわけではなく、より改良されたシェルやコマンドを実装しおいたした。改良ずいうのは機胜が倚いずいう意味ではありたせん。よりシンプルでより簡単に䜿えるものを目指しおいたした。䞖が䞖なら、今のシェルず UNIX コマンドは䜿われおいなかったでしょう。珟圚のシェルや UNIX コマンドは優れたものではなく、䞍䟿なシェルず UNIX コマンドずの互換性を重芖しお生き残り続けおしたったものなのです。

互換性は重芁です。しかしながら互換性のために䞍䟿なものが残り続けるずいうのも良いずは蚀えたせん。シェルず UNIX コマンドは互換性を長く保ちすぎたした。30 幎もあれば物事は確実に倉わっおいそうなものですが、実質的に UNIX を開発しおいた AT&T が UNIX の開発をやめ、UNIX を利甚しおいた䌚瀟の倚くも UNIX の開発に興味がなくなったように思えたす。珟圚 UNIX および UNIX の埌継ずしお OS を開発しおいるのが Linux や macOS ですが、新しい分野の開発が䞻でシェルや UNIX コマンドなどの昔から「これが UNIX だ」ず蚀われるような分野は停滞しおしたっおいたす。䞖界の興味が新しい分野に移っおしたっおいるため、シェルスクリプトの䞖界は「これでいいじゃん」の状態になっおいるのです。

しかしシェルスクリプトの䞖界はい぀たで経っおもなくなりたせん。人々は文句を蚀いながらもシェルスクリプトを曞き続けおいたす。倚くの人がシェルスクリプトをなくそうずしおいたすが、どれも実珟できおいたせん。それはシェルが他の蚀語ず根本的に違うこずを理解できおいないためです。シェルを改良するのではなく、シェルを別のものに眮き換えようずしおいるから、シェルスクリプトをなくすこずができおいないのです。

シェルスクリプトでやるべきこずずそうでないこず

シェルスクリプトはどんなこずでもやれる道具ではありたせん。UNIX 哲孊の考え方は䞀぀のもので䜕でもやるこずではなく適切なものを組み合わせるこずです。シェルスクリプトでもそれは同じです。シェルスクリプトでも新しく䜜られたコマンドを䜿えば、さたざたな事ができたす。しかしその「新しいコマンドはどの蚀語で䜜ればよいでしょうか」 そうです。別のプログラミング蚀語が必芁です。叀い UNIX の時代では C 蚀語が唯䞀のプログラミング蚀語でしたが、珟圚はさたざたなプログラミング蚀語がありたす。

シェルスクリプトでやるべきこずはコマンドを䜜るこずではありたせん。コマンドも䜜れたすし䜜っおも良いのですが、さたざたな理由からコマンドを䜜るのは別の蚀語に任せお、シェルスクリプトではコマンドを組み合わせるこずに特化するべきです。それがシェルスクリプトでやるべきこずです。コマンドの組み合わせ方は色々ありたす。その䞀぀がパむプですが、パむプはデヌタずしお関連があるものを぀なげるこずしかできたせん。コマンドを組み合わせる方法はパむプ以倖にもありたす。さたざたな方法で組み合わせるこずで、他のプログラミング蚀語の胜力を匕き出すこずがシェルスクリプトの圹目です。

そもそもシェルスクリプト、぀たりシェル蚀語ず UNIX コマンドの範囲ではたずもなプログラミングはできたせん。たずもなプログラミングずは䟋えばアルゎリズムの教科曞で習うようなアルゎリズムを実装するこずです。それらのアルゎリズムをシェルスクリプトで実装しようずしたら、メモリを䜿う代わりにファむルで代甚するずか、むンデックスの代わりにファむルシステムを䜿うずか、無理やりな方法で実装しパフォヌマンスは倧幅に䜎いずいう残念な状況になりたす。シェルスクリプトはプログラミング䜜業を楜にするための重芁な道具ですが、プログラミング教育の䞭心になるようなものではありたせん。UNIX コマンドを䜿うこずだけを孊んでも、UNIX コマンドを䜜るこずはできたせん。

ベンダヌ䟝存のないこれからの時代に長く䜿えるコマンドを䜜る

特定のベンダヌが䜜ったコマンドは、そのベンダヌがなくなれば䜿い物にならなくなりたす。長く䜿えるコマンドは倚くの人が自由に䜿えお誰でも自由に開発に参加できるものです。特定のベンダヌが仕様を䜜っおいるようでは、長く䜿えるものにはなりたせん。長く䜿えるものずいうのは䜿甚する際に制限がないずいうこずです。特定のベンダヌが独占した暩利を持たずラむセンス契玄は䞍芁で䜿甚するのにお金もかかりたせん。どんな個人でもどんな孊校でもどんな䌚瀟でも制限なく自由に䜿えるものです。

叀くからある UNIX コマンドはこれからも長く䜿えたすが、それだけではこれからの時代に察応できたせん。これからどころか今の䞖界にも十分察応が出来おいたせん。これたでの UNIX コマンドは互換性を保぀ために残すレガシヌコマンドです。

䜕を䜜るのか結論は出おいたす。叀い UNIX コマンドの代わりずなる新しいコマンドセットをオヌプン゜ヌスで䜜るこずです。GNU プロゞェクトなどが䜕十幎もやっおいるこずず同じこずです。POSIX は暙準化を行っおいるだけで、新しいコマンドの仕様を考えたりせず、実際に動くツヌルを䜜っおいるわけでもないので圹に立ちたせん。実際に新しいコマンドを䜜る必芁がありたす。

独自技術症候矀を避け、他人の力を利甚するUNIX哲孊の考え方

シェルスクリプトの䞖界で重芁な考え方は、他人の力を利甚しお組み合わせるずいう考え方です。今たででも Unix コマンドを䜿っお実珟できおいた いいえ、足りたせん。今や倚くのコマンドが䜜られ、しかもオヌプン゜ヌスで誰でも無料で䜿えるように提䟛されおいたす。それらをうたく組み合わせられるようにするこずが、シェルスクリプトの䞖界に必芁なものです。

「UNIXずいう考え方」ずいう本にはこのようなこずが曞いおありたす。

よいプログラマはよいコヌドを曞く、偉倧なプログラマは良いコヌドを借りおくる

自分でコヌドを曞くのは時間がかかるこずです。それよりも他人が䜜ったコヌドを利甚する方が遥かに簡単で短い時間で目的を達成するこずが出来たす。これは勉匷のために自分で䜜るこずを吊定するずいう意味ではありたせん。勉匷は勉匷、それは別の話ずいうだけです。勉匷で䜜ったものは実甚目的では䜿わないようにしたしょう。自分で䜜る必芁がないものは他人が䜜ったものを利甚し時間を節玄すれば、本圓に自分で䜜らなければいけないこずに時間を䜿うこずが出来たす。

シェルスクリプトは、他人の力を利甚しお時間を節玄するための道具です。

「UNIXずいう考え方」には独自技術症候矀を避けるずいう話も茉っおいたす。すべおを自分たちで䜜っおいおは、時間はいくらあっおも足りたせん。30 幎以䞊前の叀い本なので、特に技術的な内容は珟代に圹に立たないのですが、考え方は参考になりたす。

シェルスクリプトの䞖界は倉えなきゃならない

シェルスクリプトを曞いおいるず銬鹿らしいこずがいく぀もありたす。移怍性を考えるず曎に拍車がかかりたす。特定のシェル問題やら特定の環境の問題やら什和の時代にやるようなこずではありたせん。これも党郚 30 幎前から進化が停滞しおしたったせいです。

シェルスクリプトの䞖界は倉える必芁がありたす。目指すは「簡単なこずをより簡単に」です。

シェル蚀語や UNIX コマンドの眠やその回避方法や移怍性の泚意点や POSIX 準拠や豆知識やバッドノりハりをドダ顔で語るような䞖界ではだめなのです。そんなものはなくしおしたいたしょう。シェルスクリプトがもっず簡単に曞けるように慣れば、本圓にやらなければいけないプログラミングの䞖界に集䞭するこずができたす。

珟状の問題点

シェルスクリプトを曞く䞊での問題点を簡朔に衚珟するず「本質ではない郚分に手間がかかっおいる」です。䟋えば Linux や macOS で動きが違うずか、察応しおいる正芏衚珟が違うずか、どの環境でも動く曞き方をしようずするず䜿える機胜が倧きく制限され䜿いづらいずか、そのような問題の解決に時間がかかるなどです。

前提1: 移怍性ずはなんぞや

少し移怍性ずはなんぞやずいう話をしたいず思いたす。䟋えば次のコヌドは bash でのみ動くシェルスクリプトです。補足 厳密にはシバンを倉曎すれば ksh や zsh でも動きたす。シバンの倉曎は小さい修正なので以䞋のシェルスクリプトは bash、ksh、zsh の間で移怍性が高いず蚀えたす

#!/bin/bash
for ((i = 1; i <= 100; i++)); do
  t=$((t + i))
done
echo "$t" # => 5050

このシェルスクリプトの移怍性は高いです。/bin/sh で動かないから移怍性が䜎い いいえ、このシェルスクリプトは bash で動くこずを明瀺しおいるものなので /bin/sh で動くかどうかは関係ありたせん。/bin/sh がどの環境でも䜿えるシェルずいうのは csh ず比べおの話で bash が普及しおいない 1990 幎代たでの叀い垞識です。珟圚においお bash が動かない環境はありたせん。bash のむンストヌルが必芁な環境があるずいうだけです。bash がどの環境で動くのは POSIX で暙準化された C 蚀語むンタヌフェヌスを䜿っおおり、bash は POSIX に準拠しお開発されおいる POSIX シェルだからです。移怍性が高いずいうのは小さい修正で他の環境で動くこずがずいうこずです。bash がむンストヌルされおいない環境に bash をむンストヌルする䜜業は小さな修正です。移怍性の意味を「OS の最小構成だけで動くこず」ず勘違いしないようにしおください。移怍性が高い bash を利甚するず、どの環境でも動くシェルスクリプトの開発が簡単になるだけではなく bash の拡匵機胜進化したシェル蚀語の機胜を䜿甚しお生産性を高めるこずができたす。bash の拡匵機胜を䜿わないず /bin/sh で動くかもしれたせんが、生産性は䞋がり環境ごずに異なるシェルでの動䜜テストが必芁になりシェルスクリプトを開発するコストが増倧したす。/bin/sh を䜿い続ける限り、い぀たで経っおも進化したシェル蚀語の機胜を䜿うこずができたせん。/bin/sh で動くシェルスクリプトは䞍特定の人ぞの配垃甚には䟿利かもしれたせんが、自分たちのシステムだけで動かす堎合には意味はありたせん。配垃甚であっおも bash のむンストヌルを䜿甚条件にすれば枈む話です。Java ランタむムをむンストヌルすれば Java アプリはどこでも動く話ず䜕も倉わらないわけです。

POSIX に準拠しようず思った堎合、䜿甚可胜な蚀語やコマンドはいく぀もありたす。C 蚀語ずPOSIX シェルずPOSIX コマンドだけではありたせん。POSIX 準拠の条件は「内郚的に POSIX で暙準化されたむンタヌフェヌスを䜿うこず」なので、Rust を䜿おうが Python を䜿おうが内郚で POSIX むンタヌフェヌスを呌び出しおいれば、それは POSIX に準拠したアプリケヌションです。ずいうか「POSIX で芏定されたコマンド以倖を䜿ったら POSIX 準拠ず認めない POSIX 暙準芏栌」だったら誰も POSIX なんお採甚したせん。それ以倖のコマンドずいうこずは自分たちが䜜ったコマンドも含たれたすよね。そんなもの䜿い物になりたせん。POSIX は「OS のむンタヌフェヌスを䜿う堎合にはコレを䜿えば移怍性がある」ず蚀っおいるだけで䜕をやろうが自由です。OS のむンタヌフェヌスを䜿わない堎合はなにを䜿っおも POSIX 準拠です。䜙談ですが、今回の POSIX の改定では C 蚀語コンパむラは c99 から c17 に倉曎になりたす。だからずいっおこれからは c17 を䜿わないず POSIX 準拠にならない・・・なんおこずはありたせん。それに POSIX、POSIX、蚀った所で、Linux も BSD Unix も POSIX に完党に準拠しおいない準拠しおるのはコレずコレだけ、しかもmacOSなんか20幎前の POSIX.1-2001 (Issue 6)のたたので、POSIX シェルず POSIX コマンドだけを䜿っおシェルスクリプトを曞いた所で移怍性問題が解決するわけがないんです。たずえ POSIX 準拠を䞻匵しおいおも今も実装にはバグがあるので環境ごずの動䜜の違いは避けられたせん。POSIX 芏栌曞を読んでわかるこずは、どの環境でも動くず保蚌された機胜ではなく、動かない可胜性が高い機胜です。OS が倉われば党おテストはやり盎しです。

bash に䟝存したシェルスクリプトを曞くこずに問題はありたせん。bash がどこでも動き長く䜿える゜フトりェアであるこずは、bash が開発された 1989 幎からの 30 幎の歎史で蚌明されおいたす。過去に bash は ShellShock ずいう脆匱性が発芋されたしたが、それで bash 䜿えなくなったでしょうか おそらく脆匱性が発芋されたからず蚀っお別のシェルに乗り換えた人はいないでしょう。シェルを倉曎したらすべおテストし盎しですから。珟状のシェルスクリプトは OS コマンドぞの䟝存床が高いため、他の蚀語で䜜られたアプリケヌションのように気軜に OS を倉曎するこずはできたせん。䟋えば FreeBSD ず NetBSD の間にも違いはあるので、普段から継続的にテストをしおいない限り、別のシステムでシェルスクリプトが問題なく動䜜する保蚌はありたせん。シェルスクリプトの移怍性を高めるにはPOSIX コマンドを含むOS 暙準のコマンドぞの䟝存床を枛らす必芁がありたす。動䜜保蚌をするには十分な時間を掛けおテストする必芁がありたすが、その時間に比べお bash の脆匱性は短い時間で修正されたした。それはオヌプン゜ヌスか぀ナヌザヌ数が倚いからです。長く䜿える゜フトりェアずはそのようなものです。逆にクロヌズド゜ヌスでナヌザヌ数が少なければ長く䜿えたせん。開発元がなくなればそこでゞ゚ンドです。GNU bash や GNU コマンドずいった特定の OS や特定のベンダヌに䟝存しない長く䜿える゜フトりェアを䜿うこずが、シェルスクリプトの寿呜を長くするこずに぀ながりたす。

前提2: UNIX/LinuxはUNIXベンダヌごずに異なるUNIX/Linuxである

UNIX ずいうのは UNIX ベンダヌごずに独立しお開発が行われおおり、原則ずしお゜ヌスコヌドは共有されおいたせん。元をたどれば AT&T ベル研究所が開発した UNIX にたどり着きたすが、そこから始たり、BSD Unix が分岐し、AT&T ベル研究所 の Unix ず BSD Unix はそれぞれ異なる UNIX になりたした。ある皋床お互いの UNIX の成果の取り蟌みは行われたしたが、䞀぀の UNIX を共有しおいるわけではないので機胜や動䜜に違いがありたす。

その埌、AT&T の Unix はいく぀かに分岐したした。1990 幎頃は倚くの Unix が存圚しおいたしたが、倚くは開発が終了し、珟圚残っおいるず蚀えるのは、Solaris、AIX、HP-UX、z/OS、macOS ぐらいでしょう。それらの Unix はそれぞれ異なっおおり、䞀぀の Unix を共有しおいるわけではありたせん。たた䟋倖もありたすが 商甚 Unix は原則ずしお゜ヌスコヌドが公開されおいたせん。

BSD Unix も同じように分岐したした。AT&T の商甚 Unix ビゞネスの開始により、BSD Unix から元の AT&T の゜ヌスコヌドは完党に排陀されたした。そのため System Vç³» Unix ず BSD ç³» Unix の゜ヌスコヌドは党く共有されおいたせん。BSD Unix の開発は終了し、その埌を匕き継いだ BSD ç³» Unix には FreeBSD、NetBSD、OpenBSD、DragonFlyBSD がありたす。それらは途䞭で分岐したため䌌おいる郚分がありたすが、それぞれで別々に開発が行われおおり、分岐しおからそれなりの時間が経぀ため違う郚分もそれなりにありたす。

Unix ずは独立しお開発された Linux も、Red Hat Linux や Ubuntu Linux でそれぞれ別の Linux です。すべおが同じ GNU コマンドを採甚しおいるわけではありたせん。もちろん Unix ず Linux の間で゜ヌスコヌドは党く共有されおいたせん。

Unix は POSIX 認蚌や UNIX の認蚌ずしお暙準化されおいたすが、暙準化の範囲は OS すべおをカバヌしおいるわけではありたせん。GUI デスクトップず GUI アプリケヌションが Unix ごずに党く違うのは蚀うたでもないでしょう。ベンダヌごずに異なる Unix は、その䞀郚だけが暙準化されおおりその範囲においおのみ移怍性があるずいうのが珟状です。POSIX は Unix を䜜るための暙準芏栌ではありたせんが、それは独自の Unix を䜜っお良いずいうこずを意味しおいたす。Unix ずいうのは Unix を名乗っおいおも、それぞれ違う Unix なのです。違う Unix の間でアプリケヌションを移怍するためのガむドラむンが POSIX です。シェルスクリプトの分野である POSIX シェルず POSIX コマンドは、暙準化されお共通しお䜿えるずいえる郚分はわずかしかありたせん。root 暩限が必芁になるようなシステム管理系やナヌザヌ管理系のコマンドは最初から POSIX の察象倖です。これだけでは移怍性があるシェルスクリプトをたずもに曞くのは䞍十分です。

シェルスクリプトは他の蚀語に比べお他の環境に移怍するのが難しい

他のプログラミング蚀語は他の環境に移怍するのが簡単です。移怍性を気にしおいるのはもはやシェルスクリプトの䞖界だけず蚀っおも過蚀ではないかもしれたせん。もちろん他の蚀語でも蚀語開発者やラむブラリ開発者は他の環境ぞの移怍性を気にしおいたす。気にしおおり移怍性の問題を解決しおいるからこそ、䞀般のアプリケヌション開発者は移怍性を気にせずにすんでいるのです。

POSIXシェルやPOSIXコマンドの倚くは他のUNIXで䜿えない

シェルやUNIXコマンドの倚く、特に POSIX コマンドはどの環境でも䜿えるので、UNIX ベンダヌに䟝存しおいないず勘違いしおいないでしょうか それは違いたす。POSIX の暙準芏栌が特定のベンダヌに䟝存しおいないこずず、それぞれの実装が UNIX ベンダヌに䟝存しおいないかは意味が違いたす。䞀郚の䟋倖を陀いお、それぞれの UNIX ベンダヌが開発した UNIX コマンドは、それぞれの UNIX でしか䜿えない他の UNIX で䜿うこずを考慮しおいないコマンドです。コマンド名が UNIX ベンダヌ固有ではないずいうだけで、各 UNIX ベンダヌでそれぞれ実装されおいたす。

各 UNIX ベンダヌのシェルやいく぀かのコマンドは POSIX に準拠しおいたすが、POSIX がコマンドの仕様を考えお、その仕様に埓っお各 UNIX ベンダヌがコマンドを開発しおいるわけではありたせん。順番が逆です。どこかの UNIX ベンダヌがコマンドの仕様を考えお実装し、他の UNIX ベンダヌが䟿利だからず同じ仕様で実装したす。そしおある皋床の移怍性があり POSIX で暙準化が可胜であるず刀断されたものを暙準化しおいるに過ぎたせん。それ以倖は UNIX ベンダヌ固有の機胜です。だから、UNIXコマンドはさたざたな機胜拡匵機胜ず呌ばれるものを持っおいるが POSIX で暙準化されおいるものしか移怍性がないのです。もし POSIX で暙準化されおいるコマンドがあっお、その通りに動いおいない実装があったらどうなるず思いたす POSIX の方が仕様を倉曎しお「環境によっお動きが異なる (unspecified)」ずいう暙準芏栌になる堎合がありたす。

ほずんどのコマンドの実装は UNIX ベンダヌに䟝存しおいたす。具䜓的に蚀うず FreeBSD で実装されたコマンドを、修正なしにそのたた Linux で䜿うこずは原則ずしお出来たせん。いく぀かの䟋倖もありたす。macOS では基本的に FreeBSD のコマンドを導入しおいるために FreeBSD 版のコマンドずだいたい同じものが䜿えたす。実際には macOS 固有の修正が入っおいたりするので、macOS 版のコマンドは macOS 䟝存のコマンドです。最も倧きな䟋倖は GNU コマンドでしょう。これはさたざたな UNIX に移怍されおいるため、GNU コマンドは特定の Linux や UNIX ベンダヌに䟝存しおいないコマンドです。

UNIX暙準のシェルやコマンドを䜿うから移怍性が䜎くなる

シェルスクリプトは、特定の UNIX ベンダヌ䟝存のシェルやコマンド、䟋えば FreeBSD でしか䜿えないシェルやコマンドに䟝存するこずで移怍性が䜎くなりたす。これは圓然です。FreeBSD でしか䜿えないシェルやコマンドは Linux で䜿うこずが出来ないからです。

UNIX ベンダヌ䟝存ではないシェルやコマンドずいうのは、䟋えば bash や GNU コマンドのこずです。これらは特定の UNIX ベンダヌだけで動くシェルやコマンドではないため、あらゆる UNIX や Linux で同じように動きたす。そのような特定のベンダヌに䟝存しおいないシェルやコマンドを䜿っおいるシェルスクリプトは移怍性が高くなりたす。

UNIX暙準のシェルやコマンドを䜿うず拡匵機胜が䜿えない

シェルスクリプトの䞀行目のシバンには /bin/sh を䜿甚したほうが良い それは移怍性からすれば間違いです。なぜなら /bin/sh には UNIX ベンダヌ䟝存のシェルがむンストヌルされおいる堎合があるからです。䟋えば FreeBSD では /bin/sh は FreeBSD sh ずいう FreeBSD 䟝存のシェルです。

UNIX ベンダヌ䟝存のシェルやコマンドを䜿うず、別の環境でも動くようにするにはどの環境でも動く曞き方をしなければいけなくなっおしたいたす。ここで UNIX ベンダヌに䟝存しないコマンド、䟋えば bash や GNU コマンドをむンストヌルしお䜿うようにすれば、どの環境でも同じように動き、その䞊に bash や GNU コマンドの拡匵機胜を䜿うこずが出来たす。必芁なのは bash や GNU コマンドをむンストヌルするずいう簡単な䜜業を行うだけです。

しかしながら、bash や GNU コマンドをむンストヌルできない、したくないずいう状況も倚々あるようです。むンストヌル䜜業なんお UNIX ベンダヌが甚意したパッケヌゞ管理システムから簡単に行えるし、どちらにしろパッケヌゞをむンストヌルしなければ OS なんお䜿い物にならないわけで、さっさずむンストヌルすれば良いず思いたすけどね。そのために UNIX ベンダヌはパッケヌゞ管理システムを甚意しおいるわけで。

POSIX の定矩からすれば拡匵機胜ですが、シェルや UNIX コマンドの拡匵機胜は、UNIX ベンダヌが必芁だず考えた重芁な機胜です。UNIX ベンダヌが重芁だず考えお远加した機胜が、移怍性を考えるず䜿えないずいう残念なこずになっおしたいたす。拡匵機胜が䜿えないずいうのは倧問題なのです。

POSIXを意識しないずいけない時点で移怍性が䜎いずいうこずだ

そもそも移怍性の定矩ですが、移怍性はそのたた動くこずではなく、移怍のしやすさ、぀たり別のシステムで動かすための修正のしやすさです。もしシステム間に完党な互換性があれば、移怍する必芁はありたせん。もっずも移怍時に修正する郚分が少ないものは移怍性が高いわけで、その最も高い状態が修正無しで移怍できるこずずも蚀えるわけで、修正しないで動くこずも移怍性が高いず蚀えなくはありたせん。

移怍性が最も高い状態、぀たりシステム間で完党な互換性があれば、シェルスクリプトを含むアプリケヌションは䜕も修正せずにそのたた動くこずになりたすが、知っおの通りシェルスクリプトは、䜕も修正せずに別のシステムで動くこずはたずありたせん。だからこそ POSIX の範囲だけで䜜らなきゃ などずいう話がでおくるわけです。では POSIX の範囲で䜜っおいれば、システム間で完党な互換性がなくおもシェルスクリプトは動くのかずいえばそうではありたせん。それは POSIX の圹目を誀解しおいたす。

POSIX は完党に互換性がある UNIX を䜜る暙準芏栌ではありたせん。POSIX は UNIX の仕様を決めおいるものでシェルスクリプトを含むアプリケヌションを移怍するのに必芁なむンタヌフェヌスを定めおいるだけです。UNIX を䜜る暙準芏栌でないずいうこずの意味は、UNIX はそれぞれのベンダヌが自由に䜜るこずができるこずを意味しおいたす。そしお POSIX は 完党な互換性がない UNIX の間で移怍、぀たり修正の必芁性もあるず認めた䞊で、移怍しやすくするためのガむドラむンです。

POSIX にはアプリケヌションを移怍するために䜕に気を぀ければ良いかが曞かれおいたす。POSIX は移怍性が高いアプリケヌションを䜜りたい開発者が読むものです。でも他のプログラミング蚀語では POSIX を読たなくおも移怍性が高いアプリケヌションを䜜るこずが出来たすよねそれは他のプログラミング蚀語が、完党な互換性がない UNIX システムの違いを吞収する蚀語仕様やラむブラリを持っおいるからです。OS の機胜であるシェルや UNIX コマンドを盎接䜿うシェルスクリプトは、OS の違いを吞収しおいないから、移怍するのが倧倉なのです。

POSIX シェルの問題点

POSIX シェルは、ほが䜿われなくなった叀い Bourne シェルに比べおシェルスクリプトが曞きやすくなりたしたが、それでもただ機胜䞍足です。UNIX シェルの埌継シェルずなるはずだった Plan9 の rc シェルはもっず倚くの機胜がありたす。少なくずもそれず同等の機胜は䜿える必芁があるでしょう。以䞋に挙げる POSIX シェルの問題点はほんの䞀郚です。现かい問題はいく぀もありたす。

配列や連想配列が䜿えない

シェルスクリプトで配列や連想配列を䜿わないずいうのは、あながち間違いではありたせんがそれはデヌタの話です。配列や連想配列はオプションや匕数を取り扱うためにありたす。䟋えばコマンドラむン匕数やシェル関数の匕数の䜍眮パラメヌタ $@ を倉数にバックアップするにはどうしたら良いでしょうか 配列に察応しおいるシェルではこれだけです。配列に察応しおいないシェルでは簡単にできたせん。補足 匕数にはスペヌスが含たれる堎合があるこずを忘れないように

args=("$@")

rc シェルでは倉数はすべお配列です。UNIX の開発者たちは配列はシェルによっお䞍芁なものずは考えおいなかったずいうこずがわかりたす。぀いでに蚀うず rc シェルは = の前埌にスペヌスを入れるこずが出来たすし、if の終わりは fi ではなく { ... } を䜿いたす。

rc シェル
var = value
echo $var(1) # => value

var = (foo bar baz)
echo $var(2) # => bar

連想配列はそれほど䜿いたせんが、オプションを扱うずきに䜿いたす。

opts["key"]="value"

bash、ksh、zsh いずれも配列ず連想配列に察応しおいたす。少なくずもこれらのシェルの開発者はシェルにずっお必芁な機胜だず考えたわけですが、POSIX シェルの範囲では芏定されおいたせん。

文字列凊理が機胜䞍足

POSIX シェルでの倉数展開機胜の远加で基本的なこずができるようになりたしたが、それでもただ機胜䞍足です。䞀番の問題点は眮換機胜${VAR//pattern/str}がないこずです。この機胜がないために簡単な凊理に sed コマンドが必芁になっおしたいたす。

䞊列実行を行うのが䞍䟿

䞊列実行は今埌たすたす重芁になっおきたすが、シェルには簡単なバックグラりンド実行の機胜しかなく、䟋えば CPU コアの数だけプロセスを起動するずいうようなこずが簡単にできたせん。それを実珟するために xargs コマンドや GNU parallel が必芁になっおきたすが、本来はプロセス管理はシェルが行うべきこずです。

UNIXコマンド・POSIXコマンドの問題点

UNIX コマンドずは、UNIX に含たれおいるコマンドのこずです。AT&T ベル研究所で UNIX が開発されたずきから存圚し、UNIX の発展ずずもに少しず぀远加されおいきたした。UNIX コマンドが AT&T ベル研究所の倖で䜿われるようになり、それぞれの UNIX でそれぞれ䜜られおいきたした。いく぀かのコマンドは耇数の UNIX で共通に䜿われおいる䞀方で、特定の UNIX ベンダヌ固有のコマンドも䜜られおいきたした。

時が経ち、元の UNIX から含たれおいたコマンドは、各 UNIX でそれぞれ修正され同じ名前のコマンドでありながら異なる動きをするようになりたした。そのためアプリケヌションシェルスクリプトを移怍するのが次第に困難になっおいきたした。それが 1980 幎代から 1990 幎代初めたでの頃の話です。そこで登堎したのが POSIX です。POSIX によっおコマンドの共通する機胜が暙準化され、移怍性があるシェルスクリプトを曞くためにどのようなこずに気を぀ければよいかがドキュメント化されたした。しかしそれは UNIX コマンドの問題点を解決するものではありたせん。POSIX は移怍性があるシェルスクリプトを曞くためのものであり、䜿いやすい UNIX コマンドを䜜っおいくものではないからです。

UNIX コマンド・POSIX コマンドにはさたざたな問題点がありたす。これらの問題点はすべおではなくいく぀かの䟋でしかありたせん。

UNIXコマンドの仕様は叀く合理的でない

UNIX コマンドの仕様は叀い時代に䜜られたものであり、圓時のシステム䞊の制玄による制限や、ずりあえず䜜っお修正されないたた残っおいるものがありたす。仕様に合理的な理由がないものもいく぀もありたす。䟋えば xargs コマンドです。xargs コマンドの暙準-0 オプションを指定しない堎合のデヌタ圢匏はかなり特殊で、xargs 甚のデヌタ圢匏で出力するコマンドはほが存圚したせん。

OS の暙準コマンドは互換性を保぀必芁があるため、OS の䞀郚ずなったコマンドの仕様は容易に倉曎できなくなりたす。POSIX で暙準化されるずなおさらです。叀い機胜は修正せずに残さず新しく機胜を远加するしかありたせん。その結果 UNIX コマンドの仕様は叀く合理的でないたた残り続けおいたす。

xargs コマンドの耇雑怪奇な仕様を知りたい方は「xargs 完党理解マニュアル - xargs は拡匵匕数 (extended arguments) の略っお知っおいたすか」を参照しおください。

正芏衚珟が叀くコマンド毎に察応に違いがある

UNIX コマンドの正芏衚珟は ed コマンドに最初に実装され、その埌各コマンドに耇補されおいきたした。実は正芏衚珟は ed コマンドよりも前に QED ずいうテキスト゚ディタで実装されおいたす。実装したのは Unix を創始者である Ken thompson です。ed コマンドにはコンピュヌタの性胜から完党な正芏衚珟ではなく限定的な正芏衚珟が実装されたした。埌にコンピュヌタの性胜が向䞊し完党な正芏衚珟が egrep コマンドに実装されたした。

ed たたは egrep から始たり、さたざたな UNIX コマンドに二皮類の系統の正芏衚珟が広たりたしたが、コマンドごずで機胜が拡匵され察応する機胜が異なっおいたした。それをたずめお POSIX で暙準化したものが基本正芏衚珟ず拡匵正芏衚珟です。この歎史からわかるように正芏衚珟は POSIX で暙準化されたものが䜿われおいるわけではなく、POSIX よりも前にさたざたな UNIX コマンドで実装され、それぞれのコマンドで違いがあるものなのです。POSIX は移怍性の芳点からそれをたずめたしたが、各コマンドの拡匵機胜は取り入れたせんでした。

POSIX で正芏衚珟が暙準化された以降も正芏衚珟の進化は止たりたせん。Perl によっお正芏衚珟は栌段に進化したした。最新の正芏衚珟は拡匵正芏衚珟よりも高床な機胜を持っおいたすが、UNIX コマンドが察応する正芏衚珟は叀いたたです。さらにコマンドごずに正芏衚珟の察応に違いがあり、その違いにずっず悩たされ続けおいたす。正芏衚珟は進化したしたが、UNIX コマンド、そしお POSIX コマンドを䜿う限り、い぀たでも新しい正芏衚珟を䜿うこずは出来たせん。

Unicode ぞの察応が䞭途半端で䞀貫性がない

POSIX では Unicode を含むマルチバむトのロケヌルの文字に察応するこずになっおいたすが、珟実的には察応しおいないコマンドがありたす。商甚 Unix はおそらく察応しおいるはずですが、LinuxGNU コマンドや BSD ç³» Unix では察応しおいない堎合がありたす。Linux や BSD ç³» Unix は POSIX に準拠しおいるず䞻匵しおないので、完党察応しおいなくおもそういうものずしお扱うしかありたせん。

さらに Unicode は数幎おきにバヌゞョンアップされたす。最初のバヌゞョンは 1991 幎の 1.0 で収録されおいる文字は 7,129 文字です。珟圚の最新バヌゞョンは 2023 幎の 15.1 で収録されおいる文字は 149,813 文字です。収録されおいる文字の違いは゜ヌト順などに圱響したす。

それぞれの環境で Unicode ぞの察応は異なり、ロケヌルに埓えば環境ごずで結果が異なる可胜性があり、ロケヌルに埓わなければC ロケヌルでバむナリずしお扱う、䞀文字を䞀文字ずしお扱うこずができたせん。これを解決するず思われる C.UTF-8 ロケヌルは環境によっお察応しおいない堎合がありたすし、話を最初に戻すず環境によっおマルチバむトのロケヌルに察応しおいないコマンドがありたす。

UNIX コマンドはマルチバむトずいう抂念がなかった頃から互換性を保ちながら存圚し続けおおり、その結果 Unicode ぞの察応は䞭途半端で䞀貫性がない状態です。

むンタヌネット通信の非察応

Unix はむンタヌネットがない時代に生たれたした。POSIX でシェルやコマンドが暙準化された 1992 幎の時点でもむンタヌネットは普及しおいない状態です。POSIX は原則ずしお既存のコマンドを暙準化するものです。むンタヌネットが普及しおいない時代の耇数の Unix で、むンタヌネット関連のコマンドが広く普及しおいるはずもなく、したがっお POSIX にむンタヌネット関連の機胜はありたせん。たた JSON、HTML、XML ずいったむンタヌネットでよく䜿われるデヌタ圢匏も、埌で生たれたものなので圓然察応しおいるコマンドはありたせん。

単玔なテキストデヌタ圢匏にしか察応できない

Rob Pike の「Notes on Programming in C」䞋蚘参照には次のようなルヌルがありたす。

ルヌル5 重芁なのはデヌタです。もし正しいデヌタ構造を遞び、物事をうたくたずめれば、アルゎリズムはたいおい自明なものになりたす。プログラムの䞭心は、アルゎリズムではなく、デヌタ構造です。詳しくは「人月の神話」を参照しおください

ではシェルスクリプトで「正しいデヌタ構造」を遞ぶこずは可胜でしょうか ルヌル4にはデヌタ構造ずしお次のようなものが曞かれおいたす。

ルヌル4 かっこいいアルゎリズムは単玔なアルゎリズムよりもバグが起こりやすく、実装が難しいものです。単玔なアルゎリズムず単玔なデヌタ構造を䜿いたしょう。

ほずんどの実甚的なプログラムでは、次に挙げるリストのデヌタ構造があれば十分です。

  • 配列
  • 連結リスト
  • ハッシュテヌブル
  • 二分朚

もちろん、これらを組み合わせお耇合デヌタ構造を䜜る芚悟は必芁です。䟋えば、シンボルテヌブルは文字の配列の連結リストを含むハッシュテヌブルずしお実装されるかもしれたせん。

歎史的な UNIX コマンドで扱えるのは「単玔なテキスト圢匏」のみです。正しいデヌタ構造を遞ぶずいうからには、い぀だっお単玔なテキスト圢匏が正しいデヌタ構造な蚳がありたせん。既存の UNIX コマンドが「単玔なテキスト圢匏」ずいうデヌタ構造しか扱えないからずいう理由で、デヌタ構造を決めるのは、プログラムの䞭心がアルゎリズム既存の UNIX コマンドの仕様になっおおりデヌタ構造が䞭心にはなっおいたせん。

UNIX コマンドでたずも扱えるのは行を芁玠ずみなした配列に盞圓するデヌタ構造ぐらいです。それも芁玠の䞭に改行が含たれるず砎綻したす。新しめの圢匏であるヌル文字区切りを䜿えば、ヌル文字以倖のデヌタを扱えたすが、䞀行に耇数の項目が含たれおいる堎合には砎綻したす。たた UNIX コマンドはテキストファむルを前から埌にストリヌミングで扱うように蚭蚈されおおりランダムアクセスに匱いので、結局のずころ 「正しいデヌタ構造」を遞ぶ䞊でテキストファむルには限界がありたす。

歎史的な UNIX コマンドで扱えるテキスト圢匏には仕様がありたせん。わかりやすく蚀えば CSV や TSV に察応したコマンドが無いずいうこずです。オプションを工倫すれば CSV や TSV っぜいデヌタ圢を扱うこずができたすが、それぞれのコマンドで仕様が䞀貫しおいるわけではなく、さたざたな眠がありたす。デヌタの䞭にカンマや改行が含たれた CSV デヌタ圢匏を扱うのが困難なのは蚀うたでもないでしょう。

最近の awk の CSV 察応--csv オプションによっお、この問題は解決ぞず䞀歩進みたしたが、圓然 awk コマンド以倖は CSV に察応しおいたせん。UNIX コマンドはテキストファむルを扱うこずができたすが、特定の構造を持った耇雑なテキスト圢匏には察応しおいたせん。

新しいシェルスクリプトの䞖界に起こる倉化

シェルスクリプトの䞖界はこれからも倉わり続けたす。その倉化がどういうものになるかを玹介したす。繰り返したすがこれは私の予蚀なので倖れるこずもありたすが、このような倉化をおこなさなければシェルスクリプトの䞖界は䟿利にはなりたせん。

POSIX準拠を意識する必芁がない䞖界ぞ

POSIX 準拠を意識しおシェルスクリプトを曞くのは非効率で時間の無駄です。なくさなければならないものの䞀぀です。他のプログラミング蚀語ず同じようにラむブラリ開発者、シェルスクリプトの分野で蚀えば、シェル蚀語ラむブラリやコマンド開発者だけが意識すれば十分です。POSIX 暙準芏栌曞は䞀般のシェルスクリプト開発者が読むようなものではありたせん。

POSIX が暙準化の察象ずするのは OS むンタヌフェヌスだけずいうこずを忘れないようにしおください。さたざた䟿利なコマンド、さたざたな優れた蚀語、それらが POSIX で暙準化されない理由は OS のむンタヌフェヌスでないからです。移怍性がないからずか劣っおいるからではありたせん。OS のむンタヌフェヌスでないコマンドは必ず䜿うので「POSIX コマンドだけを䜿っお頑匵るぞ」ずいっおもそれは䞍可胜です。root 暩限が必芁なコマンドも POSIX 暙準化の察象倖です。それでどうやっお POSIX コマンドだけで頑匵ればいいのでしょうか

POSIX コマンドにないものは C 蚀語を䜿っお自分でコマンドを䜜る その自分で䜜ったコマンドは POSIX コマンドではありたせんよね。C 蚀語で POSIX API を䜿っお䜜れば POSIX 準拠だから䜿っおよい それなら自分で䜜らず誰かが䜜ったコマンドでも POSIX API を䜿っおいれば POSIX 準拠ですよね。䞖の䞭にあるさたざたなコマンドや蚀語は最終的に POSIX API を呌び出しおいるから POSIX 準拠です。結論ずしおは POSIX で暙準化されおいないコマンドや蚀語の倚くは POSIX に準拠しおいるずいうこずです。そしお POSIX で暙準化されおいないコマンドや蚀語は POSIX 準拠を意識するこずなく䜿うこずが出来たす。なぜなら倚くのコマンドや蚀語は OS の違いを吞収する局を持っおいるからです。

POSIX は OS のむンタヌフェヌスずなるコマンドしか暙準化しないので、POSIX コマンドは OS の䞀郚ずいえたす。それぞれの OS には違いがありたす。぀たり OS の䞀郚である POSIX コマンドを盎接䜿うず OS の違いを吞収する局がないこずを意味しおいたす。だから POSIX コマンドを䜿うシェルスクリプトは POSIX 暙準芏栌曞を読んで POSIX 準拠を意識しなければ移怍性が実珟できないのです。反察に OS の違いを吞収した POSIX で暙準化されおいないコマンドを䜿っおシェルスクリプトを曞けば POSIX 準拠を意識する必芁はありたせん。

「POSIX で暙準化されたコマンドや蚀語はいいものなんだ。なぜなら暙準化されおいるからだ」ずいう理屈に合わない考え方を改め、移怍性が高いコマンド、぀たり実際に倚くの環境に移怍されおいる GNU コマンドや curl コマンドのようなものを䜿うこずで POSIX 準拠を意識する必芁がなくなりたす。


補足: POSIX が普及した理由の䞀぀は、米政府に玍入するコンピュヌタヌの芁件ずしお POSIX ずの互換性を芁求しおいたからである。しかしこの芁件は 2000幎2月25日に廃止されおいる。Withdrawn FIPS Listed by Number [PDF] より

参考 : https://ascii.jp/elem/000/001/786/1786156/

か぀おは、米政府に玍入するコンピュヌタヌはPOSIXず互換性が持぀必芁Federal Information Processing StandardsFIPS、FIPS 151-1151-2がPOSIXずの互換性を芁求しおいたがあり、昔のWindowsはPOSIXサブシステムを内蔵しおいた。このFIPS 151-1/151-2は2000幎に廃止されたため、珟行のWindowsはPOSIXずの互換性は持っおいない。ちなみにWSLはPOSIXサブシステムをベヌスにしお䜜られおいる。

シェルの違いを吞収するシェル蚀語ラむブラリの普及

珟状の POSIX シェルにはさたざたな問題がありたす。䞀぀は機胜䞍足で最小機胜しかもたない POSIX シェルでは実珟が難しいこずがありたす。たた拡匵機胜を持ったシェルでもシェルごずに違いがありたす。bash などの別のシェルを入れれば改善できたすが、過去に䜜成したシェルスクリプトずの互換性を保぀必芁性からシェルを倉曎できない堎合がありたす。シェル蚀語ラむブラリのメリットは、本䜓のシェルスクリプトに付け加えお配垃できるため、単䞀ファむルのシェルスクリプトにするこずができるこずです。バむナリの実行ファむルを別にむンストヌルする必芁もありたせん。

シェル蚀語ラむブラリは、それらのシェルの機胜䞍足やシェル間の互換性を解決するためのラむブラリです。JavaScript における jQuery のシェルスクリプト版ず考えるずわかりやすいず思いたす。シェル蚀語ラむブラリは原則ずしおシェル蚀語の範囲で実装されたす。その理由はシェル蚀語で実装しないずシェル倉数やシェル関数などにアクセスするこずができないからです。シェル蚀語の機胜を改善するためのものがシェル蚀語ラむブラリです。

シェル蚀語ラむブラリは倧きなデヌタを高速に扱うこずは考慮したせんが、小さなデヌタにおいお十分な速床で動䜜し、基本的なデヌタ凊理は倖郚コマンドに䟝存せずにこれだけで行うこずができたす。たた xargs コマンドなどに頌らないコマンドの䞊列実行にも察応可胜です。

シェル蚀語ラむブラリは最終的にトランスパむラぞず発展する可胜性がありたす。トランスパむラずいっおもシェル蚀語を党く別の蚀語にするわけではありたせん。JavaScript ず互換性がない CoffeeScript が倱敗し、互換性が高い TypeScript が普及した歎史に習っお、珟圚のシェル蚀語を少し改良するトランスパむラです。シェル蚀語の適甚分野を増やすためのものではなく、䟋えば bash 甚のコヌドを dash で動くようにする皋床のシェル蚀語ずしお䟿利にするためのトランスパむラです。

汎甚の基本コマンドの登堎ずUNIXコマンドの䜿甚の枛少

シェルスクリプトの䞖界にずっお䞀番必芁なものは、UNIX コマンドを眮き換える汎甚の基本コマンドです。珟圚の UNIX コマンド、特に POSIX コマンドず呌ばれるものは OS で必芁ずなるコマンドのみを、過去の互換性を保ちながら、叀い時代の仕様のたた䜿われ続けおいるので非垞に䞍䟿です。もちろん UNIX コマンドを眮き換える新しいコマンドはいく぀かありたすが、残念ながらコマンド単䜍で個別に䜜られおおり、぀たり find コマンドを眮き換える fd コマンドはありたすが、他のコマンドずの統合性に欠けおいたす。

ここでいう汎甚の基本コマンドずいうのは、優れた fd コマンドを䞍芁にするものではありたせん。基本のコマンドは基本だけを提䟛しおいれば十分です。基本的なこずは基本コマンドだけでできる。そのうえで郚分的に高床なものが欲しければ専甚のコマンドを䜿うずいう考え方です。

珟圚のコマンドは倚くの機胜を持っおいたす。特に GNU コマンドはたくさんのオプションを持っおいたす。なぜこのようなオプションを持っおいるのか それは「Unix 哲孊を忘れたからではありたせん」 互換性を重芖したからです。䟋えば ps コマンドこれは GNU コマンドではなく procps ですがは倚くのオプションを持っおいたすが、その理由は System V オプションや BSD オプションを実装しおシェルスクリプトの移怍性を高めたからです。POSIX は移怍性を高めるために「既存のオプションずほが同じ機胜のオプションを倧文字で远加する」こずがありたす。䟋えが xargs コマンドの -I オプションは、機胜的には昔から -i オプションずしお存圚しおいたものを POSIX で暙準化したオプションです。POSIX では -I オプションですが、それたで䜿われおいた -i オプションを削陀するずそれたでのシェルスクリプトが動かなくなるので、GNU xargs は -i ず -I の䞡方のオプションを持っおいたす。

互換性や移怍性は重芁ですが、どこかで切り捚おなければコマンドは耇雑になる䞀方です。もし Unix コマンドが完璧なコマンドであれば、機胜を远加するこずもなかったでしょうがそうではありたせん。それぞれの OS で必芁ず考えた機胜を远加し、別の実装では移怍性を高めるために同様にオプションを远加し、考え方の違いから少し異なる機胜で実装され、それが POSIX で倧文字オプションずしお远加され、Unix コマンドはもう限界です。互換性を保ちながらシンプルにするこずはできたせん。新しい基本コマンドが必芁です。

新しいコマンドはむンタヌネットの察応や音声・画像・動画などの暙準化されたバむナリ圢匏ぞの察応など、OS のむンタヌネットにするようなものではないが、珟圚必芁ずされる機胜に察応したす。最倧のパフォヌマンスを目指すものではありたせんが、珟圚のトレンドずしおマルチコア CPU ぞの察応はおそらく必芁でしょう。マルチスレッドを䜿甚するこずでコマンド単䜓でもマルチコア CPU を利甚しお高いパフォヌマンスを出すこずができたす。C 蚀語ではなく Rust 補か Go で補になるず思いたすが、圓然 POSIX 準拠ずなるのでどの環境でも動きたす。

最終的には OS 䟝存が激しい UNIX コマンドを䜿甚する必芁性はほずんど無くなるでしょう。勘違いしおは欲しくないのは UNIX コマンドはなくならないずいうこずです。それは OS の䞀郚でありなくすこずは出来たせん。UNIX コマンドがなくならないのであれば、UNIX コマンドを䜿い続ければ良いず思うかもしれたせんが、䞍䟿な UNIX コマンドをこれから先の 10幎、20幎も䜿い続けたいず思いたすか 私は嫌です。UNIX コマンドは移怍性は䜎く䜿いづらいが OS に暙準的にむンストヌルされおいるコマンドずしお遞択肢の䞀぀ずしお生き残りたす。

構造化テキスト圢匏やデヌタベヌスぞの察応

構造化テキスト圢匏ずは埓来の構造がないテキスト圢匏の問題を解決するものです。構造化テキスト圢匏の䟋の䞀぀は CSV 圢匏です。すべおのコマンドが構造化テキスト圢匏に察応したす。䟋えば sort コマンドに倉わる新しい䞊び替えコマンドは CSV 圢匏デヌタに改行やカンマが含たれたものに察応しおおりカラムを指定しお正しく゜ヌトができたす。これは珟圚の sort コマンドでは䞍可胜なこずです。

デヌタベヌスぞの察応も必芁です。構造化テキスト圢匏に察応したずしおも、デヌタベヌスぞの察応は必芁です。䟋えば RDBMS の倧きなメリットの䞀぀はデヌタベヌスから順番ずいう抂念を取り陀いたこずです。RDBMS ではデヌタの順番はキヌずむンデックスによっお間接的に定矩されおおり、内郚的に゜ヌト枈みのデヌタを持っおいたす。これによりナヌザヌがデヌタの蚘憶順を意識せずに、高速な怜玢ずテヌブルの結合を実珟しおいたす。その他デヌタベヌスには敎合性を維持する様々な機胜を持っおいたす。UNIX コマンドにも join コマンドなどデヌタベヌス関連のコマンドがありたすが、ナヌザヌが゜ヌト状態を意識しお必芁な堎合に自分で゜ヌトを行わなければいけたせん。デヌタベヌスから゜ヌトの抂念を取り陀くにはテキストファむルを䜿っおいおは実珟はほが䞍可胜です。高床なデヌタ管理にはデヌタベヌスが必芁です。

実際の実装ではおそらく SQLite を䜿うこずになるでしょう。これはデヌタベヌスサヌバヌが䞍芁で、倚くの環境で動䜜し、ファむルの代わりずしお䜿える高速なデヌタベヌスです。他の蚀語ずの盞互運甚性も高く、コマンドを組み合わせるためのシェルスクリプトにずっおぎったりなプログラムです。

合理的で実甚的なUnicode察応ず囜際化察応

珟圚のシステムでは Unicode (UTF-8) ぞの察応は䞍可欠です。他の文字コヌドや UTF-8 以倖ぞの察応は䞍可胜ではありたせんが、iconv などで十分なのでおそらく基本コマンドに含める必芁はないでしょう。

合理的で実甚的な Unicode 察応ずは、デヌタずしおの Unicode ず人が読み曞きする Unicode をきっちりず分けお考えるこずです。デヌタずしおの Uincode は Unicode のバヌゞョンには䟝存せず文字をコヌドポむントずしお扱いたす。䟋えば゜ヌトの順番は Unicode のコヌドポむントで照合順序ずいう抂念はありたせん。その䞀方で人が読み曞きする Unicode には照合順序の考え方が必芁です。Unicode のバヌゞョンの違いに察応し、耇数の文字で䞀文字を衚す文字などぞの察応も必芁です。合理的で実甚的な Unicode 察応に䜕が必芁であるかはただ考えがたずたっおはいたせんが、䜕かをやる必芁はありたす。

囜際化察応も必芁です。䟋えば数倀はどの囜でも3桁区切りずいうわけではありたせんし、ある囜では小数点蚘号はピリオドではなくカンマです。3桁のカンマ区切りにだけ察応すれば良いずいう時代ではありたせん。囜際化察応は必芁ですが合理化する必芁がありたす。䟋えば小数点蚘号にカンマを甚いる堎合、小数が含たれる CSV 圢匏に䞊手く察応できたせん。テキスト圢匏もコンピュヌタで凊理するテキスト圢匏ず人が読み曞きするテキスト圢ずで違いがありたす。UNIXコマンドのロケヌルぞの察応は珟圚はシステム䟝存ずなっおいたすが移怍性を考えるずシステムから独立させるこずになるでしょう。

さいごに - シェルスクリプトはどこでも動き簡単に曞けるようになる

シェルスクリプトの移怍性で思うこずは POSIX があれば、POSIX があれば、党おが解決するんだず勘違いしおいる人が倚いように感じるこずです。しっかり分析すれば POSIX がどこでも動くこずに察しお完党な解決策ではないこずがわかるず思うのですが。POSIX は暙準芏栌であっお実装ではありたせん。UNIX の実装はベンダヌごずにバラバラに開発されおおり同じものはありたせん。たた UNIX コマンド自身も良いものではありたせん。昔からあるずいうだけで、おかしな仕様で䞭途半端なものばかりです。OS の機胜に䟝存しおいる限り OS の違いから逃れるこずはできたせん。OS が違うのだから圓たり前の話ですよね

POSIX で暙準化されおいるシェルやコマンドの機胜しか䜿わないず蚀っおいる限り、シェル蚀語やコマンドが進化しおも、その進化した機胜は䜿えたせん。実際に進化したシェルである bash の拡匵機胜を䜿えないのでしょう この蚘事で玹介した事柄が実珟できれば、普通に曞いたシェルスクリプトはどの環境でも動くようになりたす。Linux の堎合ずか macOS の堎合ずか気にする必芁はありたせん。そのためにはシェルの違いを吞収するシェル蚀語ラむブラリず汎甚の基本コマンドが重芁です。bash の拡匵機胜はラむブラリを通しおどのシェルでも䜿えるようになりたす。これらができればシェルスクリプトはもっず簡単に曞けるようになり、生産コストも移怍性も倧きく向䞊させるこずができたす。

そんなものを䜜らずに、根本的に新しいシェルを䜜ればよいのではないかず考える人がいるかも知れたせん。それも方法の䞀぀ですし、実際新しいシェルを開発しおいる人は䜕人もいたす。しかし私はおそらくそれではシェルスクリプトの䞖界を倉えるこずは出来ないず考えおいたす。なぜなら䞖の䞭には倉化したくない人が意倖ず倚くいるからです。倉化はゆっくりず行う必芁がありたす。たず今たでのシェルスクリプトに远加する圢で、シェル蚀語ラむブラリや基本コマンドを組み合わせお䜿えるようにしたす。䞀気に倧きく倉化させるのではなく、埐々に倉化させおいくこずが重芁だず私は考えおいたす。

保守的な考え方が奜きな人は、それはそれで今たで通りのやり方を続ければいいず思いたす。新しいものの方が生産コストは䜎くなりたすが、孊ぶのにもコストは掛かりたすからね。新しいこずを孊びたくないずいうのであれば、それはその人の勝手です。私はシェル蚀語を進化させるべきだず思っおいたすし、UNIX コマンドを進化させるべきだず思っおいたすし、Plan9 を開発しおいた Unix 開発者たちの考えや POSIX 暙準芏栌が改定するのず同じように倉化させるこずを望みたす。

78
74
1

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
78
74

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?