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


22

私はちょうどことを偶然見つけたCTRL+ 4 読ん閉じプログラムstdinのコマンドラインからの入力を。

これは、 読み取りプログラムにCTRL+ 4または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+ \がまったく同じことをすることがわかりました。

回答:


37

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+で\あり、Shiftキーが押されたかどうかにかかわらず、端末は^ \を送信するためです。

^ \終了

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

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

端末自体^\がメッセージの一部を印刷します。入力した文字の視覚的な描写であり、端末はクックモードでエコーがオンになっています(文字は、入力するとすぐに端末によって表示されます文字がアプリケーションにのみ送信される非エコーモード。文字を表示することを選択する場合としない場合があります)。このQuit部分はbashに由来します。その子プロセスが終了シグナルで死んだことに気づき、それがその方法です。

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

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

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


SIGINTはフォアグラウンドプロセスグループを強制終了し、SIGQUITはコアダンプを使用して強制終了します。両方の信号を処理できます。次のコマンドを読んでどういう意味か分からない。システムは、初期のcoredumpsizeの制限を0に設定すること以外のコアダンプを無効にしません(ハードではなく、通常は自由に上げることができます)。
ステファンシャゼラス16

@StéphaneChazelasユーザーインタラクションを実行するプログラムでは、SIGINTの通常のセマンティクスは、現在のユーザーコマンドをキャンセルし、ユーザーがプログラムと対話できるようにする、つまりメインコマンドループに戻ることです。一方、SIGQUITが終了しないプログラムを見たことは覚えていません(シグナルハンドラのバグがない限り)。実際、多くのシステムがデフォルトでコアダンプを無効にする方法は、コアダンプサイズのソフト制限を0に設定することです。ユーザーは必要に応じてこのデフォルト設定を自由に変更できます。
ジル 'SO-悪であるのをやめる'

それは例外です。SIGINTは現在実行中のタスクを強制終了します。それを拡張して、独自の「フォアグラウンド」タスクを強制終了するアプリケーションはわずかです。lessまたはを考えている必要がありますvim。中にいることを注意cmd | lessCTRL-C一般的に殺すんcmd(のためにしながらless、()検索のような現在のアクションをキャンセルするために処理されます)(続き)
ステファンChazelas

あなたの答えの文言はその点で混乱していると思います。SIGQUITが一般的に処理されないという事実は、同じ方法で使用されていないということです。現在実行中の操作を中止するには、CTRL-Cを押します。コアダンプを生成するためのデバッグにごくまれにのみ「CTRL- \」を使用します。一般的に、アプリケーションがあなたの邪魔をしようとする理由はありません。
ステファンシャゼル16

@StéphaneChazelasそれだけでなく、vimだけでなく、それに対するユーザーコマンドを読み取るほとんどの端末ベースのアプリケーション。たとえば、REPL(bash、dash、ksh、zsh、python、irb、fsharpi、Mathematicaなど)。それはめったにありません。最初のコメントはSIGINTとSIGQUITをあまりにも異なるものとしてペイントすることに反対し、最新のコメントオブジェクトはSIGINTとSIGQUITをあまりにも似たものとしてペイントすることに反対します。
ジル「SO-悪であるのをやめる」

7

Gillesの回答に加えて、bashで印刷できない文字を常にCtrl-v+ key(この場合はCtrl-v+ Ctrl+4)で入力し、文字コードを

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

チェックインできるファイル区切り文字(FS)man ascii対応する文字の10進コードを取得します


では、ctrl + vは何をしますか?「貼り付けクリップボード」に慣れています。
JDługosz

2
@JDługosz:Ctrl-Vは、次の文字を解釈しないように端末に指示します。GUIキーの組み合わせがこれらの制御文字を引き継いで、不必要な混乱を引き起こしているのは残念な事実です。LinuxはGUIキーにAlt- [Key]を使用していました(例:コピー/貼り付けにAlt-C / Alt / V)が、Windowsと同じことを行うことがより重要であると人々は明らかに思っていました。一方、Macユーザーはこれらの操作にCtrlキーの代わりにCommandキーを使用しても問題ありません。
celtschk

(短い)コマンドは次のとおりprintf '%d\n' '"^\'です。
アイザック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.