Incorrect syntax highlighting for .zshrc (BB-11605)が気になってて。
そもそも BitBucket のコードブラウザ、マニュアルで lexer 選択出来ないわけで、当該 issue は BitBucket の問題でもあるんだけれども、それ以前に、Pygments にまだ誰も zsh の lexer、書いてないのねぇ。
なんてことが気になって、ちょっとばかし zsh の情報収集してたんだけど。をぃ。マズイぞそれは:
このひと、第一回を読む限り、ワタシとほぼ同年代か少し上くらいかなと思うし、経験も似た感じみたい。けれど、主に tcsh と zsh しか知らないのなら、bourne-shell に言及しない方が良かったんじゃないか?
Unix のかなり古い歴史まで知らないとなかなか気付かない人もいそうだが、「[」は、大昔は「コマンドだった」。そして今でもコマンドとして存在している:
「[」コマンドは test コマンドと全く同じ実行ファイルである。単なる別名と思っていい。(唯一の違いは「[」は相手となる「]」を探しに行くことだけ。)
そして bash は、この「[]」を、このコマンドを使うのではなく、built-in として内臓するようになった。正確には「構文になった」のかもしれない。どっちかはわからない。ともかく bash は「[コマンド」を使わない。
それでも bash は名の示す通り「bourne again shell」であるから、ほぼ「bourne shell 互換」である。bash は「csh なんか死んでしまえ」「tcsh なんかもっと消えてなくなれ」を願って「史上最高にクールな」bourne-shell 復権を願ったシェルだったのだ。だから今でも
1 me@host: ~$ [ EXPR ]
は、bash とオリジナル bourne-shell は全く同じ振る舞いをする(bashの方が builtin なので速いという違いを除けば)。
で、かなり長いこと bash ユーザであるワタシには、
1 [[ EXPR ]]
が sh 構文である、とするくだんの説明が釈然としない。自分でも混乱してしまい、思わず今わざわざ MSYS2 入れてまで dash で確認した:
1 me@host: ~$ [[ -d /usr ]] && echo t
2 /usr/bin/dash: 7: [[: not found
3 me@host: ~$ [ -d /usr ] && echo t
4 t
5 me@host: ~$ test -d /usr && echo t
6 t
7 me@host: ~$
ほらみたことか。zsh 固有の構文じゃないか。ほかにも「(())」なんてのもあるのか。
最近 bash のセキュリティ問題が騒がれたことで zsh に乗り換える人が結構いるみたいね。わたしゃ「そりゃ違くね?」と思うクチだ。そりゃそうでしょう? 「Windows にバグがあったから前から評判になってた Tron OS に乗り換えてみた」が馬鹿げているのは誰だってわかると思う。これが馬鹿げているのは、「セキュリティリスクはコミュニティの活発さに反比例する」ことに全く目が向いてないから。zsh だって同じです。これまで bash ほどには人気を獲得してこなかった小さなコミュニティ。bash より問題が少ないなんて、誰も言ってない。
それはそうなんだけど、本来もっと人気になっても良かったシェルなんだよね、zsh。明暗を分けたのはもちろん「linux 標準になったかならなかったか」だけの違いでしかなくて。
そして今後も zsh 人気は少しずつ高くなっていくような気がしてる。誰か Pygments の lexer 書いてくれ。ワタシゃユーザになるつもりがないので書かない(書けない)けどな。
ちなみに「csh なんか死んでしまえ」「tcsh なんかもっと消えてなくなれ」、なんだけどね。これは当時、本当に真剣に言われていたことで。tcsh を対話シェルで使うのはいいとしても、スクリプトを csh で書くことは全然実用にならなくて、皆ストレスを溜めていたのよ。不可解な構文解析、不定な振る舞い。初心者のうちは困らないんだけど、凝った事をし出して、色々出来なくて、初心者は自分のせいだと思い込み、それが「cshだから」と知るまでに時間がかかるのが問題だったのよ。
今でも見つかるかなぁ? あ、いた。翻訳がいたと思うんだけどなぁ? いたけど euc なんで、chrome だと面倒なんで IE とかで読んで。
この文書は相当に有名でかなり出回ったので、皆はっとしたわけだけれど、この文書が出回った頃の bash と言えば…。あるにはあったんだけどね、この頃には bash も zsh も。どっちもとても不安定で、まぁ良く死んだ。だから怖くてログインシェルになんか出来なかった。だからワタシなんかは、ログインシェルを /bin/sh (今の linux と違って本物の bourne-shell)にして、.login とかで tcsh を起動するようにしておいて、ログイン後に bash とタイプする、という、大変回りくどいことをしていた。こうしとかないとさ、いつ死ぬかわからんからさ。bash が死んでも readline ベースの tcsh のコマンドライン編集を使いたかったからね。てなわけで、「cshダメ!」がすぐさま「全bash」という行動に結び付いた人は、結構限られてたと思う。
このくらいの時期はまだ zsh と bash に人気の差は付いてなかったはずなのよ。zsh の方が「華やか」だったようにも思う。状況が激変したのは linux ブームが起こってから。今となっては「bash しか知らない」技術者の方が大半。そんな技術者は、FreeBSD 使ってびっくりしたりするんだろうなぁ。未だにデフォルトシェルは csh だもの。(無論ワタシはすぐに /bin/sh に変更し、bash をインストールするけれどもね。でもいまでもログインシェルにはしないなぁ。.login から bash 起動、とする、かね。大抵。)