Gdzie mogę znaleźć dokumentację dotyczącą polecenia „sudo !!”

20

Właśnie dowiedziałem się, że Linux ma sudo !!polecenie, które dosłownie odnosi sudosię do ostatnio wprowadzonego polecenia. Nigdy o tym nie słyszałem.

Czy to wspólna kontrola? Gdzie mogę znaleźć dokumentację na ten temat?

Pier-Alexandre Bouchard
źródło
4
Może chcesz sprawdzić Commandlinefu.com/commands/browse/sort-by-votes . Są tam naprawdę fajne skróty.
Leo
2
Zobacz także tę odpowiedź
Michał Mrożek

Odpowiedzi:

36

To tylko skróty bash. Nawiasem sudo!!mówiąc, nie jest. To sudo !!(zwróć uwagę na spację).

!!W bash jest w zasadzie rozwinięciem poprzedniego polecenia.

Zajrzyj do sekcji „Rozszerzenie historii” na stronie podręcznika bash:

http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators

cjc
źródło
Zredagowałem mój poprzedni post, zapomniałem miejsca, jak powiedziałeś!
Pier-Alexandre Bouchard,
Och, nigdzie nie widziałem tego skrótu!
Pier-Alexandre Bouchard
29

To rzeczywiście sudo !!, który składa się z polecenia sudo, z których na pewno znają, i oznaczenie zdarzenie , !!, który odnosi się do ostatniego wprowadzonego polecenia. Możesz znaleźć więcej na bashstronie man, w Event Designatorssekcji.

Event Designators
   An event designator is a reference to a command line entry in the  his‐
   tory  list.   Unless  the reference is absolute, events are relative to
   the current position in the history list.

   !      Start a history substitution, except when followed by  a  blank,
          newline,  carriage return, = or ( (when the extglob shell option
          is enabled using the shopt builtin).
   !n     Refer to command line n.
   !-n    Refer to the current command minus n.
   !!     Refer to the previous command.  This is a synonym for `!-1'.
   !string
          Refer to the most recent command preceding the current  position
          in the history list starting with string.
   !?string[?]
          Refer to the most recent command preceding the current postition
          in the history list containing string.  The trailing  ?  may  be
          omitted if string is followed immediately by a newline.
   ^string1^string2^
          Quick  substitution.   Repeat  the  previous  command, replacing
          string1 with string2.  Equivalent  to  ``!!:s/string1/string2/''
          (see Modifiers below).
   !#     The entire command line typed so far.
Kevin
źródło
3

Ten rozdział funkcjonalności jest jedną z najpiękniejszych zasad projektowania, dzięki czemu Linux / Unix jest o wiele potężniejszy niż inne alternatywy, w których każdy program stanowi oddzielną niezależną wyspę konwencji i możliwości.

„każ każdemu programowi zrobić jedną rzecz i zrób to dobrze”

Zamiast wdrażania !! wewnątrz sudo (lub dowolnego innego polecenia), które może skorzystać z powtórzenia poprzedniego polecenia - jest ono realizowane raz (w powłokach) i wszystkie polecenia mogą z niego korzystać. Możesz więc zrobić:

$ echo !!     # will echo the last command
$ time !!     # will repeat and time the last command
$ strace !!   # will repeat the last program while system-call tracing it

i tak dalej.

Ale to nie koniec. Powłoka robi znacznie więcej niż rozszerzanie historii za pomocą! oznaczniki zdarzeń. Przed wykonaniem polecenia wykonuje on ekspansję zmiennych, interpretację symboli wieloznacznych nazwa-pliku (globbing), zastępowanie poleceń, przekierowywanie plików / operacji we / wy i wiele innych. Wszystkie z nich można wykorzystać i wykorzystać w dowolnym poleceniu wywoływanym z powłoki.

Kolejną dużą zaletą jest to, że jeśli poświęcasz trochę czasu na naukę swojej powłoki (w tym przypadku „man bash”), musisz się jej nauczyć raz i możesz korzystać z tych potężnych możliwości wszędzie, przez cały czas. O wiele łatwiej jest nauczyć się jednego zestawu potężnych zasad i konwencji, niż ponownie nauczyć się, w jaki sposób agr wiersza poleceń jest obsługiwany w każdym programie lub narzędziu.

arielf
źródło