Đọc và tìm kiếm các trang dài


32

Tôi cuối cùng đã chán ngấy khi muốn đọc về bash 's readvà nó -stùy chọn với man bash. Cuối cùng tôi đã tìm đúng vị trí (khoảng 4500), nhưng đó là một sự bực bội như thường lệ, vì cả hai /readvà thậm chí /\s-s\scác tìm kiếm có quá nhiều trận đấu.

Vì vậy, câu hỏi là: Làm thế nào tôi có thể đọc các trang dài một cách hiệu quả, hoặc có được thông tin tương tự theo các cách khác, cục bộ ? Như một ví dụ cụ thể, làm thế nào để tiếp cận các tài liệu liên quan sau khi nhìn thấy read -s pwdtrong một tập lệnh shell? Một câu trả lời tốt có thể là một đoạn mã shell, hoặc gợi ý về một số công cụ và cách sử dụng nó, hoặc một cái gì đó hoàn toàn khác, miễn là nó giúp tìm đúng vị trí để đọc.

Lưu ý: Tôi không gắn thẻ với vì tôi muốn câu hỏi liên quan đến việc đọc trang của người đàn ông nói chung, mặc dù đó hoàn toàn có thể là trang người đàn ông hài hước thường gặp nhất.


Tôi không đặt câu trả lời này vì nó có thể nằm ngoài yêu cầu của bạn nhưng: khi tôi cần đọc một mantrang dài, tôi sử dụng một đoạn script nhỏ để lại trên bảng điều khiển phía trên. yuugian.com/demo/gkman.txt Chia sẻ và thưởng thức
Yuugian

Tôi cũng không đặt câu hỏi này như một câu trả lời;) bởi vì nó thực sự là về bashchính nó: giống như bạn, tôi cũng rất cần SHELL BUILTINSphần hướng dẫn sử dụng, nằm ở khoảng 3500 . Vì vậy, biết điều này, lần sau tôi sẽ chỉ nói man bashvà sau đó giảm 66 phần trăm, bằng cách gõ 66%, sau đó một vài lần PGDn và tôi ở đó. Mặc dù tôi đã chọn 66 vì nó có thể được ghi nhớ là "Tuyến 66" , nhưng thực tế nó còn hơn thế một chút, mặc dù không dễ để ghi nhớ trừ khi đó là đầu điện thoại của bạn, v.v. :) Ít nhất là "Tuyến 66 "Là phổ quát và được biết đến trên toàn thế giới.
cú pháp

Câu trả lời:


33

Để nhanh chóng nhận trợ giúp về nội dung Bash, hãy sử dụng help:

help read

là những gì bạn muốn.

Đối với định dạng giống như trang con người, hãy sử dụng

help -m read

hoặc, thậm chí tốt hơn,

help -m read | less

Nếu bạn vẫn khăng khăng tìm kiếm nó trong trang man, tôi thấy điều nhanh chóng đưa tôi đến lời giải thích của lệnh là

