catターミナルのシェルプロンプトで実行すると、catstdinから読み取った内容をstdoutに書き込むことになっていて、を押すaとa、ターミナルドライバーによってエコーバックが表示されますが、それcatは書き込まれませんa( 1つのみa、ターミナルドライバによってエコーされるもの)。
ただし、a Backspace b Enterをcat入力するとa\010b\015、の出力は表示されませんが、b\012(bおよび改行)が表示されます。
それは、ターミナルドライバ(カーネル内のソフトウェアではなく、カーネル内のソフトウェアxterm)が標準モードの場合に非常に基本的なラインエディタを実装するためです。ターミナルドライバーは、コマンドを使用するときなどのシステムコールを使用して構成できます。たとえば、標準モードを終了するには、を実行できます。もしあなたがそうするなら:ioctl()sttystty -icanon
stty -icanon; cat
次に、echo(で無効にすることもできますstty -echo)とcat出力の両方が同時に表示されます。
そのエディターはラインエディターです。つまり、ユーザーがを押すと、端末デバイスを読み取るアプリケーションに送信されるまで、1行のテキストを編集できますEnter。
そのエディターの編集機能は非常に限られています。ほとんどの実装では、4つの編集キー(実際には文字)のみが設定可能sttyです。
- erase(^Hまたは^?通常):前の文字を消去します
- kill(^U通常):空(kill)これまでに入力された行
- werase(^W):前の単語を消去します
- lnext(^V):次の文字をそのまま入力します(上記すべての特別な意味をキャンセルします)
昔は、ターミナルドライバーのラインエディターがより優れた機能で拡張されると考えられていました。そのため、初期のシェルにはコマンドライン編集機能がありません(cat上記のように実行した場合よりもシェルプロンプトで同じ行編集機能を使用できます)。
しかし、それは実際には起こりませんでした。おそらく、いくつかのキーを押しても異なる端末が同じ文字を送信しないという混乱が原因で、カーネル空間に実装すべきではないことが明らかになりました。
そのため、一部のシェルは、ターミナルドライバーの標準モードを削除し、独自のラインエディターを実装し始めました。当時、emacsとvi完全に異なるキーバインディングや運転モードで最も人気のある視覚的なテキストエディタでした。にはvi、テキストを入力するモードと編集するモードがあります。ではemacs、常にテキストモードになりますが、編集はキーの組み合わせを押すことで行われます(^b文字を後方に移動するなど)。
当時、シェルが独自の異なるキーバインディングを考案することは意味がありませんでした。それは人々が別のものを学ばなければならないためにフラストレーションを引き起こしたでしょう。ただし、一方のスタイル(emacsまたはvi)を他方のスタイルよりも選択することは、他のエディターのユーザーを疎外する確実な方法でした。
https://www.usenix.org/legacy/publications/library/proceedings/vhll/full_papers/korn.ksh.aによると:
  kshの一般的なインライン編集機能(viおよびemacsモード)は、Bell Laboratoriesのソフトウェア開発者によって作成されました。Pat Sullivanによるviライン編集モード、Mike Veachによるemacsライン編集モード。それぞれが独自にBourneシェルを変更してこれらの機能を追加し、両方とも、kshにそれぞれのインラインエディターがある場合にのみkshを使用したい組織にいました。元々、コマンドライン編集をkshに追加するというアイデアは、行編集がターミナルドライバーに移行することを期待して拒否されました。ただし、これがすぐに発生する可能性が低いことが明らかになったとき、両方の行編集モードがkshに統合され、端末インターフェイスの一部として編集を提供するシステムで無効にできるようにオプションになりました。
そのため、代わりに、両方と、ユーザーが2つから選択するためのインターフェイスを実装しました。kshほとんどの場合、80年代前半に最初に(上記のように個別に記述されたコードを再利用してviモードとemacsモードをBourneシェルに追加)、その後tcsh(tcsh最初にemacsキーバインドのみがあり、viモードは後で追加されました)および後でbashそしてzsh90年代初期。
あなたは、2つのモードを切り替えbash、zshまたはksh持つset -o viかset -o emacs、ととbindkey -eやbindkey -v中tcshまたはzsh。
POSIXは、実際に指定するviモードとないemacsためのモードsh(物語があることがあるリチャード・ストールマンが指定POSIXに反対emacsするためのモードをsh)。
デフォルトのモードではbash、パブリック・ドメインは、の変異体ksh(pdkshの、mksh、oksh)、tcshおよびzshEmacsのモード(とかかわらずであるzsh、それはですviあなたの場合$EDITOR、IS viAT&Tにいる間、) ksh、それはだダムない限り、モード$EDITORまたは$VISUAL言及viかemacs。
kshまた、後で異なる方法で処理されるgmacsGoslingのユーザーに対応するモードを追加しました。emacsCtrl+T
今の取扱い^W中emacsまたは中tcshのemacsモードは、おそらく以前からwerase私たちは本当にその約私の陳述のためにそれらを責めることはできないので、ターミナルラインエディタで文字を「...出発」誤解を招くとして見ることができます。を入力したときに、他のすべてのものとは異なる動作をしたりemacs、他のすべての動作と異なる動作をしtcshたりinfoすると、イライラするだけですCtrl-W。あなたがタイプしたときにいくつかのアプリケーションがウィンドウを閉じ始めたとき、私はそれがはるかにイライラすることを発見したと想像できます   Ctrl-W。