Jak zrobić specjalną frazę rozwijaną w bash?


12

<command> --help | grep <feature>Codziennie robię to bardzo często. Zastanawiałem się, czy można stworzyć coś takiego ^^, "--help | grep"a następnie robię to:

ls ^^ size

Spowoduje to wykonanie następujących czynności:

ls --help | grep size

Odpowiedzi:


15

Z zshużyłbyś globalnego aliasu:

$ 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)

Dzięki bashmożesz być w stanie użyć rozszerzenia historii, które dzieje się wystarczająco wcześnie w analizie składni powłoki, aby mogło działać przy podstawianiu potoku:

  1. Poddaj historię tekstem, który chcesz zastąpić, i znakiem specjalnym, którego w innym przypadku raczej nie użyjesz (tak jak £tutaj na mojej klawiaturze):

     $ --help $(: £)|grep
     bash: --help: command not found
     Usage: grep [OPTION]... PATTERN [FILE]...
     Try 'grep --help' for more information.
  2. Następnie użyj rozszerzenia historii, aby je odzyskać:

    $ 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

Lub możesz readlinerozwinąć --help|grepklawisz po naciśnięciu klawisza lub sekwencji klawiszy. Aby to dotyczyło bashtylko (a nie innych aplikacji takich jak gdbreadline), możesz użyć bindwbudowanej komendy bash, która jest bashinterfejsem API do konfiguracji readline, na przykład w ~/.bashrc:

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

Lub dodaj do swojego ~/.inputrc(pliku konfiguracyjnego readline):

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

(istnieją inne powłoki, takie jak rclub eswykorzystujące readline, i gdzie wykonanie tego powiązania może mieć sens, ale AFAICT, nie ustawiają rl_readline_namezmiennej przed wywołaniem, readlinewięc nie będzie można dodawać $ifdla nich instrukcji (będą otherwyglądać jak wszystkie aplikacje) które używają readline bez podawania nazwy aplikacji)).

Pamiętaj, że musisz wprowadzić drugi ^w ciągu pół sekundy (domyślnie) po pierwszym, aby nastąpiła zamiana.


Czy możesz wyjaśnić nieco więcej rozwiązanie readline ?! gdzie powinienem dodać to wiązanie? w jakich aplikacjach rozszerzy się to wiązanie?
yukashima huksay

@yukashimahuksay, patrz edycja
Stéphane Chazelas

17

Możesz do tego użyć funkcji bash:

Umieść w swoim ~ / .bashrc:

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

Po zapisaniu bashrc zrób source ~/.bashrcto można zrobić:

$ 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
powinieneś podać 1 $ i 2 $. qh () { type -all "$1" ; { "$1" --help || man "$1" ;} | egrep -i -- "$2" ;} Zmieniłbym to na: # stąd możesz: qh ls size, qh ls "coś | innego" itd. (Optionnal) type -all "$1"również dodaje informacje o 1 $: mówi, czy będziesz uruchamiał alias, funkcję, a polecenie itp. I przekazuje informacje od człowieka „$ 1”, jeśli polecenie $ 1 nie ma opcji „--help” (zdarza się to czasami)
Olivier Dulac

1
@OlivierDulac Czy możesz wyjaśnić coś więcej na temat typu „all 1 $”? W jakim przypadku będzie to konieczne?
tgwtdt

Moja wersja typu (kubuntu 16.04) wie o tym -a, ale nic nie mówi o -llub -all, ale funkcja działa.
Joe

8

Możesz użyć powiązań readline:

dodaj linię jak

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

do twojego ~ / .inputrc

Następnie naciśnij ^ X ^ R w swoim terminie, a wiązanie zostanie aktywowane.

Kluczowanie ls ^^spowoduje teraz ls --help | grep.


Odpowiedziałem, zanim zobaczyłem, że Stephane dodał rozwiązanie readline. Usunąłem swoją odpowiedź, ale potem cofam ją, gdy zobaczyłem komentarz z pytaniem o szczegóły rozwiązania readline
Alex Stragies

2
Dodałem teraz trochę więcej w mojej odpowiedzi.
Stéphane Chazelas

1
Odpowiedzi ukierunkowane, takie jak twoje, i wyczerpujące, takie jak Stéphane, mają swoje miejsce. Zyskaj głos!
biskup

5

Używanie lessdo przeglądania komunikatu pomocy

Przydatne może być sprawdzenie otaczającego kontekstu wierszy pasujących do zapytania.

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

Składnia wywołania tej bashfunkcji jest podobna do funkcji qhw odpowiedzi @ tgwtdt, przy czym pierwszym argumentem jest polecenie do sprawdzenia, a drugim argumentem jest wyszukiwane hasło. Na przykład:

hh ls size
hh ls "symbolic link"

Spowoduje to otwarcie komunikatu pełnej pomocy less, wyróżnienie każdego wystąpienia wyszukiwanego terminu i przewinięcie do pierwszego wystąpienia wyszukiwanego terminu. Następnie możesz nacisnąć przycisk, naby przewinąć do przodu do następnego wiersza zawierającego wyszukiwane hasło, nponownie dla następnego i tak dalej. Aby przewinąć z powrotem do poprzedniego wystąpienia, naciśnij N. Użyj Home, End, Page Up, Page Down, Up Arrow, a Down Arrowklucze do ogólnej nawigacji. Naciśnij qlub, Qaby wyjść lessi powrócić do wiersza poleceń.


3

Podobało mi się rozwiązanie @tgwtdt, więc trochę go ulepszyłem.

Robi to samo, ale trochę zajmuje się błędami, a także próbuje przetwarzać wbudowane.

qh używa () zamiast {}, więc qh1 () i out są lokalne (w podpowłoce).

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"
) 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.