私が行った場合
$ cat > file.txt
テキストCtrl-DCtrl-D
質問1:Enterキーを押さない場合、なぜ押さなければならないのですか? Ctrl-D 二回?
私が行った場合
$ cat > file.txt
pa bam pshhhCtrl-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行のファイルがあるのはなぜですか?
Unixでは、通常のファイル、パイプ、ターミナル、ローディスクドライブなど、読み書きできるほとんどのオブジェクトは、すべてファイルに似せて作られています。
cat
のようなプログラムは、次のように標準入力から読み取ります。
n = read(0, buffer, 512);
512バイトを要求します。 n
は実際に読み取られたバイト数です。エラーが発生した場合は-1です。
これを通常のファイルで繰り返し行った場合、512バイトの読み取りが大量に行われ、ファイルの最後でやや短い読み取りが行われ、ファイルの最後を超えて読み取ろうとすると0になります。したがって、cat
は、n
が0以下になるまで実行されます。
端末からの読み取りは少し異なります。行を入力した後、 Enter キー、read
はその行だけを返します。
入力できる特殊文字がいくつかあります。一つは 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
cat
が1行で入力し、それを読み取って出力ファイルに書き込んだ後、 Ctrl-Zcat
を停止しました。
それは Ctrl+D ハックです。
深く、 Ctrl+D ( eof
文字 と呼ばれているにもかかわらず)実際にはファイルの終わりを意味するのではなく、「アプリケーションに保留中の入力を今すぐ送信する」という意味です。これは実際には Ctrl+M (eol
)、保留中の入力と改行を送信します。
押すと Ctrl+D 直後 Ctrl+M (つまり、行の先頭)または次々 Ctrl+D、保留中の入力は空です。したがって、アプリケーションは0バイトの入力を受け取ります。 read
呼び出しでは、0バイトを読み取るとファイルの終わりを示します。
押すと Ctrl+Z、保留中の入力は破棄されます。したがって、改行を入力するか、アプリケーションにすでに送信されたもの(cat
)のみ、または Ctrl+D 押す前 Ctrl+Z 処理されます。