web-dev-qa-db-ja.com

CTRL + 4(およびCTRL + \)はbashで何をしますか?

私は偶然にそれを見つけた CTRL4 コマンドラインからstdin入力を読み取るプログラムを閉じます。

これは私がタイプしたときの見え方です CTRL4 または CTRL/stdinを読み取るプログラムに

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^\Quit
$

^\Quitが表示され、プログラムが閉じます。 ^Cまたは^Dを使用する場合との違いは何ですか? ^\Quitは何をしますか?

編集:それがわかった CTRL\ まったく同じことをします。

23
wefwefa3

Ctrl + 4送信^ \

端末はキーではなく文字(より正確にはバイト)を送信します。印刷可能な文字を表すキーが押されると、端末はその文字をアプリケーションに送信します。ほとんどのファンクションキーは、エスケープシーケンス(文字番号27で始まる文字のシーケンス)としてエンコードされます。次の形式のキーコード Ctrl+character、およびいくつかのファンクションキーは、 ASCII文字セット の制御文字として送信されます。これは、最近のすべてのコンピューターがベースとして使用します(Unicode、ISO Latin-) nなどはすべてASCIIのスーパーセットです)、33文字は制御文字です:文字番号0から31および127。制御文字は印刷できませんが、アプリケーションで効果を発揮することを目的としています。たとえば、Control-J(通常^ J)である文字10は改行文字であるため、端末がその文字を表示すると、グリフを表示するのではなく、カーソルを次の行に移動します。エスケープ文字自体は制御文字^ [(値27)です。

すべてをカバーするのに十分な制御文字がありません Ctrl+character キーコード。文字と文字@[\]^_?のみに対応する制御文字があります。押すと Ctrl+4 または Ctrl+$ (私が推測するのは Ctrl+Shift+4)、端末は送信するものを選択する必要があります。端末とその構成に応じて、いくつかの一般的な可能性があります。

  • 端末は無視します Ctrl 修飾子を付けて、文字4または$を送信します。
  • 端末は、押された正確なキーと修飾子をエンコードするエスケープシーケンスを送信します。
  • 端末は他の制御文字を送信します。

多くの端末は、数字列のいくつかのキーに制御文字を送信します。

  • Ctrl+2 →^ @
  • Ctrl+3 →^ [
  • Ctrl+4 →^ \
  • Ctrl+5 →^]
  • Ctrl+6 →^^
  • Ctrl+7 →^ _
  • Ctrl+8 →^?

この特定の慣習がどこで発生したのかはわかりません。

Ctrl+| それはので、同じ文字を送信します Ctrl+Shift+\ そして端末はシフトキーが押されたかどうかに関係なく^ \を送信します。

^ \は終了します

端末自体(より正確には、カーネルの汎用端末サポート)は、いくつかの制御文字を特別に解釈します。この解釈は、さまざまな文字をマップするように構成したり、文字を自分で処理したいアプリケーションによって無効にしたりできます。よく知られているそのような解釈の1つは、^ M、 Return キー。端末が クックドモード の場合、現在の行をアプリケーションに送信します。アプリケーションは1行ずつ入力を受信します。

数文字が signals をフォアグラウンドのアプリケーションに送信します。 ^ Cは 割り込み信号 (SIGINT)を送信します。これは通常、アプリケーションに、実行中の動作を停止してユーザーの次のコマンドを読み取るように指示します。非対話型アプリケーションは通常終了します。 ^ \は 終了信号 (SIGQUIT)を送信します。これは、通常、何も保存せずにできるだけ早く終了するようにアプリケーションに指示します。多くのアプリケーションはデフォルトの動作を上書きしません。つまり、アプリケーションをすぐに強制終了します¹。だからあなたが押すと Ctrl+4catまたはbc内の(または^ \文字を送信するものはすべて)デフォルトの動作をオーバーライドしないため、アプリケーションは強制終了されます。

端末自体がメッセージの^\部分を出力します。これは、入力した文字の視覚的な描写であり、端末はクックモードでエコーがオンになっています(文字は、入力するとすぐに端末に表示されますそれらは、文字がアプリケーションに送信されるだけの非エコーモードとは対照的に、表示するかどうかは選択されません)。 Quitの部分はbashに由来します。子プロセスがquitシグナルで停止したことに気付き、それがそのことをユーザーに知らせる方法です。

シェルはすべての一般的なシグナルを処理するため、シェルで^ \と入力しても、セッションを終了せず、^ Cと同じ新しいプロンプトが表示されます。

stty コマンドを使用して、端末設定で遊ぶことができます。

¹ そして伝統的に コアダンプ を生成しますが、多くのシステムは現在デフォルトでそれを無効にしています。

Gillesの回答に加えて、bashに印刷不可能な文字を常に入力できることを付け加えておきます Ctrl-v+keyCtrl-v+Ctrl+4 この場合)、文字コードを確認します

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

文字の10進コードを取得します。これは、man asciiで確認できるように、ファイル区切り(FS)に対応します。

7
jimmij