การอ่านและค้นหาหน้ายาว


32

ในที่สุดผมก็เบื่อขึ้นเมื่อต้องการที่จะอ่านเกี่ยวกับทุบตี 's readและมันของตัวเลือกที่มี-s man bashฉันพบจุดที่ถูกต้องในที่สุด (ประมาณเส้น 4500) แต่มันก็น่าผิดหวังตามปกติเนื่องจากทั้งคู่/readและ/\s-s\sการค้นหามีการจับคู่มากเกินไป

ดังนั้นคำถามคือฉันจะอ่านหน้ายาวอย่างมีประสิทธิภาพหรือรับข้อมูลเดียวกันในวิธีอื่น ๆในพื้นที่ได้อย่างไร เป็นตัวอย่างเฉพาะวิธีเข้าถึงเอกสารที่เกี่ยวข้องหลังจากเห็นread -s pwdในเชลล์สคริปต์ คำตอบที่ดีอาจเป็นข้อมูลโค้ดของเชลล์หรือคำแนะนำเกี่ยวกับเครื่องมือและวิธีการใช้งานหรืออย่างอื่นตราบใดที่มันช่วยในการค้นหาจุดที่เหมาะสมในการอ่าน

หมายเหตุ: ฉันไม่ได้ติดแท็กด้วยการเพราะฉันต้องการให้คำถามเกี่ยวกับการอ่านหน้าทั่วไปโดยทั่วไปแม้ว่าอาจเป็นหน้ามนุษย์ที่พบเจอบ่อยที่สุด


ฉันไม่ได้ใส่คำตอบนี้เพราะมันอาจจะเกินความต้องการของคุณ แต่: เมื่อฉันต้องอ่านmanหน้ายาวฉันใช้สคริปต์ตัวเล็ก ๆ ที่ฉันทิ้งไว้บนแผงด้านบนของฉัน yuugian.com/demo/gkman.txt แบ่งปันและเพลิดเพลินกับ
Yuugian

ฉันไม่ได้วางนี้เป็นคำตอบอย่างใดอย่างหนึ่ง;) เพราะมันเป็นเรื่องจริงเกี่ยวกับbashตัวเอง: เช่นเดียวกับคุณผมส่วนใหญ่เกินไปต้องSHELL BUILTINSเป็นส่วนหนึ่งของคู่มือการใช้งานซึ่งเป็นที่เกี่ยวกับสาย3500 ดังนั้นเมื่อรู้สิ่งนี้ในครั้งต่อไปที่ฉันจะพูดman bashแล้วก็ลดลง 66 เปอร์เซ็นต์โดยการพิมพ์66%จากนั้นสองสามครั้งPgDnและฉันก็อยู่ที่นั่น แม้ว่าฉันจะเลือก 66 เพราะสามารถจดจำได้ว่า"เส้นทาง 66"แต่จริงๆแล้วมันก็เล็กไปกว่านั้นแม้ว่าจะไม่ใช่เรื่องง่ายที่จะจดจำเว้นแต่ว่ามันจะเป็นจุดเริ่มต้นของหมายเลขโทรศัพท์ของคุณ ฯลฯ :) อย่างน้อยเส้นทาง 66 "เป็นสากลและเป็นที่รู้จักทั่วโลก
ไวยากรณ์

คำตอบ:


33

เพื่อรับความช่วยเหลืออย่างรวดเร็วเกี่ยวกับ Bash ในตัวให้ใช้help:

help read

คือสิ่งที่คุณต้องการ

สำหรับการจัดรูปแบบเหมือนหน้าคนใช้

help -m read

หรือดีกว่านั้น

help -m read | less

หากคุณยังคงยืนกรานที่จะมองหามันในหน้าคนฉันพบว่าอะไรทำให้ฉันได้รับคำอธิบายอย่างรวดเร็ว

/^\s*read [[]

สิ่งนี้ใช้ได้เพราะเมื่อคำสั่งถูกอธิบายครั้งแรกชื่อของมันจะถูกเยื้องเล็กน้อยจากจุดเริ่มต้นของบรรทัด ในบางกรณีการดำเนินการreadนี้จะใช้เวลาในการสืบค้นเล็กน้อยก่อนที่คุณจะไปถึงreadเอกสารจริงเพราะ (ด้วยเหตุผลที่ชัดเจน) คำว่า "อ่าน" ซ้ำแล้วซ้ำอีกเป็นจำนวนมากทั่วทั้งเพจ [[] หมายถึงการจับคู่ [ซึ่งมักนำหน้าพารามิเตอร์ที่ไม่จำเป็น (ฉันมักจะออก / ^ \ s * และเพียงทำ / <คำสั่งในตัว> [[])

ทางเลือกอื่น

หากคุณไม่สนใจการเปลี่ยนรูปแบบคุณสามารถแปลง man page เป็นไฟล์ DVI หรือ PDF:

man -T dvi bash >bash.dvi

หรือ

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

แน่นอนด้วยเอกสาร DVI หรือ PDF คุณสามารถทำการค้นหาข้อความได้อย่างง่ายดาย


อืมhelpมันเยี่ยมมากฉันสงสัยว่าฉันไม่เคยได้ยินเรื่องนี้มาก่อน ... มันps2pdfไม่มีประโยชน์เลยเพราะมันไม่สามารถสร้างดัชนีทุกชนิดได้
ไฮด์

@hyde ไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดยการสร้างดัชนี แต่คุณเคยได้ยินptx ?
โจเซฟอาร์

ดัชนีหรือสารบัญว่า "ptx" ฟังดูเหมือนสิ่งที่ฉันหมายถึง
ไฮด์

1
อีกทางเลือกที่ง่ายกว่าคือทำ 'man bash> bashman.txt' จากนั้นคุณสามารถเปิด bashman.txt ในหน้าต่าง (อื่น) ในเครื่องมือแก้ไขข้อความและใช้คำสั่งทั้งหมดเพื่อค้นหาสิ่งที่คุณต้องการ คุณสามารถแก้ไขไฟล์เพื่อเพิ่มแท็กสำหรับส่วนที่คุณอ้างอิงบ่อยที่สุดได้ การทำให้ bashman.txt เป็นแบบอ่านอย่างเดียวช่วยให้คุณไม่ต้องแก้ไขโดยไม่ได้ตั้งใจในเครื่องมือแก้ไขของคุณ
โจ

นอกจากนี้คุณยังสามารถเปิดหน้าคนในเบราว์เซอร์ที่คุณเลือกและใช้เครื่องมือทั้งหมดของมัน ดูaskubuntu.com/questions/339255/…
Joe

9

วิธีที่ 1

man bashจาก/read \[นั้น/-s

วิธีที่ 2

คุณอาจจะลองใช้เครื่องมือเปิดแหล่งที่มาสำหรับการอธิบายอาร์กิวเมนต์บรรทัดคำสั่งที่เรียกว่าexplainshell

มันสามารถใช้ในท้องถิ่น อ่านเอกสารเกี่ยวกับhttps://github.com/idank/explainshell

Caveats: โดยปกติแล้วจะใช้ได้ แต่กับคำสั่งที่พบในที่เก็บ manpage ของ Ubuntu

ในกรณีของคุณมันไม่สามารถจดจำ-sสวิตช์read -s pwdได้

วิธีที่ 3

ฉันพบเครื่องมืออื่นที่มีแนวโน้มดี แต่ไม่สามารถใช้กับระบบของฉันได้

อธิบาย: เอกสารประกอบแบบย่อสำหรับคำสั่ง Unix


ด้วยวิธีที่ 1 คุณสามารถทำได้/-s\bเพื่อหลีกเลี่ยงเพลงฮิตเช่น--some-other-command(ในขณะที่ยังค้นหาสตริงเช่น-s,ซึ่งคุณจะไม่ได้รับถ้าคุณค้นหา/-sด้วยช่องว่าง)
David Knipe

8

สิ่งที่ฉันมักจะทำในกรณีนี้ก็คือเรียกใช้manค้นหาSHELL BUILTIN COMMANDSหัวเรื่องจากนั้นค้นหา builtin เช่น

man bash
/^SHELL BUILTIN
/  read 

อย่างไรก็ตามในทุบตีคุณสามารถทำได้

help read

หรือขึ้นอยู่กับระบบอย่างใดอย่างหนึ่ง

man 1 read
man bash-builtins

โดยทั่วไปฉันมีสคริปต์ชื่อhe("ความช่วยเหลือสั้น ๆ ") เพื่อทำสิ่งนี้ คุณจะเรียกใช้เช่นนี้:

he bash read

FYI ผมเปลี่ยนไป desc github.com/mikelward/scripts/blob/master/hehe
Mikel

3

ไม่มีวิธีการทั่วไปในการค้นหาข้อมูลในหน้าคนยิ่งไปกว่านั้นมีวิธีการทั่วไปในการค้นหาข้อมูลในหนังสือ ขึ้นอยู่กับสิ่งที่คุณกำลังมองหา

เมื่อคุณกำลังมองหาข้อมูลเกี่ยวกับเชลล์บิวด์อินคุณสามารถค้นหาบิวด์อินที่จุดเริ่มต้นของบรรทัดบันทึกการเยื้องและตามด้วยช่องว่าง: ค้นหา^ *read␣(เช่นประเภท/^ *read␣ Enter) ( เป็นช่องว่าง) สิ่งนี้ใช้ได้กับเส้นประ, pdksh, mksh และ bash หน้าคนของ Zsh ถูกแบ่งดังนั้นคุณต้องอ่านzshbuiltinsหน้าคน Ksh93 มีสัญลักษณ์พิเศษก่อนชื่อของบิวด์อินบางตัวคุณต้องค้นหา^ *†*␣ใน UTF-8 หรือ^ *-*␣ASCII มีผลบวกปลอมสองสามข้อ แต่สิ่งนี้จะทำให้คุณไปถึงเส้นที่ถูกต้องได้อย่างรวดเร็ว การค้นหา^ *read($| [-[])ช่วยลดปริมาณการบวกเท็จ

คุณสามารถเพิ่มความเร็วในการค้นหาโดยบอกเพจเจอร์ของคุณว่าคุณต้องการไปที่ไหน ตัวอย่างเช่นPAGER='less "+/^ *read \["' man bashเปิดหน้า bash man บนคำอธิบายของreadbuiltin คุณสามารถทำให้ฟังก์ชั่นนี้:

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

ในmkshmanpage / read (สองช่องว่างชื่อคำสั่งหนึ่งช่องว่าง) มักจะหาจุดที่ถูกต้อง (นี่คือเคล็ดลับที่ฉันใช้ตัวเองและพิมพ์ได้อย่างรวดเร็ว) ขอบคุณที่สอบถามเกี่ยวกับ ฉันจะใส่การอ้างอิงแยกต่างหากสำหรับสาธารณูปโภคทั้งหมดที่รวมอยู่กับ mksh ในสิ่งที่ต้องทำ
mirabilos

1
@ mirabilos / read มีแนวโน้มที่จะมีผลบวกปลอมจำนวนมากเมื่อการดำเนินการของคนของคุณเป็นธรรมข้อความ
Gilles 'หยุดชั่วร้าย'

ตกลง เหตุผลที่ต้องแยกเอกสารในตัวออกจากกันจริงๆ
mirabilos

1

หากต้องการข้ามไปยังส่วนคำสั่งของ BUILTINS ของเชลล์ในหน้า bash man ฉันจะกำหนดนามแฝงต่อไปนี้ใน$HOME/.bash_aliasesไฟล์ของฉัน

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

0

เพียงเพื่อเสนอทางเลือกอื่นหากคุณต้องการใช้เว็บเบราว์เซอร์ที่ช่วยให้คุณค้นหาได้อย่างง่ายดายในหน้าปัจจุบันคุณสามารถใช้บางอย่างเช่นman.cgi ที่ใช้งานได้ที่ freeBSD.org ซึ่งจะช่วยให้คุณดูหน้าคนจากระบบต่างๆเพื่อดูว่า พวกเขาแตกต่างกัน ฉันเคยเห็นเว็บไซต์อื่นที่คล้ายคลึงกันดังนั้นคาดว่าจะมีการเปลี่ยนแปลงอื่น ๆ

ลิงค์ความช่วยเหลือภายใต้ apropos เสนอข้อมูลบางอย่างเพื่อรับสำเนาของสคริปต์เพื่อวางบนเซิร์ฟเวอร์ของคุณพร้อมลิงก์เพื่อดาวน์โหลดคอลเลกชัน man page


0

ฉันได้รอบเพื่อสร้างฟังก์ชั่นทุบตีเพื่อวัตถุประสงค์ ตัวอย่างนี้สามารถวางตัวอย่างในตอนท้ายของ~/.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
  )
}

ความเห็นอธิบายเล็กน้อยเกี่ยวกับสิ่งที่มันทำ สตริงการค้นหาเริ่มต้นในการค้นหาโดยเฉพาะคำที่ได้รับจากจุดเริ่มต้นของบรรทัดข้ามพื้นที่เริ่มต้น ตัวอย่าง:

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

หมายเหตุ: สคริปต์นี้ไม่มีแนวคิดของส่วนของหน้าคน ... ฉันจะดูว่าฉันปรับแต่งในภายหลัง แต่การตั้งค่าMANSECTตัวแปรสภาพแวดล้อมของมนุษย์ช่วย


2
คุณอาจต้องการเพิ่มกับดักเพื่อล้างไฟล์ชั่วคราว:trap 'rm -f "$tmp"'
l0b0

1
มันดูซับซ้อนมาก ฉันยังไม่ได้อ่านอย่างเต็มที่ว่าสคริปต์ของคุณman "$1" | vim -R - "+/$2"ทำอะไรแต่จะไม่ทำสิ่งที่คล้ายกันใช่ไหม
Gilles 'หยุดความชั่วร้าย'

@Gilles ฉันที่จะไปเกิดครั้งแรก$2ดังนั้นไม่
ไฮด์

@ l0b0 trapเปลี่ยนทำความสะอาดกับการใช้งาน ฉันไม่พบวิธีที่สะอาดที่จะทำในฟังก์ชั่นโดยไม่ต้องสร้าง subshell
ไฮด์

@hyde ปรับ regex ให้เข้ากับสิ่งที่คุณทำอยู่แน่นอน ประเด็นของฉันเกี่ยวกับการใช้+/REGEX
Gilles 'หยุดความชั่วร้าย'

0

รวบรวมส่วนต่างๆจากการสนทนาอื่น ๆที่นี่นี่เป็นฟังก์ชั่นอย่างรวดเร็วที่คุณสามารถทิ้งไว้ในที่ของคุณ.bashrcซึ่งจะพาคุณไปที่บิวด์อินโดยตรง (ถ้ามี) มิฉะนั้นจะเปิดmanตามปกติ:

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

0

จากดิสทริบิวเตอร์ลิฟท์ใด ๆ คุณควรจะสามารถใช้งานได้info bashหากคุณต้องการแยกย่อหน้าตามประเภทของการดำเนินการที่มีข้อมูลเหมือนกับ man page

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.