端末ライン入力を終了するにはCtrl + D


21

私が行った場合

$ cat > file.txt

テキストCtrl- DCtrl-D

質問1:私は、プレスが入力しない場合は、なぜ私が押す必要がありますCtrl- D二度?

私が行った場合

$ cat > file.txt

PA用のBAM pshhh Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
$ cat > file.txt

pa bam pshhh

Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
pa bam pshhh

2行目でファイルが1行であるのはなぜですか?


2
:stackexchangeサイトの下のこのスレッドは、あなたが見ている答え持っている傘stackoverflow.com/questions/7369170/...を。それが役に立てば幸い。

ええ、Pythonに関連していませんが、私の質問は重複しています。
ミスト

ctrl-zと入力すると、本当に新しいシェルプロンプトが表示catされるだけですか、それとも停止されたというメッセージが表示されますか?
マークプロトニック

質問を更新します
ミスト

回答:


30

Unixでは、読み取りと書き込みが可能なほとんどのオブジェクト(通常のファイル、パイプ、ターミナル、rawディスクドライブ)はすべてファイルに似せて作られています。

次のようなcat標準入力から読み取るようなプログラム:

n = read(0, buffer, 512);

512バイトを要求します。n実際に読み取られたバイト数、またはエラーがある場合は-1です。

これを通常のファイルで繰り返し実行すると、512バイトの読み取りが大量に行われ、ファイルの末尾で多少短い読み取りが行われ、ファイルの末尾を超えて読み取ろうとすると0になります。したがって、<= 0 にcatなるまで実行されnます。

端末からの読み取りはわずかに異なります。Enterキーで終了する行を入力すると、readその行だけが返されます。

入力できるいくつかの特殊文字があります。1つはCtrl-Dです。これを入力すると、オペレーティングシステムは、入力した現在の行すべて(Ctrl-D読み取りではない)を読み取りを行うプログラムに送信します。そして、これは偶然のことです:Ctrl-D行の最初の文字である場合、プログラムには長さ0の行が送信されます-プログラムがちょうど普通のファイルの終わりに到達したかどうかを見るように。通常のファイルから読み取るか、端末から読み取るかに関係なく、cat 別のことを行う必要はありません

もう1つの特殊文字はCtrl-Zです。行のどこかに入力すると、オペレーティングシステムはその時点までに入力したものをすべて破棄し、プログラムにSIGTSTPシグナルを送信します。SIGTSTPシグナルは通常、プログラムを停止(一時停止)し、制御をシェルに返します。

あなたの例では

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

破棄された文字を入力した後cat、出力ファイルに何も書き込まずに停止しました。

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

1行で入力しcat、出力ファイルの読み取りと書き込みを行った後、Ctrl-Z停止しましたcat


1
これらのことは正規モード端末にのみ当てはまります。そしてその場合でも、それらは変更することができます。
mikeserv

@mikeservそれは本当です。ここで、私はOPが見ているものだけを説明したかった。また、raw / -icanonターミナルモード、その他の特殊文字、カスタマイズ方法、OSによる違いなどについても説明することを検討しましたが、あまり長く答えたくありませんでした。
マークプロトニック

上記のことは、入力が通過しなかった場合cat、キーボードからデータを読み取り、最初に停止しなかったプログラムがreadゼロを生成したことを意味し、コントロール-Dの必要数はプログラムが実行されたと判断するために必要な連続したゼロの数
supercat

@supercatプログラムは、必要に応じて読み続けることができます。ではex、エディタ、あなたが行の最初の文字、エディタショーあなたのプログラムの数行ではなく、出て行くよう制御-Dを入力した場合。(exおよびでvi、Control-Dは「down」のニーモニックです)。また、多くのシェルでは、Control-Dを入力してもバックグラウンドでジョブが実行されている場合、シェルは終了するのではなくこれを通知しますが、Control-Dを再度入力すると、シェルは本当に終了することを決定し、そうします。
マークプロトニック

@MarkPlotnick:これらのゼロバイトのしゃっくりをパイプ経由で送信する方法はありますか?
supercat

19

だからですCtrl+はDハックです。

深く、Ctrl+ Deof文字と呼ばれるにもかかわらず)は実際にはファイルの終わりを意味するものではありません。「保留中の入力を今すぐアプリケーションに送信する」という意味です。これは実際にはCtrl+ Meol)の意味に近く、保留中の入力と改行を送信します。

Ctrl+のD直後(つまり、行の先頭)または別の+の後にCtrl+ を押すと、保留中の入力は空になります。したがって、アプリケーションは0バイトの入力を受け取ります。呼び出し、0バイトを読み込むと、ファイルの終わりを示します。MCtrlDread


Ctrl+ を押すZと、保留中の入力は破棄されます。このようなものだけでは、すでに(あるアプリケーションに送信されたcat改行または入力して)Ctrl+をD押す前にCtrl+がZ処理されます。


1
Gilleの回答の1つからのctrl + Dに関する詳細は、ここにあります
ラメシュ

あなたが言ったように、Ctrl-Dはファイルの終わりを意味しません。実際には、Ctrl-DがEOT(テキストの終わり)であるという意味ではありません。
H2ONaCl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.