Bash'da özel bir genişletilebilir ifade nasıl yapılır?


12

Kendimi <command> --help | grep <feature>her gün çok sık yaparken buluyorum . Gibi bir şey yapmak mümkün oldu acaba ^^bu genişletir "--help | grep"ve daha sonra bunu:

ls ^^ size

Bu aşağıdakileri gerçekleştirir:

ls --help | grep size

Yanıtlar:


15

İle zsh, bir kullanırsınız küresel takma:

$ alias -g '^^=--help|grep --color -i'
$ ls ^^ size
     --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
                              1,048,576 bytes; see SIZE format below
 -h, --human-readable       with -l and/or -s, print human readable sizes
 -s, --size                 print the allocated size of each file, in blocks
 -S                         sort by file size, largest first
     --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
 -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
The SIZE argument is an integer and optional unit (example: 10K is 10*1024)

İle bash, kabuk sözdizimi ayrıştırmasında bir borunun değiştirilmesinde çalışabileceği kadar erken gerçekleşen geçmiş genişletmeyi kullanabilirsiniz :

  1. Tarihi, yerine koymak istediğiniz bir metinle ve başka türlü kullanmanız mümkün olmayan özel bir karakterle ( £burada olduğu gibi klavyemde olur) kullanın:

     $ --help $(: £)|grep
     bash: --help: command not found
     Usage: grep [OPTION]... PATTERN [FILE]...
     Try 'grep --help' for more information.
    
  2. Sonra bunu almak için geçmiş genişletmeyi kullanarak:

    $ ls !?£? size
    ls --help $(: £)|grep size
         --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
     -h, --human-readable   with -l and/or -s, print human readable sizes
     -s, --size             print the allocated size of each file, in blocks
     -S                     sort by file size, largest first
         --sort=WORD        sort by WORD instead of name: none (-U), size (-S),
     -T, --tabsize=COLS     assume tab stops at each COLS instead of 8
    

Ya da bir tuşa veya tuş dizisine bastığınızda readlinegenişleyebilirdiniz --help|grep. Bunun bashyalnızca (ve gdbreadline kullanımı gibi diğer uygulamalara ) uygulanmaması için, yapılandırmak için API'sı bindolan bash yerleşik komutunu kullanabilirsiniz, örneğin :bashreadline~/.bashrc

bind '"^^": "--help|grep "'

Veya ~/.inputrc(readline'ın yapılandırma dosyasına) ekleyin :

$if Bash
"^^": "--help|grep "
$endif

( readline kullanan rcya esda readline kullanan başka kabuklar da vardır ve bu bağlamayı yapmanın AFAICT'den başka bir anlamı olabilir, ancak çağrılmadan rl_readline_nameönce değişkeni ayarlamazlar, readlineböylece $ifonlar için bazı ifadeler ekleyemezsiniz ( othertüm uygulamalar gibi gösterecektir) uygulama adını söylemeden readline kullanan)).

Değişikliğin gerçekleşmesi için ikincisini ^ilkinden yarım saniye sonra (varsayılan olarak) girmeniz gerektiğini unutmayın .


Readline çözümünü biraz daha açıklayabilir misiniz ?! bu ciltlemeyi nereye eklemeliyim? bu ciltleme hangi uygulamalarda genişleyecek?
yukashima huksay

@yukashimahuksay, bkz. düzenleme
Stéphane Chazelas

17

Bunun için bir bash işlevi kullanabilirsiniz:

Aşağıdakileri ~ / .bashrc dosyasına koyun:

qh() {
    type -all "$1" ; { man "$1" || "$1" --help ;} | egrep -i -- "$2"
}

Yaptığınız bashrc işi kaydettiğinizde source ~/.bashrcşunları yapabilirsiniz:

$ qh ls size
      --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                               '--block-size=M' prints sizes in units of
  -h, --human-readable       with -l and/or -s, print human readable sizes
  -s, --size                 print the allocated size of each file, in blocks
  -S                         sort by file size, largest first
      --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
  -T, --tabsize=COLS         assume tab stops at each COLS instead of 8

1
1 $ ve 2 $ teklif etmelisiniz. Bunu şu şekilde değiştirirdim: qh () { type -all "$1" ; { "$1" --help || man "$1" ;} | egrep -i -- "$2" ;} # dolayısıyla şunları yapabilirsiniz: qh ls boyutu, qh ls "bir şey | başka" vb. (Optionnal) type -all "$1"ayrıca 1 $ hakkında bilgi ekler: bir takma ad, bir işlev, bir Eğer $ 1 komutu "--help" (bu bazen olur) seçeneğine sahip değilse "$ 1" adamından bilgi verir (bu bazen olur)
Olivier Dulac

1
@OlivierDulac -all "$ 1" türü hakkında biraz daha bilgi verebilir misiniz? Hangi durumda gereklilik olacak?
tgwtdt

Benim türümün (kubuntu 16.04) sürümünü biliyor -a, ama -lya da hakkında bir şey söylemiyor -all, ancak işlev çalışıyor.
Joe

8

Readline bağlamaları kullanabilirsiniz:

gibi bir çizgi ekle

"^^": "--help | grep "

~ / .inputrc'nize

Ardından teriminizde ^ X ^ R tuşuna bastığınızda ciltleme etkinleştirilir.

Anahtarlama ls ^^şimdi ile sonuçlanacaktır ls --help | grep.


Görmeden önce, Stephane'nin readline çözümünü eklediğini yanıtladı. Cevabımı sildim, ancak daha sonra
okuma çizgisi

2
Şimdi cevabımda buna biraz daha ekledim.
Stéphane Chazelas

1
Sizinki gibi hedefli cevaplar ve Stéphane'ninki gibi kapsamlı cevapların her ikisi de onların yerine sahiptir. Bir oy verin!
piskopos

5

lessYardım mesajını görüntülemek için kullanma

Arama sorgunuzla eşleşen satırların çevreleyen içeriğini görmek yararlı olabilir.

hh () { "${1}" --help | less -p "${2}" ; }

Bu bashişlevi çağıracak sözdizimi qh@ tgwtdt'in yanıtındaki işleve benzer , ilk argüman incelenecek komuttur ve ikinci argüman arama terimi olur. Örneğin:

hh ls size
hh ls "symbolic link"

Bu, yardım mesajının tamamını açar, lessarama teriminin her örneğini vurgular ve arama teriminin ilk örneğine geçer. Ardından n, arama terimini içeren bir sonraki satıra, bir sonraki adım için ntekrar ilerlemek için düğmesine basabilirsiniz . Önceki bir örneğe geri gitmek için tuşuna basın N. Kullanım Home, End, Page Up, Page Down, Up Arrow, ve Down Arrowgenel navigasyon için tuşları. Çıkmak ve komut satırına dönmek için qveya düğmesine basın .Qless


3

@Tgwtdt tarafından çözümü beğendim, bu yüzden biraz geliştirdim.

Bu aynı şeyi yapar, ancak hataları işlemek için biraz yapar ve yerleşik işlemleri işlemeye çalışır.

qh, {} yerine () kullanır, bu nedenle qh1 () ve out yereldir (alt kabukta).

function qh () (
    function qh1 () {
      out="$(help "$1" 2>&1 )"
      [ $? -ne 0 ] && return 1
      echo "$out"
    }

    type -all "$1" ; { qh1 "$1" || "$1" --help 2>/dev/null || man "$1" 2>/dev/null ;} | egrep -i -- "$2"
) 
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.