Właśnie dowiedziałem się, że Linux ma sudo !!
polecenie, które dosłownie odnosi sudo
się do ostatnio wprowadzonego polecenia. Nigdy o tym nie słyszałem.
Czy to wspólna kontrola? Gdzie mogę znaleźć dokumentację na ten temat?
Właśnie dowiedziałem się, że Linux ma sudo !!
polecenie, które dosłownie odnosi sudo
się do ostatnio wprowadzonego polecenia. Nigdy o tym nie słyszałem.
Czy to wspólna kontrola? Gdzie mogę znaleźć dokumentację na ten temat?
Odpowiedzi:
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
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 bash
stronie man, w Event Designators
sekcji.
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.
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.