Mengapa judul bagian halaman manual tidak sepenuhnya dapat diterima?

14

Ini diuji di El Capitan dan di High Sierra rekan, di Terminal standar (bash).

user@hostname ~ $ man ls | grep "BU"
BUGS
user@hostname ~ $ man ls | grep "BUG"
user@hostname ~ $ 
user@hostname ~ $ man ls | grep "IEEE"
     files in order to be compatible with the IEEE Std 1003.2 (``POSIX.2'')
     The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

Untuk memperjelas: "BUGS" adalah judul bagian di halaman manual (dan berbagai lainnya). Untuk judul bagian, grepping tampaknya hanya berfungsi untuk 2 karakter pertama; ini konsisten di beberapa judul bagian yang berbeda yang kami coba. Untuk sisa konten, grepsepertinya berfungsi seperti yang diharapkan.

Saya ssh'd ke kotak Linux rasa non-BSD (Amazon Linux) dan tampaknya tidak menunjukkan perilaku yang sama.

Apa yang terjadi di sini?

Jonathan Merklin
sumber
Ini adalah bagian dari alasan saya benci pria BSD. Ini memformat teks dan menjalankan pager bahkan ketika hasilnya berupa pipa. Dan pager saya vim, jadi Linus melarang saya melakukannya man foo | grep bar, saya mendapatkan pipa non-responsif (dan mungkin terminal kacau untuk boot). : / mandb man , yang biasanya Anda lihat di Linux, lebih masuk akal.
muru
unix.stackexchange.com/questions/371062 juga merupakan pertanyaan MacOS.
JdeBP

Jawaban:

15

Anda dapat melihat apa yang terjadi jika Anda melihat kode mentah di dalam halaman manual. Salah satu cara untuk melakukan ini adalah dengan mengekspor halaman manual ke file dan memeriksa isinya secara langsung:

man ls > man.ls
nano man.ls

Kata "BUGS" sebenarnya terlihat seperti ini di file:

B^HBU^HUG^HGS^HS

Anda akan melihat bahwa tajuk berisi karakter pemformatan, sehingga seluruh kata "BUGS" tidak ada.


Jika Anda ingin mengakses konten plaintext dari halaman manual, Anda dapat menggunakan perintah

man -P cat <thepage>

The -Ppilihan menetapkan pager pada unix lain dan catakan mengabaikan informasi format, memberikan output plaintext. Namun, ini tampaknya tidak berfungsi pada macOS, jadi output membutuhkan col -blangkah manual di dalam pipa:

man ls | col -b | grep BUGS
Scot
sumber
2
Scot terima kasih! Mengarahkan kembali ke file dan membuka editor teks seharusnya menjadi hal pertama yang saya coba. Dengan menggunakan informasi itu, dan informasi dari unix.stackexchange.com/a/15866 (yaitu man ls | col -b | grep "BUGS") saya bisa mendapatkan apa yang saya inginkan.
Jonathan Merklin
7
Holy moly, yang berani adalah era TTY dan mesin tik yang lama, ketik huruf dan backspace dan ketik lagi surat itu, tahu mereka tidak akan berbaris dengan sempurna dan akan menyimpan lebih banyak tinta. Harus ada nroffperintah untuk menerjemahkan itu jika Anda perlu grep - apakah Anda keberatan jika saya memperluas ini dengan cara meneruskan perintah yang benar groffmelalui man?
bmike
@Kroltan +10 dan +10 untuk melakukan scot juga. Itu jauh lebih elegan daripada bagaimana aku tidak berpikir untuk menguliti kucing ini.
bmike
@ Kroltan Hmmm - bagi saya, man -P cat ls | grep BUGSbekerja identik dengan man ls | grep BUGS, keduanya tidak menghasilkan apa-apa.
Scotlandia
1
Untuk sistem manual yang menggunakan GNU roff, memang ada opsi untuk grottymenghentikannya memancarkan sekuens kontrol TTY-37 atau ECMA48.
JdeBP