Karena sebagian besar dari Anda telah melakukan berkali-kali, nyaman untuk melihat teks panjang menggunakan less
:
some_command | less
Sekarang stdinnya terhubung ke pipa (FIFO). Bagaimana bisa masih membaca perintah seperti naik / turun / keluar?
less
membaca data yang akan ditampilkan dari stdin, dan membaca perintah dari tty. Mereka adalah hal yang berbeda.less
membaca data dari stdin, dan perintah dari tty.Jawaban:
Seperti yang disebutkan oleh William Pursell ,
less
membaca penekanan tombol pengguna dari terminal. Secara eksplisit terbuka/dev/tty
, terminal pengendali; yang memberikannya deskriptor file, terpisah dari input standar, dari mana ia dapat membaca input interaktif pengguna. Secara bersamaan dapat membaca data untuk ditampilkan dari input standar jika diperlukan. (Bisa juga menulis langsung ke terminal jika perlu.)Anda dapat melihat ini terjadi dengan menjalankan
Bergerak di sekitar input, keluar
less
, dan melihat isiless.trace
: Anda akan melihatnya terbuka/dev/tty
, dan membaca dari kedua deskriptor file 0 dan mana yang dikembalikan ketika dibuka/dev/tty
(kemungkinan 3).Ini adalah praktik umum untuk program yang ingin memastikan mereka membaca dan menulis ke terminal. Salah satu contohnya adalah SSH, misalnya ketika meminta kata sandi atau frasa sandi.
Seperti yang dijelaskan oleh schily , jika
/dev/tty
tidak dapat dibuka,less
akan membaca dari kesalahan standarnya (file descriptor 2).less
Penggunaan/dev/tty
diperkenalkan pada versi 177, dirilis pada 2 April 1991.Jika Anda mencoba berlari
cat /dev/tty | less
, seperti yang disarankan oleh Hagen von Eitzen ,less
akan berhasil membuka/dev/tty
tetapi tidak akan mendapatkan masukan dari itu sampaicat
menutupnya. Jadi Anda akan melihat layar kosong, dan tidak ada yang lain sampai Anda menekan CtrlCuntuk membunuhcat
(atau membunuhnya dengan cara lain); makaless
akan ditampilkan apa pun yang Anda ketikkan saatcat
sedang berjalan, dan memungkinkan Anda untuk mengontrolnya.sumber
cat blah |
dapat digantikan oleh< blah
, dan bahkan itu tidak perlu dalam hal ini karenaless blah
berfungsi juga (well,less -f /dev/tty
). Tetapi membaca dari/dev/tty
adalah sedikit kasus khusus, dan ketiga varian (cat /dev/tty | less
,less < /dev/tty
danless -f /dev/tty
) menghasilkan hasil yang berbeda./dev/tty
dan/dev/pts/...
.UNIX memberikan dua metode untuk membaca input pengguna sementara stdin telah diarahkan:
Metode aslinya adalah membaca dari stderr . Stderr terbuka untuk menulis dan membaca dan ini masih disebutkan dalam POSIX.
Versi UNIX kemudian (sekitar 1979) menambahkan
/dev/tty
antarmuka driver yang memungkinkan untuk membuka tty mengendalikan proses. Karena ada proses tanpa kontrol tty, ada kemungkinan bahwa upaya untuk membuka/dev/tty
gagal. Oleh karena itu, perangkat lunak tertulis yang ramah memiliki fallback ke metode asli dan kemudian mencoba membaca dari stderr.sumber
dup()
lisensi dari deskripsi file yang sama, meskipun, semua dibuka pada tty. (Rupanya POSIX masih membutuhkan atau menyarankan (jawaban ini tidak mengatakan) bahwa stderr menjadi baca / tulis FD, tidak dibuka dengan sesuatu sepertiopen("/dev/ttyS0", O_WRONLY)
. Membaca stderr akan gagal dalam kasus itu.)