もし私がするなら
$ cat > file.txt
テキスト - -CtrlDCtrlD
Q1: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になるcat
まで実行されます。n
端末で読むのは少し異なります。行を入力すると、Enterキー押下が終了し、read
その行のみが返されます。
一部の特殊文字を入力できます。一つはCtrl-D。このコマンドを入力すると、オペレーティングシステムは、ユーザーがCtrl-D入力したすべての現在の行(それ自体ではない)を読み取りを実行するプログラムに送信します。これは日常的なことです。それがCtrl-D行の最初の文字であれば、プログラムは長さゼロの行に送られます - プログラムがそれが通常のファイルの終わりに達したことを確認するのと同じです。cat
別のことをする必要はありません、通常のファイルから読み込んだり、端末から読んだりしても構いません。
別の特殊文字はですCtrl-Z。 1行の任意の場所に入力すると、オペレーティングシステムは以前に入力した内容をすべて破棄し、プログラムに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
ファイルを読み書きして停止Ctrl-Zしますcat
。
答え2
Ctrl+Dがハッキングだからです。
Deep down, Ctrl+ D(呼び出されてもeof
特徴)は実際にはファイルの終わりを意味しません。これは、「保留中の入力をアプリケーションにただちに送信する」ことを意味します。これは、実際に待機している入力と改行文字を送信するCtrl+ M()の意味に近いです。eol
+の直後(つまり行の先頭)または別の+を押すと、保留中のCtrl入力は空になります。したがって、アプリケーションはゼロバイトの入力を受け取ります。中DCtrlMCtrlDread
呼び出し時にゼロバイトを読み取ると、ファイルの終わりを示します。
Ctrl+を押すと保留Z中の入力が削除されます。したがって、+を押すか、+がアプリケーションに送信されるcat
前に入力された改行文字のみが処理されます。CtrlDCtrlZ