Mungkin ini sudah dijawab sebelumnya, saya akan menyambut tautan ke jawaban lain ...
Jika saya menjalankan perintah shell (di bash
shell) seperti berikut:
make
Kemudian ketika output dari make
sedang bergulir dari STDOUT
dari make
perintah, jika saya mengetik make check
dan tekan entersebelum perintah pertama selesai dieksekusi, ketika make
perintah akhirnya selesai, perintah selanjutnya make check
akan mengambil yang benar dan berjalan.
Pertanyaan saya sederhana:
- Apakah ini berbahaya untuk dilakukan?
- Adakah potensi perilaku tak terduga dari pengetikan terburu-buru semacam ini?
- Mengapa ini bekerja seperti itu?
Jawaban:
Ini berfungsi seperti itu karena Unix adalah full-duplex. Seperti yang dikatakan Ritchie dalam The UNIX Time-sharing System: A Retrospective :
[kutipan akhir]
Yang sedang berkata, ada beberapa program modern yang memakan atau membuang semua jenis huruf;
ssh
danapt-get
dua contoh. Jika Anda mengetik di depan saat sedang berjalan, Anda mungkin menemukan bahwa bagian pertama dari input Anda telah menghilang. Bisa dibayangkan itu bisa menjadi masalah.sumber
bash
fork()
s danexec
s perintah, apakah perintah pertama masih melekatSTDIN
pada bash shell? Kedengarannya seperti jawabannya tidak, bash sepertinya menjadi buffering untuk perintah selanjutnya. Apakah itu benar?&
.STDIN
ditangani secara fifo? Dan saya mengira bahwa kecuali proses anak dari bash secara eksplisit menutup pegangan file yang diwarisiSTDIN
maka masih bisa membaca dari mengetik tambahan?Perilaku dasar yang Anda lihat adalah bahwa input duduk di buffer di suatu tempat sampai terbaca (yah, jika Anda mengetik cukup, akhirnya buffer akan terisi, dan sesuatu akan hilang, itu akan banyak mengetik). Sebagian besar hal yang dijalankan oleh make tidak dibaca dari STDIN, sehingga tetap dalam buffer.
Bahayanya adalah bahwa perintah yang salah membaca input Anda. Misalnya,
make
memanggil sesuatu yang memutuskan untuk meminta Anda, dan kemudian mungkin membaca perintah Anda berikutnya sebagai jawaban. Betapa berbahayanya itu tergantung pada perintah, tentu saja. (Mereka mungkin juga menyiram semua input terlebih dahulu, hanya membuang input Anda sebelumnya.)Satu perintah, yang biasa digunakan dalam Makefiles, yang mungkin melakukannya adalah TeX. Jika menemui kesalahan (dan belum diberi bendera untuk tidak pernah meminta pengguna), itu akan menanyakan bagaimana Anda ingin melanjutkan.
Sebuah pilihan yang lebih baik mungkin untuk menjalankan:
make && make check
.sumber
make
, dalam contoh Anda) telah selesai dengan sukses. Misalnya,make foo
Enter>./foo
Enter bisa menimbulkan masalah. Anda mungkin ingin mencoba membiasakan mengetik sepertimake && make check
, di mana perintah kedua hanya akan dijalankan jika yang pertama berhasil.make check
, Anda akhirnya akan mengeksekusi perintahheck
, yang mungkin tidak ada pada sistem Anda (tetapi mungkin sesuatu yang buruk). Jika perintah pertama adalah sesuatu yang jinak yang Anda tahu dan percayai, saya tidak langsung melihat masalah.sumber
ls
danmount
misalnya. Saya mencoba memahami bagaimana input buffered ditangani. Terima kasih atas jawabannya.