użyłem
history | less
aby uzyskać wiersze poprzednich poleceń i z liczb po lewej stronie znalazłem wiersz, który chciałem powtórzyć (np. 22) i zrobiłem
!22
w wierszu polecenia i zadziałało - wykonanie zestawu poleceń w wierszu, który zrobiłem w tym czasie. Nie mogę dowiedzieć się, gdzie jest używany wykrzyknik, co reprezentuje pod względem działań podejmowanych przez bash i gdzie go użyć. Z dokumentacji nie widzę wyjaśnienia, które byłoby „namacalne”.
Odpowiedzi:
!
to funkcja, która pierwotnie pojawiła się w powłoce C , jeszcze w czasach, zanim można było liczyć na terminale posiadające klawisze strzałek. Jest to szczególnie przydatne, jeśli dodasz bieżący numer polecenia do znaku zachęty (PS1="\!$ "
), dzięki czemu możesz szybko spojrzeć na ekran, aby uzyskać numery poprzednich poleceń.Teraz, gdy możesz używać klawiszy strzałek i takich rzeczy, jak Ctrl-Rprzeszukiwanie historii poleceń, nie widzę dużego zastosowania tej funkcji.
Jednym z jego wariantów, który może być nadal przydatny, jest
!!
ponowne wykonanie poprzedniego polecenia. Sam w sobie nie znajduję !!Enterszybszego niż tylko ↑ Enter, ale może być pomocny w połączeniu z większym poleceniem.Przykład: Częstym błędem pilota w
sudo
systemach opartych jest zapomnieniesudo
prefiksu polecenia wymagającego dodatkowych uprawnień. Nowicjusz przepisuje całe polecenie. Pilny uczeń edytuje polecenie z historii poleceń powłoki. Oświecony jeden typsudo !!
.Bash pozwala wyłączyć
!
przetwarzanie w powłoce za pomocąset +o histexpand
lubset +H
. Możesz to wyłączyć w Zsh za pomocąset -K
.źródło
sudo
lub coś takiego), możesz to zrobićsudo !!
na przykład. Może to być nieco szybsze niż „Up / Ctrl-A (lub Home, jeśli masz szczęście) / sudo / space / enter”. YMMV. :)echo 'Hi!'
alboecho "Hi!"
alboecho Hi\!
. Wszyscy robią to samo.setopt NO_BANG_HIST
w Zsh może być bardziej niezapomniany niż-K
.Jeśli nie ma tutaj dłuższej odpowiedzi, na pewno jest jedna na Super User, ponieważ niedawno ją przeczytałem. Na stronie podręcznika użytkownika bash można znaleźć ogromną sekcję zatytułowaną HISTORIA EXPANSION w tej sprawie.
Możesz zrobić cały host więcej niż tylko uruchomić ostatnią komendę lub komendę o numerze X. Możesz zrobić rzeczy takie jak
!cat
uruchomienie ostatniej komendy, która się rozpoczęłacat
. Lub!?bash?:s/bash/csh/
uruchamia ostatnie polecenie zawierające,bash
ale zastępuje jecsh
.źródło
!!:s/bash/csh/
faktycznie uruchamia ostatnie polecenie , a następnie zastępuje bash csh, jeśli jest obecny. Nie ostatnie polecenie zawierające bash. To byłoby,!?bash?:s/bash/csh/
a może!?bash?:s/%/csh/
man
strony, ta funkcja jest niesamowicie niejasna. Dziękujemy za wskazanie odpowiedniej sekcji - to jedyne miejsce w rzeczywistych dokumentach, w którym wystarczająco to wyjaśniają.Można zrobić o wiele więcej dzięki
!
:!-3
!ls
i dużo więcej. Zobacz 15 przykładów ekspansji historii Linuksa, które powinieneś znać
źródło
Mój przyjaciel wysłał mi to e-mailem:
źródło
Oczywiście możesz zrobić,
!!
aby ponownie użyć ostatniego polecenia w powłoce bash. A potem jest!$
ponowne użycie ostatniej części ostatniego polecenia.np. przejrzyj jakiś plik
Jeśli chcesz teraz edytować ten sam plik, możesz użyć,
!$
aby uzyskać tylko ścieżkę do pliku z ostatniego poleceniaźródło
$touch f1 f2
a następnie$vim !$
oceni do$vim f2