Odpowiedzi:
Najprostszym sposobem jest uruchomienie:
sudo !!
Uruchomi to ostatnie polecenie, ale jako superużytkownik.
Źródło .
!!
na własną rękę uruchamia poprzednie polecenie zgodnie z zapisanym w history
. Ponadto wykonywanie !-1
, !-2
itd. Wykonuje ostatnie polecenie, drugie ostatnie polecenie i tak dalej. Poręczny!
!<command>
wykona ostatnie wydarzenie od ~/.bash_history
tego początku<command>
!
bashowa kopia, która została skopiowana tcsh
, spieprzyła mnie więcej razy niż kiedykolwiek była użyteczna. Podwójne cytaty nie chronią przed interpretacją !
. $ foo "!bar"
-> !bar: event not found
.
W pobliżu
odpowiedź : wchodzisz sudo !!
bezpośrednio po nim, aby powtórzyć poprzednie polecenie ze zwiększonymi uprawnieniami.
edytuj: Obraz znaleziony przez reddit , i jest to parodia oryginalnego komiksu xkcd autorstwa Randalla Munroe.
Możesz spróbować użyć klawisza strzałki w górę, aby przewijać stare polecenia, przepisywać / zmieniać je i dodawać sudo
przed nimi. (przycisk Home nad klawiszami strzałek ustawi pozycję na początek.)
Nie podoba mi się ten sudo !!
pomysł, ponieważ czasami dodajesz kolejne polecenie i już nie pamiętasz.
sudo !!
, powłoka rozszerzy się !!
, abyś mógł zobaczyć, jakie polecenie próbuje uruchomić. Więc może irytujące jest naciśnięcie Ctrl-C i znalezienie właściwego polecenia, ale przynajmniej nie zabierze cię to nieoczekiwanie.
!!
sudo !!<TAB>
a !!
dla mnie autouzupełnianie . Bash może poszerzać historię za pomocą M-^
(dla mnie, Alt + Shift + 6), ale jest to mniej płynne (można to jednak ponownie powiązać). Istnieje również shopt -s histverify
funkcja, która sprawia, że gdy używasz rozszerzenia historii i naciskasz klawisz Enter, zamiast tego wyświetla ci się kolejny wiersz zachęty z wykonanym rozwinięciem, abyś mógł go zobaczyć / edytować.
shopt -s histverify
nie pomoże ani trochę. Większość ludzi przyzwyczai się do Enter
dwukrotnego uderzenia . W tym momencie są jeszcze za późno, aby sprawdzić, co się stało.
Dodam tylko alternatywę: tak krótkie jak pisanie sudo !!
i bardziej elastyczne:
Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A (place cursor at beginning of line)
"sudo "
Enter
Jest to dokładnie taka sama liczba naciśnięć klawiszy (liczę „ctrl + A” jako jeden ...), ale dodając „strzałkę w górę” możesz to zrobić na dowolnym poleceniu w twojej historii.
set -o vi
). Następnie możesz uciec (przejdź do trybu poleceń), a następnie „I” (wielkie „i”, wstaw na początku wiersza).
Można to zrobić na kilka sposobów
Po prostu wprowadź polecenie ponownie, dodając sudo
przed poleceniem
Naciśnij, Up arrowaby uzyskać ostatnie polecenie i umieścić je sudo
przed nim.
Wchodzić sudo !!
W !!
rozszerza się do ostatniego polecenia wprowadzone. Możesz robić podobne rzeczy z innymi rzeczami dzięki historii wiersza poleceń, patrz tutaj
To pytanie można by uogólnić na „ Uruchom to samo polecenie, ale z pewną modyfikacją ”, ponieważ jedną z genialnych decyzji projektowych w Uniksie jest to, że to, co zaimplementowano raz w powłoce, może być wykorzystane przez dowolne polecenie wywoływane z powłoki.
Innymi słowy, ta sztuczka nie stosuje się tylko do sudo
:
sudo !!
)time !!
)env A=b B=z !!
)!!
)Rozszerzanie historii (znane również jako podstawianie historii) to po prostu funkcja powłoki, która ułatwia powtarzanie poprzednich poleceń (przy mniejszej liczbie naciśnięć klawiszy). Sprawdź swoją stronę podręcznika użytkownika powłoki pod kątem history expansion
. Opisuje wiele innych sztuczek i skrótów, które możesz zrobić z historią, na przykład:
Możesz odwoływać się do poprzednich poleceń według numeru:
!55 # repeat command number 55
!-1 # repeat the previous command, alias for !!
!-2 # repeat the command before the previous command
W poprzednich poleceniach możesz odnosić się do poszczególnych słów:
some-command !$ # run some-command on the last arg of previous command
Możesz także wyszukać przed powtórzeniem:
!?awk # repeat the last command including the string 'awk'
Możesz przeszukać historię i zastąpić coś innym:
!?awk?:s/str1/str2/ # repeat previous command matching 'awk' replacing str1 by str2
I wiele więcej, ponieważ można łączyć wybór poleceń, wybór argumentów, wyszukiwanie i zastępowanie niezależnie.
Strona man twojej powłoki (w tym przypadku man bash
) jest twoim przyjacielem.
Używam zsh zamiast bash i mam to w mojej ~/.zshrc
, więc naciśnięcie Alt+ Swstawia sudo
na początku wiersza poleceń:
insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo
Niestety nie udało mi się znaleźć sposobu na zrobienie tego samego w bashu.
Jeśli chcesz to zrobić w aliasie, musisz użyć alias redo='sudo $(history -p !!)'
z jakiegoś powodu.
Tak jak wolę:
Ale może być łatwiej po prostu zrobić „sudo !!”, to zależy od ciebie.