W Bash istnieje kilka przydatnych operatorów do powtarzania części ostatniego polecenia:
!^
rozwija się do pierwszego argumentu poprzedniego polecenia, np.$ echo one "two three" one two three $ echo !^ echo one one
!$
rozwija się do ostatniego argumentu poprzedniego polecenia, np.$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
rozwija się do wszystkich argumentów poprzedniego polecenia, np.$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(O ile dobrze rozumiem, to cukier syntaktyczny dla !!:^
, !!:$
i !!:*
, odpowiednio, gdzie !!
jest oznaczenie zdarzenie, które rozwija się do poprzedniego polecenia, a także ^
, $
i *
to Oznaczenia słowne, zobacz Bash Reference Manual lub man bash
).
Często są one bardzo przydatne. Ale robi się jeszcze fajniej dzięki skrótom klawiaturowym:
Kiedy naciśniesz Alt+ .lub Alt+ _, ostatni argument poprzedniego polecenia zostanie wstawiony do bieżącego polecenia, podobnie jak gdybyś napisał
!$
w tym momencie.Możliwe jest także naciśnięcie Alt+ Ctrl+, yaby wstawić pierwszy argument poprzedniego polecenia, tak jakbyś napisał
!^
w tym momencie.
(Zobacz bibliotekę GNU Readline lub info readline
.)
Wolę skróty klawiaturowe niż operatory historii Basha, ponieważ widzę, co wstawiam, zanim faktycznie wykonam polecenie. Wydaje się jednak, że nie ma skrótu, który pozwala mi wstawić wszystkie słowa poprzedniego polecenia, tzn. Takiego, który wykonuje swoją !*
pracę. Przynajmniej nie mogłem tego znaleźć.
Czy istnieje taki skrót? Jeśli nie, to czy można skonfigurować bibliotekę readline, aby ją dodać i jak?
źródło
zsh
wpisaniu,echo !*
a następnie naciśnięciu klawisza TAB, uzyskasz pożądany efekt. Ogólnie rzecz biorąc, TAB podczas odczytu rozszerzy wszystkie rozwijane. Bardzo przydatny; prawdopodobnie bash będzie miał konfigurację z tym samym skutkiem? @Seth, myślę, że to readline na bash, a nie emulator terminala - choć nie jestem pewien.man bash
\e.
i\e_
są mapowane na funkcję readlineyank-last-arg
i\e\C-y
jest mapowane nayank-nth-arg
. Niestety wydaje się, że nie ma (pojedynczego) polecenia, które dodałoby wiele poprzednich argumentów jednocześnie.Odpowiedzi:
Jeśli spojrzysz na wynik następującego polecenia:
lub lepiej:
widać, że nie istnieje żadna funkcja readline dla wszystkich argumentów, jak na przykład
yank-last-arg
dla ostatniego argumentu - który może wstawić ostatni argument do poprzedniego polecenia (ostatnie słowo poprzedniego wpisu historii). Jeśli więc taka funkcja nie istnieje, najprawdopodobniej nie istnieje skrót do osiągnięcia tego, co chcesz.Spróbujmy stworzyć skrzynkę z jednym podejściem do twojego żądania ...
Najpierw spójrz na przykład na następujące polecenie:
Dane wyjściowe to:
i można je przetłumaczyć w następujący sposób:
yank-nth-arg
(który wstawia pierwszy argument do poprzedniej komendy - z argumentem n wstawia nty argument z poprzedniej komendy) jest powiązany z Alt+ Ctrl+ y.W ten sam sposób można interpretować dowolny wiersz z wyjścia
bind -p
polecenia.Teraz zwróć uwagę na następujące scenariusze:
Jeśli ustawisz następujące powiązanie:
Alt+ Azostanie zamapowany na Alt+ 2Alt+, .który jest zamapowany, aby wstawić drugi argument poprzedniego polecenia. Tak więc, po po naciśnięciu Alt+ AThe drugi argument poprzedniego polecenia jest włożona do bieżącego polecenia.
Jeśli ustawisz:
Po po naciśnięciu Alt+ A, te dwa pierwsze argumenty poprzedniego polecenia jest włożona do bieżącego polecenia. Jeśli liczba argumentów z poprzedniego polecenia wynosi maksymalnie 2, oczywiście wszystkie poprzednie polecenia są wstawiane do bieżącego polecenia.
Jeśli ustawisz:
Po po naciśnięciu Alt+ A, że pierwsze trzy argumenty poprzedniego polecenia jest włożona do bieżącego polecenia. Jeśli liczba argumentów z poprzedniego polecenia wynosi maksymalnie 3 (jak w twoim przypadku), oczywiście wszystkie poprzednie polecenia są wstawiane do bieżącego polecenia.
I tak dalej.
Do pierwszych 10 argumentów możesz użyć:
I myślę, że to wystarczająco długo, o ile nie używam zbyt często poleceń z tyloma argumentami.
Aby było trwałe, dodaj do
~/.inputrc
pliku następującą linię :W tym przykładzie wybrałem Alt+, Aaby wstawić wszystkie argumenty (jeśli liczba argumentów nie jest większa niż 10) poprzedniego polecenia, ale możesz wybrać dowolną inną kombinację, zastępując w poprzednim poleceniu
\ea
ciąg.Zasoby:
help -m bind
źródło
funmap.c
, funkcjayank-nth-arg
jest odwzorowana na funkcję Crl_yank_nth_arg
, która z kolei jest zdefiniowana wkill.c
. Analogicznie dlayank-last-arg
. Oczywiście byłoby możliwe rozszerzenie readline o taką funkcjonalność, ale nie chcę tego robić; Wolę zarządzać moim readlineapt
, a ta funkcja nie jest tak ważna;)