Jika aku melakukan
$ cat > file.txt
teks Ctrl- DCtrl-D
Pertanyaan 1: Jika saya tidak menekan enter, mengapa saya harus menekan Ctrl- Ddua kali?
Jika aku melakukan
$ 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
Mengapa kedua kalinya file dengan 1 baris?
command-line
terminal
cat
kabut
sumber
sumber
cat
dihentikan?Jawaban:
Di Unix, sebagian besar objek yang dapat Anda baca dan tulis - file biasa, pipa, terminal, drive disk mentah - semuanya dibuat menyerupai file.
Program seperti
cat
membaca dari input standarnya seperti ini:yang meminta 512 byte.
n
adalah jumlah byte yang benar-benar dibaca, atau -1 jika ada kesalahan.Jika Anda melakukan ini berulang kali dengan file biasa, Anda akan mendapatkan banyak bacaan 512-byte, kemudian bacaan yang lebih pendek di ujung file, lalu 0 jika Anda mencoba membaca melewati akhir file. Jadi,
cat
akan berjalan hinggan
<= 0.Membaca dari terminal sedikit berbeda. Setelah Anda mengetikkan garis, diakhiri oleh Enterkunci,
read
hanya mengembalikan garis itu.Ada beberapa karakter khusus yang dapat Anda ketik. Satu adalah Ctrl-D. Saat Anda mengetik ini, sistem operasi mengirimkan semua baris saat ini yang telah Anda ketikkan (tetapi bukan Ctrl-Ddirinya sendiri) ke program yang sedang membaca. Dan inilah hal kebetulan: jika Ctrl-Dadalah karakter pertama di telepon, program akan dikirim dengan panjang 0 - seperti program akan melihat apakah hanya sampai di akhir file biasa.
cat
tidak perlu melakukan sesuatu yang berbeda , apakah itu membaca dari file biasa atau terminal.Karakter spesial lainnya adalah Ctrl-Z. Saat Anda mengetiknya, di mana saja dalam satu baris, sistem operasi membuang apa pun yang Anda ketikkan sampai saat itu dan mengirimkan sinyal SIGTSTP ke program, yang biasanya berhenti (berhenti) dan mengembalikan kontrol ke shell.
Jadi, dalam contoh Anda
Anda mengetik beberapa karakter yang dibuang, lalu
cat
dihentikan tanpa menulis apa pun ke file outputnya.Anda mengetikkan satu baris, yang
cat
membaca dan menulis ke file outputnya, dan kemudian Ctrl-Zberhenticat
.sumber
cat
, bahwa program yang membaca data dari keyboard dan tidak berhenti saat pertama kaliread
menghasilkan nol dapat terus berjalan, dan jumlah kontrol-D yang diperlukan akan ditentukan oleh jumlah nol berturut-turut yang diperlukan oleh program untuk memutuskan itu dilakukan?ex
editor, jika Anda mengetikkan kontrol-D sebagai karakter pertama dari sebuah baris, editor menunjukkan kepada Anda beberapa baris program daripada keluar. (Diex
danvi
, Control-D adalah mnemonik untuk "turun"). Dan dengan banyak shell, jika Anda mengetik Control-D tetapi memiliki pekerjaan yang berjalan di latar belakang, shell akan memberitahu Anda tentang hal ini daripada keluar, tetapi jika Anda mengetik Control-D lagi, shell memutuskan bahwa Anda benar-benar ingin keluar dan akan melakukannya.Itu karena Ctrl+ Dadalah hack.
Jauh di lubuk hati, Ctrl+ D(meskipun disebut
eof
karakter ) sebenarnya tidak berarti end-of-file: itu berarti "mengirim input yang tertunda ke aplikasi sekarang". Ini sebenarnya dekat dengan arti Ctrl+ M(eol
), yang mengirimkan input yang tertunda ditambah baris baru.Ketika Anda menekan Ctrl+ Dsegera setelah tanda Ctrl+ M(yaitu di awal baris) atau setelah tanda Ctrl+ lainnya D, input yang tertunda kosong. Dengan demikian aplikasi menerima 0 byte input. Dalam
read
panggilan, membaca 0 byte menandakan akhir file.Saat Anda menekan Ctrl+ Z, input yang tertunda dibuang. Jadi hanya apa yang sudah dikirim ke aplikasi (yaitu
cat
) dengan memasukkan baris baru atau Ctrl+ Dsebelum menekan Ctrl+ Zdiproses.sumber