新しいジン:ターミナルの秘密のルール
こんにちは! ターミナルについて深掘りするブログ記事を何か月も書いてきましたが、火曜日に新しいジン『ターミナルの秘密のルール』を出しました!
こちらから12ドルで購入できます:https://wizardzines.com/zines/terminal。また、私のジン全15冊セットはこちらから購入できます。
表紙はこちらです:
目次
目次はこちらです:
なぜターミナルなのか?
私は20年間、毎日ターミナルを使ってきました。ターミナルにはかなり自信がありますが、それでもずっと少し落ち着かない感じがありました。たいていは問題なく動くのに、ときどき何かがおかしくなると、調べるのは不可能に思えます。少なくとも、調べ始めたらとんでもなく面倒なことになりそうに感じます。
そこで、ターミナルで遭遇した変な問題をリストに書き出してみました。すると、ターミナルには次のような小さな不整合がたくさんあることに気づきました。
- 矢印キーで移動できるときもあれば、押すと
^[[Dと表示されるだけのときもある - マウスでテキストを選択できるときもあれば、できないときもある
- 実行したコマンドが履歴に保存されるときもあれば、されないときもある
- 上矢印キーで前のコマンドを表示できるシェルもあれば、できないものもある
ターミナルを10年、20年と毎日使っていれば、なぜこうしたことが起こるのかを正確には理解していなくても、おそらく感覚は身につくでしょう。
ただ、感覚があることと、なぜ起きるのかを理解していることは別です。このジンを書くにあたって、どう考えればよいかを説明できるよう、ターミナルで何が実際に起きているのかを正確に突き止めるために、かなり作業する必要がありました。
ルールはどこにも書かれていない
ターミナルの動作に関する「ルール」(入力中のコマンドをどう編集するか、プログラムをどう終了するか、色がおかしくなったらどう直すかなど)は、完全に理解するのがものすごく難しいことがわかりました。というのも、「ターミナル」は実際には、さまざまな考え方を持つ別々の人たちが書いた、多数のソフトウェアから成り立っているからです。ターミナルエミュレータ、OS、シェル、grep のような基本ユーティリティ、そしてインストールしたその他あらゆるターミナルプログラムが含まれます。
そこで、次のことを説明するものを書きたいと思いました。
- ターミナルを構成する4つの要素、つまりシェル、ターミナルエミュレータ、プログラム、TTYドライバが、どのように連携して動作しているか
- ターミナル内でどのように動くことを期待できるか、その基本的な慣習
- ターミナルプログラムを使うためのたくさんのヒントとコツ
このジンでは、ターミナル内部の特に役立つ部分を説明しています
ターミナルの内部はごちゃごちゃしています。その多くは、1980年代に誰かが決めたやり方が今では変更不可能になっているだけですし、正直なところ、ターミナル内部についてすべて学ぶ価値があるとは思いません。
ただし、理解するのがそれほど難しくなく、ターミナルでの体験を本当に改善できる部分もあります。たとえば次のようなものです。
- 自分のシェルが何を担っているかを理解すれば、シェルを設定したり(あるいは別のシェルを使ったり!)、履歴により簡単にアクセスしたり、優れたタブ補完を使ったり、ほかにもいろいろできます
- エスケープコードを理解していれば、バイナリを
catして標準出力に流したせいでターミナルがおかしくなっても、それほど怖くありません。resetと打って先に進めばよいだけです - 色の仕組みを理解すれば、ターミナル内の悪い色コントラストを解消し、実際にテキストを読めるようにできます
このジンを書いて、驚くほど多くのことを学びました
How Git Works を書いたときは、Gitの仕組みをわかっていると思っていましたし、実際そのとおりでした。でもターミナルは違います。ターミナルには完全に自信があり、20年間毎日使ってきたにもかかわらず、ターミナルの仕組みについて多くの誤解がありました。(tmux の作者か何かでないかぎり)あなたにもそうである可能性はかなり高いと思います。
私にとって実際に役立っている、学んだことをいくつか挙げます。
- ターミナルの構造をよりよく理解できるようになり、遭遇する変なターミナルの問題をデバッグすることに、より自信を持てるようになりました(fishに対して小さな改善提案さえできました!)。ターミナルで変なことを起こしているソフトウェアがどれなのかを正確に特定するのは、今でも簡単ではありませんが、ずっと上達しました。
- シェルスクリプトを書けば、SSH越しにクリップボードへコピーできます
resetが内部でどう動くか(stty sane; sleep 1; tput resetと同等のことをします)。つまり、stty saneやtput resetを覚えておく必要はまったくなく、代わりにresetを実行すればよいと学びました- プログラムが出力している見えないエスケープコードを確認する方法(
unbuffer program > out; less outを実行します) - Mac上の
sqlite3のような組み込みREPLがなぜあんなに使いにくいのか(readlineではなくlibeditを使っているためです)
途中で書いたブログ記事
最近はいつもそうですが、いろいろな寄り道についてブログ記事をたくさん書きました。
- PATHにディレクトリを追加する方法
- ターミナルの問題が従う「ルール」
- パイプがときどき「詰まる」理由:バッファリング
- ターミナルでのいくつかの不満
- ターミナル内のASCII制御文字。テーマは「Ctrl+A、Ctrl+B、Ctrl+Cなどはいったい何なのか?」です
- ターミナルでテキストを入力するのは複雑です
- 「モダンな」ターミナル環境を整えるには何が必要?
- シェルのジョブ制御を使う理由
- ANSIエスケープコードの標準。これは実のところ、
terminfoデータベースが現在も私たちの役に立っているのかを考えようとした記事です
このジンを手伝ってくれた人たち
ずいぶん前は、ほとんど一人でジンを書いていました。でもプロジェクトを重ねるごとに、もらえる助けがどんどん増えています。今回の制作では、9月から6月まで毎週平日、Marie Claire LeBlanc Flanaganと一緒に作業しました。
表紙はVladimir Kašiković、コピー編集はLesley Trites、技術レビューはPuTTYを書いたSimon Tathamが担当しました。オペレーションマネージャーのLeeは文字起こしのほか、数え切れないほどたくさんのことをしてくれました。そして、私が知るなかでターミナルの呪われた内部の仕組みを実際に理解している数少ない人の一人であるJesse Luehrsとは、ターミナルで何が起きているのかについて、とても役立つ会話を何度もしました。
ジンを入手する
ジンを入手するリンクをもう一度載せておきます。
いつものように、自宅で印刷できるPDF版か、自宅へ発送する印刷版のどちらかを選べます。唯一の注意点は、印刷版の注文は8月に発送されることです。印刷所に送る前に、何部印刷すべきか見当をつけるため、注文が入るのを待つ必要があります。
記事をランダムに読む

