Ketika saya menggunakan saya, less file1 file2
saya mendapatkan kedua file yang ditampilkan di "less buffer viewer", tetapi less file1 file2 | cat
mencetak konten dari kedua file ditambahkan ke stdout. Bagaimana sedikit yang tahu jika harus menunjukkan "less buffer viewer" atau menghasilkan output ke stdout untuk perintah selanjutnya? Mekanisme apa yang digunakan untuk melakukan ini?
21
bash script.sh
,bash script.sh | cat
,bash script.sh > file
, dan melihat apa output yang Anda dapatkan.stdout
bukan sesuatu yang bisa "ditulis ke file". Itu adalah sesuatu yangwrite()
harus Anda lakukan .less
tidak harus melakukan sesuatu yang berbeda tergantung pada apakah outputnya berupa file, pipa, soket, atau perangkat blok, atau apa pun. Itu hanya masalah bahwa itu bukan tty, jadi itu hanya berperilaku seperticat
. (Saya berasumsi Anda tahu ini dan hanya memilih kata-kata yang salah untuk menjelaskannya, tetapi saya pikir saya akan menunjukkan ini untuk pembaca lain).less
jangan "mencari tahu" itucat
selanjutnya. Berperilaku seperticat
apa pun yang terjadi selanjutnya, jika stdout bukan tty.less
akan terus maju dan menggunakan satu TCGETS untuk mendapatkan dimensi terminal atau menemukan bahwa itu bukan tty, tetapi ternyata saya menebak salah.less
memeriksa apakahstdout
ini terminal, dan berperilaku seperticat
ketika tidak (salinan stdin ke stdout sampai EOF).Fitur ini memungkinkan Anda menulis skrip atau program yang selalu mengirimkan output mereka (mis.
--help
Output) melaluiless
sementara masih memungkinkan pengalihan mudah ke file. Akan menyebalkan jikasome_command --fullhelp > help.txt
masih menunggu spasi-stdin di halaman melalui teks, atau sesuatu. Beberapa perintah (misalnyaman
) memeriksa output mereka sendiri untuk memutuskan apakah akan mengirim output mereka melalui pager atau tidak. Jika Anda menjalankanman ls > ls.txt
, itu tidak pernah memanggil Anda$PAGER
.less
Perilaku seperti kucing berguna jika Anda lupa mengeditnya dari satu-liner saat menambahkan lebih banyak tahapan ke saluran pipa.less
perlu mengetahui dimensi terminal (ukuran layar, untuk mengetahui berapa banyak garis yang harus ditampilkan sekaligus). Theioctl(2)
menggunakan distdout
akan kembali ENOTTY pada non-terminal, sehingga tidak dapat menghindari penanganan kasus non-terminal pula.less
sebenarnya menggunakanisatty(3)
sebelum memeriksa dimensi terminal, tetapiisatty
bekerja dengan mencoba ioctl hanya tty dan memeriksa kurangnya kesalahan.Bahkan pager sederhana seperti
more(1)
(setidaknya versi util-linux) memiliki fitur ini, karena itu mungkin perilaku waras paling sederhana untuk diterapkan pada kasus itu.Perhatikan bahwa ketika Anda menyalurkan sesuatu ke
less
(misalnyagrep foo bar.txt | less
), itu memang harus terbuka/dev/tty
untuk input keyboard. (Anda dapat melihatnya melakukan ini denganecho foo | strace less
).sumber