Je viens d'apprendre que Linux a une sudo !!
commande qui s'applique littéralement sudo
à la dernière commande entrée. Je n'en avais jamais entendu parler.
Est-ce un contrôle commun? Où puis-je trouver de la documentation à ce sujet?
Je viens d'apprendre que Linux a une sudo !!
commande qui s'applique littéralement sudo
à la dernière commande entrée. Je n'en avais jamais entendu parler.
Est-ce un contrôle commun? Où puis-je trouver de la documentation à ce sujet?
Réponses:
Ce ne sont que des raccourcis bash. Ce n'est pas sudo!!
, d'ailleurs. C'est sudo !!
(notez l'espace).
La commande !!
in bash est essentiellement une extension de la commande précédente.
Jetez un œil à la section "History Expansion" de la page de manuel bash:
http://www.gnu.org/software/bash/manual/bashref.html#Event-Designators
Il est en fait sudo !!
, qui se compose de la commande sudo
, avec laquelle vous êtes probablement familier, et un désignateur événement , !!
qui se réfère à la dernière commande entrée. Vous pouvez en trouver plus dans la bash
page de manuel, sous la Event Designators
section.
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.
Cette séparation des fonctionnalités est l'un des plus beaux principes de conception rendant Linux / Unix tellement plus puissant que les autres alternatives où chaque programme est un îlot indépendant distinct de conventions et de capacités.
"faire en sorte que chaque programme fasse une chose et le fasse bien"
Plutôt que d'implémenter !! dans sudo (ou toute autre commande) qui peut bénéficier de la répétition de la commande précédente - elle est implémentée une fois (dans les shells) et toutes les commandes peuvent en bénéficier. Vous pouvez donc faire:
$ 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
etc.
Mais cela ne s'arrête pas là. Le shell fait bien plus que d'étendre l'histoire via le! désignateurs d'événements. Avant d'exécuter votre commande, il effectue une expansion variable, une expansion générique du nom de fichier (globbing), une substitution de commande, une redirection de fichier / E / S et bien plus encore. Tout cela peut être exploité et utilisé dans n'importe quelle commande qui est invoquée à partir du shell.
Un autre gros avantage est que si vous passez un peu de temps à apprendre votre shell (`` man bash '' dans ce cas), vous devez l'apprendre une fois et vous pouvez utiliser ces puissantes capacités partout, tout le temps. Il est beaucoup plus facile d'apprendre un ensemble de principes et de conventions puissants, plutôt que de réapprendre comment les agrs de ligne de commande sont traités dans chaque programme ou utilitaire.