
私が行った場合
$ cat > file.txt
文章Ctrl- DCtrl-D
質問 1: Enter キーを押さないのに、なぜCtrl-キーをD2 回押す必要があるのですか?
私が行った場合
$ cat > file.txt
パバンプシュッCtrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
$ cat > file.txt
パバンプシュッ
Ctrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
pa bam pshhh
2 回目はなぜ 1 行のファイルになるのでしょうか?
答え1
Unix では、読み書きできるほとんどのオブジェクト (通常のファイル、パイプ、端末、raw ディスク ドライブなど) はすべてファイルに似せて作成されています。
次のようなプログラムはcat
標準入力から次のように読み取ります。
n = read(0, buffer, 512);
512 バイトを要求します。はn
実際に読み取られたバイト数、またはエラーがある場合は -1 です。
これを通常のファイルで繰り返し実行すると、512 バイトの読み取りが多数行われ、次にファイルの末尾でやや短い読み取りが行われ、ファイルの末尾を超えて読み取ろうとすると 0 が返されます。したがって、はis <= 0cat
になるまで実行されます。n
端末からの読み取りは少し異なります。キーで終了する行を入力した後Enter、read
その行だけが返されます。
入力できる特殊文字がいくつかあります。その 1 つは ですCtrl-D。これを入力すると、オペレーティング システムは、入力した現在の行全体 ( 自体は除くCtrl-D) を読み取りを実行するプログラムに送信します。そして、ここで偶然の一致があります。 がCtrl-D行の最初の文字である場合、プログラムには長さ 0 の行が送信されます。これは、通常のファイルの末尾に到達したときにプログラムが確認するのと同じです。cat
何も変える必要はない通常のファイルから読み取る場合でも、端末から読み取る場合でも同じです。
もう一つの特殊文字は ですCtrl-Z。これを行の任意の場所に入力すると、オペレーティング システムはその時点までに入力した内容をすべて破棄し、プログラムに 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
。
答え2
それはCtrl+Dがハックだからです。
心の奥底では、Ctrl+ D(eof
キャラクター) は実際にはファイルの終わりを意味するのではなく、「保留中の入力を今すぐアプリケーションに送信する」という意味です。これは実際には、保留中の入力と改行を送信するCtrl+ M( eol
) の意味に近いです。
+の直後(つまり行の先頭)または別の+の直後にCtrl+を押すと、保留中の入力は空になります。したがって、アプリケーションは0バイトの入力を受け取ります。DCtrlMCtrlDread
呼び出し時に 0 バイトを読み取ると、ファイルの終わりが示されます。
Ctrl+を押すと、保留中の入力は破棄されます。したがって、 +を押す前に改行または+を入力してZアプリケーションにすでに送信されたもの ( ) のみが処理されます。cat
CtrlDCtrlZ