Где я могу найти документацию по команде «sudo !!»


20

Я только что узнал, что в Linux есть sudo !!команда, которая буквально применяется sudoк последней введенной команде. Я никогда не слышал об этом.

Это общий контроль? Где я могу найти документацию об этом?


4
Возможно, вы захотите проверить commandlinefu.com/commands/browse/sort-by-votes . Некоторые действительно хорошие ярлыки там.
Лев

2
Смотрите также этот ответ
Михаил Мрозек

Ответы:


36

Это просто ярлыки Bash. Это не так sudo!!, кстати. Это sudo !!(обратите внимание на пробел).

В !!основном, bash является расширением предыдущей команды.

Взгляните на раздел «Расширение истории» справочной страницы bash:

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


Я отредактировал свой предыдущий пост, я забыл пробел, как вы сказали!
Пьер-Александр Бушар

О, я нигде не видел этот ярлык!
Пьер-Александр Бушар

29

Это на самом деле 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.

3

Такое разделение функциональности является одним из самых красивых принципов проектирования, делающих 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»), вам необходимо изучить ее один раз, и вы сможете использовать эти мощные возможности везде и всегда. Намного легче изучить один набор мощных принципов и соглашений, чем заново изучать, как агры командной строки обрабатываются в каждой программе или утилите.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.