Я только что узнал, что в Linux есть sudo !!
команда, которая буквально применяется sudo
к последней введенной команде. Я никогда не слышал об этом.
Это общий контроль? Где я могу найти документацию об этом?
Я только что узнал, что в Linux есть sudo !!
команда, которая буквально применяется sudo
к последней введенной команде. Я никогда не слышал об этом.
Это общий контроль? Где я могу найти документацию об этом?
Ответы:
Это просто ярлыки Bash. Это не так sudo!!
, кстати. Это sudo !!
(обратите внимание на пробел).
В !!
основном, bash является расширением предыдущей команды.
Взгляните на раздел «Расширение истории» справочной страницы bash:
http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators
Это на самом деле sudo !!
, который состоит из команды sudo
, с которой вы , вероятно , знакомы, и обозначением событий , !!
, который относится к последней команде введенной. Вы можете найти больше на bash
странице руководства, в Event Designators
разделе.
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.
Такое разделение функциональности является одним из самых красивых принципов проектирования, делающих Linux / Unix намного более мощным, чем другие альтернативы, где каждая программа представляет собой отдельный независимый островок соглашений и возможностей.
«заставить каждую программу делать одно, и делать это хорошо»
Вместо реализации !! внутри sudo (или любой другой команды), которая может выиграть от повторения предыдущей команды - она реализуется один раз (в оболочках), и все команды могут извлечь из нее пользу. Так что вы можете сделать:
$ 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
и так далее.
Но это не заканчивается здесь. Оболочка делает гораздо больше, чем просто расширяет историю через! указатели событий. Перед выполнением вашей команды она выполняет расширение переменных, расширение подстановочного знака имени файла (подстановка), подстановку команд, перенаправление файлов / ввода-вывода и многое другое. Все это можно использовать и использовать в любой команде, вызываемой из оболочки.
Другим большим преимуществом является то, что если вы потратите некоторое время на изучение вашей оболочки (в данном случае «man bash»), вам необходимо изучить ее один раз, и вы сможете использовать эти мощные возможности везде и всегда. Намного легче изучить один набор мощных принципов и соглашений, чем заново изучать, как агры командной строки обрабатываются в каждой программе или утилите.