ターミナルプログラムの暗黙のルール

Table of Contents
私はターミナルで数えきれないほどの時間を過ごしてきましたが、ある奇妙なことに気づき続けています。CLIツールをどのように構築するかについて、開発者に指示する中央のコマンドがないにもかかわらず、それらはすべてほぼ同じ言語を話します。qは終了します。Ctrl-Cはキャンセルします。出力をどこか別の場所にパイプすると、色は消えます。
これは偶然ではありません。進化です。
この一貫性は、POSIX標準、古いUnixの慣習、そして純粋な勢いから来ています。十分な数のツールが何かに同意すれば、不一致はユーザーエクスペリエンスの問題になります。以下は、私が気づいたパターンであり、まったく新しいものを使っているときでもコマンドラインを直感的に感じさせるものです。
Modern Linux & Terminal Mastery Series
記述的であり、規範的ではない
これらのルールは、ドキュメントではなく、実世界の観察に基づいています。CLIガイドライン(CLI Guidelines)のような現代の取り組みは、開発者がすでに直感的に知っていたことを形式化しようとしています。
暗黙のルール
ルール1:Ctrl-Cで終了する(非対話型)
プログラムが非対話型の場合、Ctrl-Cを押すと、SIGINTシグナルを介してすぐに終了するはずです。ping 127.0.0.1やcurl https://example.comを考えてみてください。Ctrl-Cを押すと、プログラムが終了し、プロンプトが戻ってきます。
対話型プログラムはこれを異なる方法で処理します。シェル、vimのようなテキストエディタ、および同様のツールはシグナルを捕捉し、それを別の目的で使用します。vimでは、Ctrl-Cは入力中のものをキャンセルします。終了しないのは、終了すると未保存の作業が失われるためです。これは意図的な選択であり、バグではありません。
ルール2:「q」でTUIを終了する
less、top、htop、man、vimのようなテキストベースのユーザーインターフェース(TUI)はすべて、終了するためにqキーに応答します。試してみてください。less /etc/passwdを開き、qと入力すると、シェルに戻ります。topでも同じです。htopでも同じです。
なぜqでCtrl-Qではないのでしょうか?おそらく昔からの習慣でしょう。qは左手のホームポジションにあり、速く、そして記憶しやすいです。この慣習は非常に強力なので、それに逆らうことは個人的な侮辱のように感じられます。
ルール3:Ctrl-DでREPLを終了する
Read-Eval-Print Loop(REPL)は異なる動作をします。Python、NodeのREPL、またはIRB(Rubyの対話型シェル)を使用しているときに、空の行でCtrl-Dを押してみてください。REPLが閉じます。なぜでしょうか?
Ctrl-DはEOFマーカー、つまりファイル終端文字を送信します。REPLはこれを「ユーザーは入力の提供を終えた」と解釈し、きれいにシャットダウンします。これは優雅な終了であり、Ctrl-Cのような暴力的な終了ではありません。
実際のターミナルで試してみてください。python3と入力し、>>> プロンプトを待ってEnterを押し、次にCtrl-Dを押します。終了します。これが慣習です。
色と表示のガイドライン
ルール4:16色にこだわる
ほとんどの行儀の良いターミナルプログラムは、16色のみを使用します。これらはすべてのターミナルテーマがサポートする色です。トゥルーカラー(24ビット、1600万色)および256色モードも存在しますが、ユーザーのカラースキームやアクセシビリティ設定と競合する可能性があります。迷った場合は、控えめにしておきましょう。
ルール6:パイプでは色を無効にする
これは一度私を悩ませたことがあり、決して忘れません。標準出力がターミナルである場合は、カラフルな出力を表示します。標準出力がパイプまたはファイルである場合は、カラーコードを削除します。そうしないと、開発者はyourcommand | grep somethingを実行し、ログに\033[31mError\033[0mのようなゴミを見ることになります。
これを!isatty(stdout)で検出します。すべての言語に同等のものがあります。Pythonにはsys.stdout.isatty()、Nodeにはprocess.stdout.isatty()があります。これを使用してください。
キーバインディングと入力の慣習
ルール5:Readlineのキーバインディングを漠然とサポートする
ユーザーはbashからの期待を持っています。これらはほとんど機能するはずです。
Ctrl-Eは行末にジャンプしますCtrl-Aは行頭にジャンプしますCtrl-Wは最後の単語を削除します
完全なreadline互換性が必要ですか?おそらく必要ありません。しかし、ユーザーはあなたのツールでCtrl-Aを試して、それが機能することを期待します。機能しない場合、彼らはそれに気づきます。
そもそも「最後の単語」とは何でしょうか?ほとんどのプログラムでは、スペース区切りです。bashのCtrl-Wは、最後のスペースまでをすべて削除します。この動作はOSのターミナルドライバーのクックドモード(cooked mode)から来ており、それがユーザーが期待するものです。
ルール7:ハイフンは標準入力または標準出力を意味する
これに初めて気づいたとき、私は驚きました。多くのCLIツールは、単一のハイフンを「標準入力から読み込む」または「標準出力に書き込む」を意味する特別な引数として受け入れます。
いくつかの例:
cat -は標準入力から読み込みます
tar cf - /path |-gzip > file.tar.gzはアーカイブを標準出力にストリームします
diff file1 -はfile1と標準入力を比較します
これは慣習であり、要件ではありません。しかし、これを見れば、作者が何を意図していたのか理解できるでしょう。
ルール8:現代の代替品も古いルールに従う
bat(cat用)、rg(grep用)、fd(find用)のような現代のRustによる書き換えが、これらの全く同じ暗黙のルールに厳密に従っていることに注目してください。これらはシンタックスハイライトと速度を追加しますが、パイプされると色を削除し、Ctrl-Cで終了し、標準入力のために-を受け入れます。これらが成功するのは、POSIXの過去の亡霊を尊重しているからです。
なぜこれが重要なのか?
問題はこれです。これらのパターンは、誰かが書き留めて強制したルールではありません。それらは創発的なものです。十分な数のツールが同じ方法で何かを行うと、ユーザーはその方法を学びます。新しいツールも同じ動作を継承します。なぜなら、それに逆らうと摩擦が生じるからです。
qで終了しないツールを初めて使ったときのことを覚えています。それはDockerコンテナを管理するためのカスタムTUIでした。私はqを押しました。何も起こりません。Ctrl-Cを押しました。何も起こりません。Ctrl-Zとkill -9で強制終了しなければなりませんでした。それは壊れているように感じました。たとえそれが「正しく」機能していたとしてもです。
それがポイントです。ターミナルでは、慣習が正しさなのです。あなたのツールがユーザーの期待に反する場合、ドキュメントに何が書かれていようと、それは間違っています。
CLI Guidelinesプロジェクトは、この一部を形式化しようとしています。読む価値はあります。しかし正直なところ、これらの慣習を学ぶ最も速い方法は、まったく読書することではありません。それは毎日ターミナルを使うことです。パターンは筋肉の記憶を通して染み込みます。
実践による学習
新しいツールをインストールしましたか?q、Ctrl-C、Ctrl-Dを叩き、スペースバーでスクロールするのに2分間費やしてください。ほとんどの場合、マニュアルに触れることなく慣習を発見できるでしょう。
気づく価値のあるパターン
次に新しいCLIツールを探索するときは、これを試してみてください。中断をどのように処理するかを見てください。カラフルな出力がどこかにパイプされると消えるかどうかを観察してください。入力フィールドでCtrl-Aを押すとどうなるかを観察してください。
あなたはどこでもパターンを見つけ始めるでしょう。なぜなら、それらは偶然ではないからです。それらは何十年にもわたる蓄積された決定であり、ターミナルがどのように機能すべきかという共通の理解に収束しています。
そして、最初に述べた奇妙さ、つまり無関係なコマンドが一貫して動作する「奇妙な調和」は、それが言語そのものと同じ源から来ていると気づけば、まったく奇妙ではありません。慣習。繰り返し。時間。
あなたのツールが同じ方言を話しているのは、私たち全員がお互いからそれを学んだからです。
関連するターミナル記事
- パイプが時々「詰まる」理由:バッファリングの解説 — 標準入出力のバッファリングがパイプラインをどのように壊すか
- モダンなターミナル環境の構築 — 私の現在のターミナルスタック
こちらもおすすめ
Free In-Browser Developer Tools
Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.
Related Articles

モダンなターミナル環境の構築
Starshipプロンプト、zsh-autosuggestions、シンタックスハイライトを活用し、dotfileの落とし穴から学んだ、本当に定着するミニマルなターミナル環境を構築する方法を紹介します。
Read more
LinuxでPATHにディレクトリを追加する方法(永続的な修正)
LinuxとmacOSでディレクトリやフォルダをPATHに永続的に追加するためのステップバイステップガイド。bashrc、zshrcの編集、exportコマンド、および「command not found」エラーの解決方法を解説します。
Read more
SSHとSCP:開発者が本当に理解すべき2つのツール
ポート22、鍵認証、SSHconfigファイル、安全なファイル転送、サーバー強化のヒントなど、開発者が知っておくべきSSHとSCPの要点を解説するガイド。
Read more