Kurang mengganggu dalam lebih sedikit

13

Saya sering menyalurkan output program menjadi lebih sedikit, mis

produce_output | less

Ini bekerja dengan baik, hingga produce_outputmenghasilkan sejumlah besar output. Jika saya mencari beberapa teks yang jauh ke dalam file, kurangi laporan

Calculating line numbers... (interrupt to abort)

Jika saya menyela dengan Control + C, itu juga membunuh produce_output, yang menghentikannya dari menghasilkan output lebih lanjut. Apakah ada cara untuk mengirim interupsi menjadi lebih sedikit, sehingga produce_outputterus berjalan?

Saya tahu saya bisa menggunakannya kill -INT less_process, tetapi saya pikir harus ada solusi yang lebih baik.

Ed McMan
sumber

Jawaban:

15

Biasanya semua proses dalam pipa berjalan dalam grup proses yang sama , menyebabkan semuanya menerima sinyal. Anda dapat menggunakan setsid foo | lessuntuk menjalankan foodi pgrp yang berbeda

pengguna1686
sumber
Melihat masalah yang diangkat oleh OP, tampaknya keputusan untuk menggunakan CTRL + C sebagai cara untuk mengurangi interupsi sangat disayangkan. Apakah Anda tahu mengapa sinyal khusus ini dipilih? Apakah ada sinyal lain yang tidak terlalu bermasalah?
Piotr Dobrogost
@PiotrDobrogost: Sinyal apa lagi yang akan Anda sarankan? Tidak banyak yang memiliki cara pintas keyboard khusus, hanya SIGINT (Ctrl-C) dan SIGQUIT (Ctrl- \), dan yang terakhir dimaksudkan untuk keluar dari program segera, tidak hanya mengganggu. Sisanya hanya tersedia melalui kill.
user1686
Tampaknya masalah ini disebabkan oleh penggunaan sinyal yang lebih sedikit mengganggu. Sebagai gantinya, jika itu adalah beberapa tombol / jalan pintas yang normal, kami tidak akan memiliki masalah sejak awal. Namun saya kira kebutuhan untuk sinyal berasal dari fakta bahwa proses tidak dapat digunakan selectuntuk menunggu input baik dari file / pipa dan terminal secara bersamaan.
Piotr Dobrogost
@PiotrDobrogost: Bisa, begitulah Fmode (ikuti) bekerja. Pipa dan tyys dapat dipolusi dengan cara yang sama.
user1686
Mengapa menurut Anda cara kerja mode ikuti? Saya pikir alur peristiwa adalah bahwa shell mendapat CTRL + C dan mengirimkan sinyal SIGINT ke kurang yang mendapatkan sinyal ini secara sinkron tanpa mendengarkan keyboard / terminal.
Piotr Dobrogost
9

Anda dapat menonaktifkan nomor baris dengan

   -n or --line-numbers

pilihan.

produce_output | less -n
Matteo
sumber
-1: dapat menyelesaikan masalah pemicu OP, tetapi tidak melakukan apa pun untuk menjawab pertanyaan aktual OP (yaitu, mengganggu proses).
goldPseudo
2
Maaf tetapi memulai lebih sedikit dengan fitur yang tidak diinginkan dan kemudian mencoba mengirim sinyal untuk menonaktifkan fitur yang dapat Anda nonaktifkan dengan sakelar adalah solusi dan bukan solusi. Tentu saja solusi @grawity bagus (dan saya memilihnya) tetapi ayolah: memulai proses pertama dalam grup lain untuk dapat mengirim sinyal untuk mengganggu tugas (penghitungan baris) yang tidak diperlukan benar-benar sedikit terlalu banyak kerjaan.
Matteo
1
Ini adalah solusi yang adil untuk masalah yang saya ajukan dalam pertanyaan saya. Namun, interupsi berhenti lebih dari sekedar penghitungan baris dalam waktu kurang - misalnya, mereka akan mengganggu pencarian yang panjang juga. Jadi, solusi @ grawity lebih disukai, karena itu akan mencakup setiap penggunaan interupsi dalam waktu kurang. Buruk saya karena tidak membahas ini dengan lebih jelas dalam pertanyaan!
Ed McMan
@ EdMcMan Tentu saya juga memilih solusi gravitasi dan saya senang mempelajari sesuatu yang baru yang selalu berguna.
Matteo
0

Dalam bekerja dengan sejumlah besar output, saya merasa sangat membantu untuk mengirim output ke file dan menggunakan tail -fatau less +Fmenonton, misalnya:

produce_output > out 2>&1 & less +F out

The 2>&1sintaks memastikan bahwa kedua stdout dan stderr pergi ke out--- menghapus bahwa jika Anda hanya ingin stdout akan file. Dengan cara ini, Anda dapat memeriksa output dengan berbagai cara (bahkan dari mesin yang berbeda) tanpa harus mengacaukan program yang memproduksi output.

Catatan yang 2>&1mungkin spesifik untuk bash (saya tidak yakin). Pastikan Anda memiliki ruang disk yang cukup untuk file output :-)

Jeannie
sumber
Tail hanya akan menunjukkan file itu kepada Anda, Ed menetapkan bahwa ia menggunakan kurang interaktif (misalnya, ia harus mencari dalam file)
Matteo
2>&1adalah POSIX, telanjang >&adalah bashism.
user1686
FWIW, 2> & 1 juga berfungsi pada Windows XP, 7, 2008, dll.
jftuga
@ Matteo: ya, saya seharusnya menggunakan less +Fcontoh saya; Saya baru saja memperbarui jawaban saya.
jrennie
1
@ Matteo: Penghitungan baris tidak masalah yang sama less +F(karena less +Fmemproses data seperti yang dihasilkan). Contoh yang saya berikan tidak memiliki masalah yang sama seperti aslinya diposting: ctrl + c tidak akan mengganggu process_output. Jika salah satu tidak peduli untuk fungsi 'mengikuti', salah satu dapat berjalan produce_output > out 2>&1, maka less out. Masalahnya produce_output | lessadalah jika ada sesuatu yang merusak pipa (mis. Tidak sengaja mengenai 'q' dari less), maka produce_outputakan mati (tanpa penanganan SIGPIPE khusus).
jrennie
0

Anda juga bisa melakukan ini:

less +F -f <(produce_output)
Eric Woodruff
sumber