/^\s*read [[]

Điều này hoạt động bởi vì khi một lệnh được giải thích lần đầu tiên, tên của nó được thụt vào một chút từ đầu dòng. Trong trường hợp cụ thể read, việc này sẽ mất một chút trình duyệt trước khi bạn đến readtài liệu thực tế bởi vì (vì lý do rõ ràng) từ "đọc" được lặp lại rất nhiều trong trang man. [[] Có nghĩa là khớp với [thường đi trước các tham số tùy chọn. (Tôi thường bỏ qua / ^ \ s * và chỉ cần thực hiện / <lệnh tích hợp> [[])

Một cách khác

Nếu bạn không quan tâm đến việc thay đổi định dạng, bạn có thể chuyển đổi trang người dùng của mình sang tệp DVI hoặc PDF:

man -T dvi bash >bash.dvi

hoặc là

man -T ps bash | ps2pdf - bash.pdf # Requires the Ghostscript suite for ps2pdf

Tất nhiên, được cung cấp một tài liệu DVI hoặc PDF, sau đó bạn có thể thực hiện tìm kiếm văn bản một cách dễ dàng.


Hmm, helpthật tuyệt, tôi tự hỏi làm thế nào tôi chưa bao giờ nghe về nó ... nó ps2pdfkhông hữu ích vì nó không thể (rõ ràng) tạo ra bất kỳ loại nào.
hyde

@hyde Không chắc ý của bạn là gì khi tạo chỉ mục, nhưng bạn đã nghe nói về ptx chưa?
Joseph R.

Mục lục hoặc Mục lục, "ptx" nghe giống hệt như ý tôi.
hyde

1
Một cách khác, thậm chí đơn giản hơn là làm 'man bash> bashman.txt'. Sau đó, bạn có thể chỉ cần mở bashman.txt trong cửa sổ (khác) trong trình soạn thảo văn bản của mình và sử dụng tất cả các lệnh của nó để tìm những gì bạn muốn. Bạn thậm chí có thể chỉnh sửa tệp để thêm thẻ cho các phần bạn đề cập thường xuyên nhất. Làm bashman.txt chỉ đọc giúp bạn không vô tình sửa đổi nó trong trình chỉnh sửa của mình.
Joe

Bạn cũng có thể mở các trang man trong trình duyệt bạn chọn và sử dụng tất cả các công cụ của nó. Xem Askubfox.com/questions/339255/ trên
Joe

9

Cách tiếp cận 1

man bashsau /read \[đó/-s

Cách tiếp cận 2

Bạn có thể thử một công cụ nguồn mở để giải thích các đối số dòng lệnh được gọi là explshell .

Nó có thể được sử dụng tại địa phương. Đọc tài liệu trên https://github.com/idank/explainshell

Hãy cẩn thận: Thường hoạt động, nhưng chỉ với các lệnh được tìm thấy trong kho lưu trữ trang của Ubuntu

Trong trường hợp của bạn, nó không thể nhận ra -schuyển đổi trong read -s pwd.

Cách tiếp cận 3

Tôi đã tìm thấy một công cụ khác có vẻ đầy hứa hẹn nhưng nó không hoạt động trên hệ thống của tôi.

giải thích: Tài liệu ngắn cho các lệnh Unix


Với cách tiếp cận 1, bạn có thể làm /-s\bđể tránh các lượt truy cập như --some-other-command(trong khi vẫn tìm thấy các chuỗi như -s,, bạn sẽ không nhận được nếu bạn tìm kiếm /-svới một khoảng trắng).
David Knipe

8

Những gì tôi thường làm trong trường hợp này chỉ là chạy man, tìm kiếm SHELL BUILTIN COMMANDStiêu đề, sau đó tìm kiếm nội dung, nghĩa là

man bash
/^SHELL BUILTIN
/  read 

tuy nhiên, trong bash bạn có thể làm

help read

hoặc, tùy thuộc vào hệ thống, một trong hai

man 1 read
man bash-builtins

Nói chung, tôi có một kịch bản gọi là he("trợ giúp ngắn") để làm điều này. Bạn sẽ chạy nó như thế này:

he bash read

FYI, tôi đổi tên descđể he. github.com/mikelward/scripts/blob/master/he
Mikel

3

Không có cách chung để tìm thông tin trong trang nam, bất kỳ cách nào khác ngoài cách tìm thông tin chung trong sách. Nó phụ thuộc vào những gì bạn đang tìm kiếm.

Khi bạn đang tìm kiếm thông tin về nội dung được tích hợp sẵn, bạn có thể tìm kiếm nội dung ở đầu dòng lưu để thụt lề và theo sau là khoảng trắng: tìm kiếm ^ *read␣(ví dụ: loại /^ *read␣ Enter) ( là khoảng trắng). Điều này hoạt động với dash, pdksh, mksh và bash. Trang người đàn ông của Zsh bị chia tách nên bạn cần đọc zshbuiltinstrang người đàn ông. Ksh93 có các ký hiệu đặc biệt trước tên của một số nội trang, bạn cần tìm kiếm ^ *†*␣trong UTF-8 hoặc ^ *-*␣ASCII. Có một vài điểm tích cực sai nhưng điều này sẽ giúp bạn nhanh chóng đi đúng hướng. Tìm kiếm để ^ *read($| [-[])giảm số lượng dương tính giả.

Bạn có thể tăng tốc tìm kiếm bằng cách nói với máy nhắn tin của bạn nơi bạn muốn đi. Ví dụ: PAGER='less "+/^ *read \["' man bashmở trang bash man trên phần mô tả của readnội dung. Bạn có thể làm cho điều này một chức năng:

man-builtin () {
  PAGER="less '+/^ *$1(\$|\\[|-)'" man ${SHELL##*/}
}

Trong mkshtrang chủ, / read (hai khoảng trắng, tên lệnh, một khoảng trắng) thường tìm đúng vị trí (đây là một mẹo tôi tự sử dụng và nhanh chóng gõ). Cảm ơn đã hỏi về nó; Tôi sẽ đặt các tham chiếu riêng biệt (phần nào) cho tất cả các tiện ích có trong mksh trên TODO của tôi.
mirabilos

1
@mirabilos / read có xu hướng có nhiều dương tính giả khi người đàn ông của bạn thực hiện biện minh cho văn bản.
Gilles 'SO- ngừng trở nên xấu xa'

Đã đồng ý. Thậm chí nhiều lý do để thực sự tách ra các tài liệu dựng sẵn.
mirabilos

1

Để chuyển trực tiếp đến phần SHELL BUILTINS THÔNG TIN trên trang bash man, tôi xác định bí danh sau trong $HOME/.bash_aliasestệp của mình .

alias man-builtin="man -P 'less -p ^SHELL\ BUILTIN\ COMMANDS' bash"

0

Chỉ cần cung cấp một lựa chọn khác, nếu bạn thích sử dụng trình duyệt web cho phép bạn dễ dàng tìm kiếm thông qua trang hiện tại, bạn có thể sử dụng một cái gì đó như man.cgi được sử dụng tại freeBSD.org cũng cho phép bạn xem các trang man từ các hệ thống khác nhau để xem cách chúng khác nhau Tôi đã thấy tương tự trên các trang web khác vì vậy mong đợi có những biến thể khác xung quanh.

Liên kết trợ giúp trong apropos cung cấp một số thông tin để có được một bản sao của tập lệnh để đặt trên máy chủ của riêng bạn với các liên kết để tải xuống các bộ sưu tập trang man.


0

Tôi có xung quanh để tạo ra một hàm bash cho mục đích này. Đoạn mã này có thể được ví dụ dán vào cuối ~/.bashrc:

manfind() {
  # required args
  test "$1" -a "$2" || return 1                  

  # create temp file and get its name
  local tmp=$(mktemp /tmp/manfindXXXXXX) || return 1
  ( # subshell for trap
    trap "rm $tmp" EXIT

    # grep all matching lines with line numbers and pipe them to dialog
    if man "$1" |                   # get the whole man page
      grep -n "^\s*$2" |            # grep for the search string, with line nums
      sed 's/:/\n/' |               # replace line num separator with newline for dialog
      cut -c-70  |                  # cut long lines to nice length
      xargs -d'\n' -n 999999 \
        dialog --output-fd 3 --menu "Select line to go to" 0 0 0 3>$tmp -- 1 '(start of man page)'
    then
      # selected line number is now in $tmp, get man page and
      # use vim in read only mode to view it at right line
      man "$1" | vim -R +"$(< $tmp)" -
    else
      # cancel selected from dialog
      exit 1
    fi
  )
}

Bình luận giải thích một chút về những gì nó làm. Chuỗi tìm kiếm mặc định trong các tìm kiếm cụ thể được cung cấp từ đầu dòng, bỏ qua không gian ban đầu. Ví dụ:

# find every line which starts with 'read' followed by space
manfind bash 'read '
# research bash subshells
manfind bash '.*subshell'

Lưu ý: Tập lệnh này không có khái niệm về các phần của trang man ... Tôi sẽ xem liệu sau này tôi có chỉnh sửa điều đó không, nhưng cài đặt MANSECTbiến môi trường của người đàn ông sẽ giúp.


2
Bạn có thể muốn thêm một cái bẫy để dọn sạch tệp tạm thời:trap 'rm -f "$tmp"'
l0b0

1
Điều này có vẻ rất phức tạp. Tôi chưa đọc hết kịch bản của bạn, nhưng sẽ không man "$1" | vim -R - "+/$2"làm điều gì tương tự?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi sẽ đi đến lần đầu tiên $2, nên không.
hyde

@ l0b0 Thay đổi dọn dẹp để sử dụng trap. Tôi đã không tìm thấy một cách rõ ràng để làm điều đó trong một chức năng mà không tạo ra một lớp con.
hyde

@hyde Điều chỉnh regex cho những gì bạn đang làm, tất nhiên. Quan điểm của tôi là về việc sử dụng+/REGEX
Gilles 'SO- ngừng trở nên xấu xa'

0

Kết hợp các phần từ các cuộc thảo luận khác đây là một chức năng nhanh mà bạn có thể để lại trong .bashrcđó sẽ đưa bạn trực tiếp đến phần tích hợp (nếu nó tồn tại). Nếu không, nó sẽ mở mannhư bình thường:

man() {
    case "$(/bin/bash -c 'type -t '"$1")" in 
        builtin)
            LESS=+?"^       $1 " command -p man bash
            ;;
        *)
            command -p man $@
            ;;
    esac
}

0

Từ bất kỳ bản phân phối Linux nào, bạn sẽ có thể sử dụng info bashnếu bạn muốn có các đoạn riêng biệt theo loại hành động trong đó thông tin giống hệt với trang man.

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.