Bash
Substitutions d'histoire de Bash
Recherche…
En utilisant! $
Vous pouvez utiliser le !$
Pour réduire la répétition lorsque vous utilisez la ligne de commande:
$ echo ping
ping
$ echo !$
ping
Vous pouvez également tirer parti de la répétition
$ echo !$ pong
ping pong
$ echo !$, a great game
pong, a great game
Notez que dans le dernier exemple, nous n'avons pas obtenu de ping pong, a great game
car le dernier argument passé à la commande précédente était pong
, nous pouvons éviter un tel problème en ajoutant des guillemets. En continuant avec l'exemple, notre dernier argument était le game
:
$ echo "it is !$ time"
it is game time
$ echo "hooray, !$!"
hooray, it is game time!
Référence rapide
Interaction avec l'histoire
# List all previous commands
history
# Clear the history, useful if you entered a password by accident
history -c
Indicateurs d'événements
# Expands to line n of bash history
!n
# Expands to last command
!!
# Expands to last command starting with "text"
!text
# Expands to last command containing "text"
!?text
# Expands to command n lines ago
!-n
# Expands to last command with first occurrence of "foo" replaced by "bar"
^foo^bar^
# Expands to the current command
!#
Désignateurs de mots
Ceux-ci sont séparés par :
de l'indicateur d'événement auquel ils se réfèrent. Les deux points peuvent être omis si le mot désignateur ne commence pas par un nombre !^
Est le même que !:^
.
# Expands to the first argument of the most recent command
!^
# Expands to the last argument of the most recent command (short for !!:$)
!$
# Expands to the third argument of the most recent command
!:3
# Expands to arguments x through y (inclusive) of the last command
# x and y can be numbers or the anchor characters ^ $
!:x-y
# Expands to all words of the last command except the 0th
# Equivalent to :^-$
!*
Modificateurs
Ceux-ci modifient l'événement précédent ou le désignateur de mot.
# Replacement in the expansion using sed syntax
# Allows flags before the s and alternate separators
:s/foo/bar/ #substitutes bar for first occurrence of foo
:gs|foo|bar| #substitutes bar for all foo
# Remove leading path from last argument ("tail")
:t
# Remove trailing path from last argument ("head")
:h
# Remove file extension from last argument
:r
Si la variable Bash HISTCONTROL
contient ignorespace
ou ignoreboth
(ou, alternativement, HISTIGNORE
contient le modèle [ ]*
), vous pouvez empêcher que vos commandes soient stockées dans l'historique Bash en les ajoutant avec un espace:
# This command won't be saved in the history
foo
# This command will be saved
bar
Rechercher dans l'historique des commandes par pattern
Appuyez sur la commande r et tapez un motif.
Par exemple, si vous avez récemment exécuté man 5 crontab
, vous pouvez le trouver rapidement en commençant à taper "crontab". L'invite changera comme ceci:
(reverse-i-search)`cr': man 5 crontab
Le `cr'
il y a la chaîne que j'ai tapé jusqu'ici. Il s'agit d'une recherche incrémentielle. Lorsque vous continuez à taper, le résultat de la recherche est mis à jour pour correspondre à la commande la plus récente contenant le modèle.
Appuyez sur les touches fléchées gauche ou droite pour modifier la commande correspondante avant de l'exécuter ou sur la touche Entrée pour exécuter la commande.
Par défaut, la recherche trouve la dernière commande exécutée correspondant au motif. Pour revenir plus loin dans l'historique, appuyez à nouveau sur la commande r . Vous pouvez appuyer dessus à plusieurs reprises jusqu'à ce que vous trouviez la commande souhaitée.
Passez au répertoire nouvellement créé avec! #: N
$ mkdir backup_download_directory && cd !#:1
mkdir backup_download_directory && cd backup_download_directory
Cela remplacera le Nième argument de la commande en cours. Dans l'exemple !#:1
est remplacé par le premier argument, ie backup_download_directory.
Répéter la commande précédente avec une substitution
$ mplayer Lecture_video_part1.mkv
$ ^1^2^
mplayer Lecture_video_part2.mkv
Cette commande remplacera 1
par 2
dans la commande précédemment exécutée. Il ne remplacera que la première occurrence de la chaîne et équivaut à !!:s/1/2/
.
Si vous voulez remplacer toutes les occurrences, vous devez utiliser !!:gs/1/2/
ou !!:as/1/2/
.
Répéter la commande précédente avec sudo
$ apt-get install r-base
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
$ sudo !!
sudo apt-get install r-base
[sudo] password for <user>: