2015-10-30 43 views
5

Pociski takie jak zsh i bash mają hukowe komendy, które zaczynają się od wykrzyknika i rozwijają się do elementów w historii użytkownika.Jak interaktywnie rozwinąć polecenie bang w bash?

Aby uzyskać ostatni argument ostatniej uruchomionej komendy, można użyć !$, np.

$ echo one two three 
$ echo !$ !$ !$ 
> three three three 

W zsh, można rozszerzyć te Bang polecenia interaktywnie:

touch foo bar 
ls !$<TAB> 

!$ zostanie rozszerzona foo rolkach.

Jest to bardzo przydatne, ponieważ często zapobiegało mi pomyłkom: naciskając tab, aby się rozwinąć i upewniłem się, że mam dobrze i C-/, aby cofnąć rozszerzenie, gdy jestem pewny.

Czy istnieje ustawienie w bash, aby uzyskać interaktywną ekspansję poleceń bang?

co ekspansji podpowłok i zmienne ogólnej w tym zakresie (tzn echo $(uname)<TAB> do echo Linux i echo $SHELL<TAB> do echo /bin/bash).

+0

Twoje pytanie zakłada, że ​​czytelnik rozumie, jakie są polecenia bang w zsh. Prawdopodobnie możesz dotrzeć do szerszej publiczności, jeśli opisałeś funkcjonalność, której szukasz. Zgaduję, że M-. z argumentem przedrostka jest zbliżony do tego, co chcesz, ale ja go nie szukałem. – tripleee

+2

http://structure.usc.edu/bash/bashref_8.html#SEC106 wyjaśnia dostępne powiązania. M-C-e robi ogólną ekspansję, więc mniej więcej co jest w twoim drugim pytaniu. (Tylko jedno pytanie na pocztę w przyszłości, proszę!) – tripleee

+0

Rozwinąłem nieco, co mam na myśli z poleceniem bang. Założono, że mechanizm jest taki sam dla podpowłok, zmiennych itp., Dlatego uwzględniłem tę drugą część pytania. I masz rację, dziękuję, że 'shell-expand-line' było rzeczywiście tym, czego szukałem. – kba

Odpowiedz

8

Istnieje kilka opcji, za pomocą których można rozbudowywać historię. Jednym z nich jest modyfikator :p, który drukuje rozwinięte polecenie zamiast go wykonywać.

$ echo foo 
$ !!:p 
echo foo 

Innym jest korzystać z opcji histverify, która zwraca wynik rozszerzalności w buforze historii powłoki do edycji zamiast natychmiast je wykonuje.

$ shopt -s histverify 
$ echo foo 
foo 
$ !! 
$ echo foo 

Jeśli jesteś zadowolony z polecenia, po prostu naciśnij Enter ponownie, aby go uruchomić, tak jakbyś właśnie je wpisał.

Domyślnie Readline komenda history-expand-line jest zobowiązany do M-^ (Alt-^ lub Esc-^, w zależności od tego, co twój terminal emulator wysyła jako klucz meta), który rozszerza żadnych Interpretacja historii na bieżącej linii poleceń.

Jest też ogólnie Readline komenda shell-expand-line (związany M-C-e domyślnie), która rozszerza wszystko w wierszu poleceń, tak jak powłoki będzie po uderzeniu Enter ale tuż przed wykonywaniem go.

+1

Polecenie readline linii 'shell-expand-line' było tym, czego szukałem. 'shopt -s histverify' jest również bardzo użyteczny, dziękuję. Jak @tripleee zauważył w komentarzach, skrótem do uzyskania ostatniego argumentu z ostatniego polecenia (tj. '! $') Jest 'M-.' (' Alt + .' lub 'Esc-.'). – kba

+1

'Ctrl-x' również rozwija linię (bez wykonywania). –