GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana `less` Mengambil Data Dari Stdin Sementara Masih Dapat Membaca Perintah Dari Pengguna?

Seperti kebanyakan dari Anda telah melakukannya berkali-kali, akan lebih mudah untuk melihat teks panjang menggunakan less :

some_command | less

Sekarang stdinnya terhubung ke pipa (FIFO). Bagaimana itu masih bisa membaca perintah seperti atas/bawah/keluar?

Jawaban yang Diterima:

Seperti yang disebutkan oleh William Pursell, less membaca penekanan tombol pengguna dari terminal. Ini secara eksplisit membuka /dev/tty , terminal pengontrol; yang memberinya deskriptor file, terpisah dari input standar, dari mana ia dapat membaca input interaktif pengguna. Itu dapat secara bersamaan membaca data untuk ditampilkan dari input standarnya jika perlu. (Bisa juga menulis langsung ke terminal jika perlu.)

Anda dapat melihat ini terjadi dengan menjalankan

some_command | strace -o less.trace -e open,read,write less

Bergerak di sekitar input, keluar dari less , dan lihat isi less.trace :Anda akan melihatnya membuka /dev/tty , dan membaca dari kedua file deskriptor 0 dan yang mana saja yang dikembalikan ketika dibuka /dev/tty (kemungkinan 3).

Ini adalah praktik umum untuk program yang ingin memastikan mereka membaca dari dan menulis ke terminal. Salah satu contohnya adalah SSH, mis. ketika meminta kata sandi atau frasa sandi.

Seperti yang dijelaskan oleh schily, if /dev/tty tidak bisa dibuka, less akan membaca dari kesalahan standarnya (deskriptor file 2). less penggunaan /dev/tty diperkenalkan dalam versi 177, dirilis pada 2 April 1991.

Jika Anda mencoba menjalankan cat /dev/tty | less , seperti yang disarankan oleh Hagen von Eitzen, less akan berhasil membuka /dev/tty tetapi tidak akan mendapatkan masukan apa pun darinya sampai cat menutupnya. Jadi Anda akan melihat layar kosong, dan tidak ada yang lain sampai Anda menekan Ctrl C untuk membunuh cat (atau membunuhnya dengan cara lain); lalu less akan menampilkan apa pun yang Anda ketik saat cat sedang berjalan, dan memungkinkan Anda untuk mengontrolnya.


Linux
  1. Cara membuat kata sandi acak di linux menggunakan /dev/random

  2. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  3. Linux – Bagaimana Symlink /proc//exe Berbeda Dari Symlink Biasa?

  1. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  2. Linux – Apa Arti Huruf 'u' Di /dev/urandom?

  3. Cara memetakan perangkat /dev/sdX dan /dev/mapper/mpathY dari perangkat /dev/dm-Z

  1. Bagaimana cara menyandikan base64 /dev/random atau /dev/urandom?

  2. Bagaimana Anda menukar/dev/sda dengan/dev/sdb?

  3. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?