Tại sao tiêu đề phần của trang người đàn ông hoàn toàn có thể greppable?


14

Điều này đã được thử nghiệm ở El Capitan và ở High Sierra của một đồng nghiệp, trong Terminal (bash) tiêu chuẩn.

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'').

Để làm rõ: "BUGS" là một tiêu đề của phần đó (và nhiều trang khác). Đối với tiêu đề phần, grepping dường như chỉ hoạt động cho 2 ký tự đầu tiên; điều này phù hợp với một vài tiêu đề phần khác nhau mà chúng tôi đã thử. Đối với phần còn lại của nội dung, grepdường như hoạt động như mong đợi.

Tôi đã đưa vào một hộp Linux không có hương vị BSD (Amazon Linux) và nó dường như không thể hiện hành vi tương tự.

Những gì đang xảy ra ở đây?


Đây là một phần lý do tôi ghét người đàn ông BSD. Nó định dạng văn bản và chạy máy nhắn tin ngay cả khi đầu ra của nó là một đường ống. Và máy nhắn tin của tôi là vim, vì vậy Linus đã cấm tôi từng làm man foo | grep bar, tôi nhận được một đường ống không phản hồi (và có thể là một thiết bị đầu cuối lộn xộn để khởi động). : / mandb man , đó là những gì bạn thường thấy trên Linux, hợp lý hơn.
muru

unix.stackexchange.com/questions/371062 cũng là một câu hỏi MacOS.
JdeBP

Câu trả lời:


15

Bạn có thể thấy những gì đang xảy ra nếu bạn xem mã thô trong trang man. Một cách để làm điều này là xuất trang man sang tệp và kiểm tra trực tiếp nội dung của nó:

man ls > man.ls
nano man.ls

Từ "BUGS" thực sự trông như thế này trong tệp:

B^HBU^HUG^HGS^HS

Bạn sẽ thấy rằng các tiêu đề chứa các ký tự định dạng, vì vậy toàn bộ từ "BUGS" không xuất hiện.


Nếu bạn muốn truy cập nội dung văn bản gốc của trang thủ công, bạn có thể sử dụng lệnh

man -P cat <thepage>

Các -Ptùy chọn thiết lập pager trên unix khác và catsẽ bỏ qua các thông tin định dạng, đưa ra một sản lượng plaintext. Tuy nhiên, điều này dường như không hoạt động trên macOS, vì vậy đầu ra cần một col -bbước thủ công trong đường ống:

man ls | col -b | grep BUGS

2
Cảm ơn Scot! Chuyển hướng đến một tệp và mở trong trình soạn thảo văn bản nên là điều đầu tiên tôi thử. Sử dụng thông tin đó và thông tin từ unix.stackexchange.com/a/15866 (tức là man ls | col -b | grep "BUGS") tôi đã có thể nhận được những gì tôi muốn.
Jonathan Merklin

7
Holy moly, in đậm là thời đại TTY và máy đánh chữ cũ, gõ một chữ cái và backspace và gõ lại chữ cái, biết rằng chúng sẽ không xếp hàng hoàn hảo và sẽ gửi thêm mực. Phải có một nrofflệnh để dịch rằng nếu bạn cần grep - bạn có phiền nếu tôi mở rộng điều này với cách truyền lệnh chính xác để groffthông qua mankhông?
bmike

@Kroltan +10 và +10 để scot là tốt. Điều đó thanh lịch hơn nhiều so với cách tôi không nghĩ đến việc lột da con mèo đặc biệt này.
bmike

@Kroltan Hmmm - đối với tôi, man -P cat ls | grep BUGShoạt động giống hệt nhau man ls | grep BUGS, cả hai đều không trả lại gì.
Scot

1
Đối với các hệ thống thủ công sử dụng GNU roff, thực sự có các tùy chọn grottysẽ ngăn không cho nó phát ra các chuỗi điều khiển TTY-37 hoặc ECMA48.
JdeBP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.