Bash
Sostituzioni della cronologia di Bash
Ricerca…
Usando! $
È possibile utilizzare !$
Per ridurre la ripetizione quando si utilizza la riga di comando:
$ echo ping
ping
$ echo !$
ping
Puoi anche costruire sulla ripetizione
$ echo !$ pong
ping pong
$ echo !$, a great game
pong, a great game
Si noti che nell'ultimo esempio non abbiamo ottenuto ping pong, a great game
perché l'ultimo argomento passato al precedente comando era pong
, possiamo evitare problemi come questo aggiungendo virgolette. Continuando con l'esempio, il nostro ultimo argomento è stato il game
:
$ echo "it is !$ time"
it is game time
$ echo "hooray, !$!"
hooray, it is game time!
Riferimento rapido
Interazione con la storia
# List all previous commands
history
# Clear the history, useful if you entered a password by accident
history -c
Designatori di eventi
# 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
!#
Designatori di parole
Questi sono separati da :
dalla designazione dell'evento a cui si riferiscono. I due punti possono essere omessi se il word designator non inizia con un numero !^
È lo stesso di !:^
.
# 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 :^-$
!*
modificatori
Questi modificano l'evento precedente o il designatore di parole.
# 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
Se la variabile di Bash HISTCONTROL
contiene ignorespace
o ignoreboth
(o, in alternativa, HISTIGNORE
contiene il modello [ ]*
), puoi impedire che i tuoi comandi vengano memorizzati nella cronologia di Bash anteponendoli con uno spazio:
# This command won't be saved in the history
foo
# This command will be saved
bar
Cerca nella cronologia dei comandi per modello
Premi control r e digita un pattern.
Ad esempio, se hai recentemente eseguito man 5 crontab
, puoi trovarlo rapidamente iniziando a digitare "crontab". Il prompt cambierà in questo modo:
(reverse-i-search)`cr': man 5 crontab
Il `cr'
là è la stringa che ho digitato finora. Questa è una ricerca incrementale, così come si continua a digitare, il risultato della ricerca viene aggiornato per corrispondere al comando più recente che conteneva il modello.
Premere i tasti freccia sinistra o destra per modificare il comando corrispondente prima di eseguirlo o il tasto Invio per eseguire il comando.
Per impostazione predefinita, la ricerca trova il comando eseguito più recentemente che corrisponde al modello. Per tornare indietro nella cronologia, premere nuovamente control r . Puoi premere più volte fino a trovare il comando desiderato.
Passa alla directory appena creata con! #: N
$ mkdir backup_download_directory && cd !#:1
mkdir backup_download_directory && cd backup_download_directory
Questo sostituirà l'argomento Nth del comando corrente. Nell'esempio !#:1
viene sostituito con il primo argomento, ovvero backup_download_directory.
Ripeti il comando precedente con una sostituzione
$ mplayer Lecture_video_part1.mkv
$ ^1^2^
mplayer Lecture_video_part2.mkv
Questo comando sostituirà 1
con 2
nel comando eseguito in precedenza. Sostituirà solo la prima occorrenza della stringa ed è equivalente a !!:s/1/2/
.
Se vuoi sostituire tutte le occorrenze, devi usare !!:gs/1/2/
o !!:as/1/2/
.
Ripeti il comando precedente con 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>: