Uzun adam sayfalarını okumak ve aramak


32

Hakkında okumak isteyen da nihayet bıkmış bash 'ın readve' s -sile seçeneği man bash. Ben (hat 4500 civarında) sonunda doğru noktaya bulundu, ancak her ikisi beri, her zamanki gibi bir sinir bozucu /readve hatta /\s-s\saramalar yol çok sayıda maçları var.

Öyleyse, soru şudur: Uzun man sayfalarını verimli bir şekilde nasıl okuyabilirim ya da yerel olarak yerel olarak aynı bilgileri nasıl alabilirim ? Spesifik bir örnek olarak, read -s pwdbir kabuk betiğinde gördükten sonra ilgili belgelere nasıl ulaşılır ? İyi bir cevap, kabuk komut dosyası snippet'i olabilir ya da bazı araçlar ve nasıl kullanıldığı hakkında ipucu ya da okumak için doğru noktayı bulmaya yardımcı olduğu sürece tamamen başka bir şey olabilir.

Not: ile etiketlemiyorum, çünkü sorunun genel olarak manyak okuma hakkında olmasına rağmen en sık karşılaşılan humongöz man sayfası.


Bunu bir cevap olarak koymuyorum, çünkü gereksinimlerinizin dışında olabilir ama: uzun bir mansayfa okumam gerektiğinde üst panelimde bıraktığım küçük bir senaryo kullanıyorum. yuugian.com/demo/gkman.txt Paylaşın ve keyfini çıkarın
Yuugian

Bunu da bir cevap olarak koymuyorum;) çünkü aslında bashkendisi ile ilgili: tıpkı senin gibi, ben de çoğunlukla SHELL BUILTINSel kitabının 3500 satırındaki kısmına ihtiyacım var . Bunu bilerek, bir dahaki sefere söyleyeceğim man bashve sonra yüzde 66'ya inip yazarak 66%, sonra birkaç kez PgDn ve ben oradayım. Ben 66'yu seçtim, çünkü "Route 66" olarak ezberlenebilir , ancak telefonunuzun başlangıcı olmadıkça ezberlemesi kolay olmasa da, aslında bundan biraz daha fazlası. :) En azından "Route 66 "evrenseldir ve dünya çapında bilinir.
sözdizimi

Yanıtlar:


33

Bash yerleşiklerinde hızlı bir şekilde yardım almak için helpşunları kullanın :

help read

İstediğin şey bu.

Man sayfası benzeri biçimlendirme için

help -m read

veya daha da iyisi,

help -m read | less

Hala man sayfasında onu aramakta ısrar edersen, beni bir komutun açıklamasına çabucak götüren şeyi buluyorum.

/^\s*read [[]

Bu, bir komut ilk açıklandığında isminin satırın başından biraz girintili olduğu için işe yarıyor. Belirli bir durumda read, gerçek readbelgelere ulaşmadan önce bu biraz göz atmanız gerekir, çünkü (bariz nedenlerden dolayı) "okuma" kelimesi man sayfasında çok tekrarlanır. [[], Genellikle isteğe bağlı parametrelerden önceki bir [ile eşleşme anlamına gelir. (Genellikle / ^ \ s * dışına çıkarım ve / / built-command> [[] işlevini yapıyorum)

Başka bir alternatif

Format değişikliğine aldırış etmezseniz, man sayfanızı bir DVI veya PDF dosyasına dönüştürebilirsiniz:

man -T dvi bash >bash.dvi

veya

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

Elbette, bir DVI veya PDF belgesi verildiğinde, kolayca bir metin araması yapabilirsiniz.


Hmm, bu helpharika, acaba hiç duymadım ... ps2pdfhiçbir şekilde indeks oluşturamadığı için o kadar da kullanışlı değil.
hyde

@hyde kararsız mısınız indeksi oluşturarak istemem ama biliyorsunuz neyi PTX ?
Joseph R.

Dizin veya İçindekiler, "ptx" tam olarak kastediyorum gibi geliyor.
hyde

1
Bir başka, daha basit alternatif bile 'man bash> bashman.txt' yapmaktır. Sonra bashman.txt dosyasını metin editörünüzdeki (başka bir pencerede) açabilir ve istediğinizi bulmak için tüm komutlarını kullanabilirsiniz. En sık atıfta bulunduğunuz bölümlere etiket eklemek için dosyayı bile düzenleyebilirsiniz. Bashman.txt dosyasını salt okunur yapmak, editörünüzde kazayla değiştirmemenize yardımcı olur.
Joe,

Man sayfalarını seçtiğiniz tarayıcıda açabilir ve tüm araçlarını kullanabilirsiniz. Bkz askubuntu.com/questions/339255/...
Joe

9

Yaklaşım 1

man bashsonra /read \[sonra/-s

Yaklaşım 2

Sen denilen komut satırı argümanları açıklamak için bir açık kaynak aracı deneyebilirsiniz explainshell .

Yerel olarak kullanılabilir. Https://github.com/idank/explainshell adresindeki belgeleri okuyun.

Uyarılar: Genellikle çalışır, ancak yalnızca Ubuntu'nun manpage deposunda bulunan komutlarla

Senin durumunda, -sgeçişi tanıyamıyor read -s pwd.

Yaklaşım 3

Umut verici görünen başka bir araç buldum ancak sistemimde çalışmıyor.

açıkladı: Unix Komutları için Kısa Belgeler


Yaklaşım 1 ile, /-s\bgibi isabetlerden kaçınmak için yapabilirsiniz --some-other-command(hala bir boşlukla -s,aranırsanız elde edemeyeceğiniz dizeleri bulmaya devam ederken /-s).
David Knipe

8

Bu durumda genellikle yaptığım şey sadece çalıştırılır man, SHELL BUILTIN COMMANDSbaşlığı arar, sonra yerleşikleri arar, yani

man bash
/^SHELL BUILTIN
/  read 

Ancak, bash içinde yapabilirsiniz

help read

veya sisteme bağlı olarak

man 1 read
man bash-builtins

Genel olarak, bunu yapmak için he("kısa yardım") adlı bir komut dosyası var . Böyle koşarsın:

he bash read

Bilginize, ben değiştirildi descetmek he. github.com/mikelward/scripts/blob/master/he
Mikel

3

Bir man sayfasında bilgi bulmanın genel bir yolu yoktur, kitapta bilgi bulmanın genel bir yolu yoktur. Ne aradığına bağlı.

Bir kabuk yerleşimi hakkında bilgi ararken, yerleşimi girinti için kaydettiği satırın başında arayabilir ve ardından bir boşluk arayabilirsiniz: ^ *read␣(örneğin, tür /^ *read␣ Enter) arama ( boşluk). Bu çizgi, pdksh, mksh ve bash ile çalışır. Zsh'in man sayfası bölünmüş durumda, man sayfasını okuman gerekiyor zshbuiltins. Ksh93, bazı yerleşiklerin isimlerinden önce özel sembollere sahiptir ^ *†*␣, UTF-8'de veya ^ *-*␣ASCII'de aramanız gerekir . Birkaç yanlış pozitif var, ancak bu sizi hızlı bir şekilde doğru çizgiye getirecektir. Aramak ^ *read($| [-[])yanlış pozitiflerin miktarını azaltır.

Çağrı cihazınıza nereye gitmek istediğinizi söyleyerek aramayı hızlandırabilirsiniz. Örneğin PAGER='less "+/^ *read \["' man bash, readyerleşik ifadenin açıklamasına ilişkin bash man sayfasını açar . Bunu bir işlev haline getirebilirsiniz:

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

In mkshman, / read (iki boşluk, komut adı, bir boşluk) genellikle doğru noktaya (bu kendim kullanmak bir hüner olduğunu ve tipi hızlıdır) bulur. Bunu sorduğun için teşekkürler; TODO'mda mksh içeren tüm yardımcı programlar için ayrı referanslar hazırlayacağım.
mirabilos

1
@mirabilos / read , adam uygulamanız metni haklı gösterdiğinde birçok yanlış pozitif eğilim gösterir.
Gilles 'SO- kötülük yapmayı bırak'

Kabul. Yerleşik belgeleri gerçekten ayırmak için daha da fazla neden.
mirabilos

1

Doğrudan bash man sayfasının SHELL BUILTINS COMMANDS bölümüne atlamak için, dosyamda aşağıdaki diğer adı tanımlarım $HOME/.bash_aliases.

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

0

Sadece başka bir alternatif sunmak için, mevcut sayfayı kolayca aramanıza izin veren bir web tarayıcısı kullanmayı tercih ederseniz, freeBSD.org'da kullanılan man.cgi gibi bir şey kullanabilirsiniz. Onlar farklı. Diğer sitelerde de benzer şeyler gördüm, bu yüzden etrafta başka çeşitler de olmasını bekliyoruz.

Apropos altındaki yardım bağlantısı, kendi sayfanıza koymak için betiğin bir kopyasını almak üzere bazı sayfalar sunar.


0

Bu amaçla bir bash işlevi yaratmaya başladım. Bu snippet örneğin sonuna yapıştırılabilir ~/.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
  )
}

Yorumlar ne yaptığını biraz açıklar. Özellikle varsayılan arama dizesi, verilen kelimeyi satırların başından itibaren arar ve ilk boşluğu atlar. Örnekler:

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

Not: Bu senaryoda man sayfa bölümleri kavramı yoktur ... Bunu daha sonra çimdik edip etmediğimi göreceğim, ancak insanınMANSECT ortam değişkenini ayarlamak yardımcı olur.


2
Geçici dosyayı temizlemek için bir tuzak eklemek isteyebilirsiniz:trap 'rm -f "$tmp"'
l0b0

1
Bu çok karmaşık görünüyor. Senaryonun ne yaptığını tam olarak okumamıştım, ama man "$1" | vim -R - "+/$2"benzer bir şey yapmaz mıydın ?
Gilles 'SO- kötülükten vazgeçmeyi'

@ Gilles I bu ilk oluşumuna gider $2, yani hayır.
Hyde

@ l0b0 Kullanılacak temizleme değişti trap. Olsa da bir alt kabuk oluşturmadan bir işlevi yapmak için temiz bir yol bulamadım.
hyde

@hyde Regex'i yaptığınız şeye uyarlayın, elbette. +/REGEX
Demek istediğim

0

Buradaki diğer tartışmalardan parçaları bir araya getirerek, içinde .bashrcdoğrudan bırakabileceğiniz (varsa) sizi içine alabileceğiniz hızlı bir işlev . Aksi takdirde mannormal şekilde açılır :

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

0

Herhangi bir Linux dağıtımından info bash, bilgilerin man sayfalarıyla aynı olduğu eylem türüne göre ayrı paragraflara sahip olmak istiyorsanız kullanabilmelisiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.