Ve svém článku, Parsing Bash history, jsem demonstroval, jak odkazovat na položky v history
vašeho shellu podle čísla řádku i podle pozice slova. Jakmile zvládnete analýzu history
Bash podle indexu řádků a slov můžete těžit z modifikátorů dostupných pro history
příkaz.
Možnost histexpand shell
Než probereme history
analýze, stojí za zmínku, že vykřičník (!
) zápis je dostupný pouze pro váš Bash shell díky histexpand
volba. Protože histexpand
je ve výchozím nastavení povolena, mnoho uživatelů ji nikdy příliš nezvažuje. Je to však možnost, která vynucuje rozšíření !
do seznamu history
záznamy.
Pokud je tato možnost vypnuta, ztratíte tuto funkci. Například:
$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo
Obecně histexpand
je ve výchozím nastavení zapnuto, s výjimkou neinteraktivních shellů (například skriptu shellu). Měl by history
zkrácený text selže, můžete buď aktivovat histexpand
jako možnost shellu nebo jinak použijte úplnou history
příkaz implikovaný histexpand
:
$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo
Ve skriptu shellu musíte aktivovat history
a uveďte umístění, kde je history
lze uložit:
HISTFILE=/tmp/history.log
set -o histexpand
set -e
## some code here
## clean up
rm /tmp/history.log
Výhoda ponechání histexpand
deaktivováno znamená, že ztratíte podrobnost výsledků history
akce. Například pomocí histexpand
aktivována, první věc se vrátila do vašeho shellu po history
command je rozšířená verze toho, co se spouští:
$ set -o histexpand
$ echo foo
foo
$ !!
echo foo
foo
Pomocí histexpand
vypnuto, vaše history
příkaz je delší, ale výsledky jsou stručnější:
$ set +o histexpand
$ echo foo
foo
$ !!
foo
Zda najdete využití pro history
v shell skriptu je na vás, ale history
modifikátory mají některé zajímavé zkratky, díky nimž jsou v některých případech obzvláště pohodlné.
Modifikátory historie
Modifikátory history
výběry jsou označeny dvojtečkou (:
) následovaný jedním modifikačním znakem. Některé modifikátory lze kombinovat s jinými.
Přípona názvu souboru
Chcete-li zrušit příponu argumentu, použijte r
modifikátor.
Je to podobné jako basename
.
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tgz
-rw-r--r-- 1 0 Mar 9 11:23 aFileNameWith-a_complex-syntax-1.rev.tgz
$ echo !!:2:r
echo aLongFileNameWith-a_complex-syntax-1
aLongFileNameWith-a_complex-syntax-1
r
modifikátor není superinteligentní. Prostě najde poslední tečku v názvu souboru a odřízne příponu, která někdy nemusí odpovídat tomu, co si představujete jako příponu souboru, takže v některých ohledech basename
nabízí větší flexibilitu.
$ set +o histexpand
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tar.gz
$ echo !!:2:r
aLongFileNameWith-a_complex-syntax-1.tar
Opačného výsledku lze dosáhnout pomocí e
modifikátor:
$ set +o histexpand
$ echo aLongFileNameWith-a_complex-syntax-1.tgz
aLongFileNameWith-a_complex-syntax-1.tgz
$ echo !!:2:e
.tgz
Názvy souborů
Jednoduchá verze dirname
je k dispozici s h
modifikátor:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:h
src
A druhá strana tohoto výrazu je dostupná pomocí t
modifikátor:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh
Náhrada řetězce
Možná nejužitečnější modifikátor history
je substituce řetězce. Například jakýkoli administrátor smíšeného prostředí to v určitém okamžiku zadal do pole Red Hat Enterprise Linux:
$ sudo apt install tmux
Takovou chybu lze snadno opravit substitucí řetězce:
$ ^apt^dnf
sudo dnf install tmux
Můžete dokonce přidat některé možnosti:
$ ^apt^dnf -y
sudo dnf -y install tmux
Tato history
syntaxe je zkratka pro s
modifikátor. Úplná syntaxe je například !!:s/apt/dnf
a proto může být užitečné pro položky o několik řádků zpět ve vaší history
. Předpokládejme, že jste zadali užitečný příkaz o tři příkazy zpět a chcete nyní spustit podobný příkaz:
$ !-3:s/vi/emacs/
sudo dnf install -y emacs
Jako sed
, tato náhrada se ve výchozím nastavení vyskytuje pouze jednou, ale můžete ji změnit na globální (ve vztahu k řádku, který si vybavujete) pomocí g
modifikátor:
$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3
Bezpečnost především:jak provést historický chod nasucho
Stisknutím Return
po upravené history
řádek může být někdy stresující, zvláště když je řádek, který chcete znovu spustit, vnořený mezi zvlášť nebezpečné příkazy nebo ovlivňuje důležité soubory. Pokud chcete ověřit příkaz, který se chystáte upravit a spustit, můžete použít p
modifikátor na konci history
modifikace.
$ !-32:0-:s/mv/trash/:p
trash important.txt status.txt pay.txt
Příkaz, který vidíte jako výsledek, je rozbalená položka z history
, ale ještě nebyl spuštěn. Můžete jej spustit ručně stisknutím Up
šipka nebo Ctrl+P
, teď, když je to pro vás vyřešeno. Pomocí ověření (p
) je obecně dobrý nápad, pokud s používáním history
teprve začínáte příkaz ve výrobě.
Koneckonců
Vaše historie Bash může být užitečná pro mnoho věcí, ať už jde o ohlédnutí za tím, co jste celý den dělali, nebo jen o zefektivnění vaší práce tím, že znovu použijete kusy informací, ke kterým jste již pracovali. Čím více budete s modifikátory historie cvičit, tím užitečnější budou. Dovolte si (opatrně) některé zakopnout, když se naučíte syntaxi, a brzy si budete vybavovat příkazy a argumenty s menším počtem stisknutí kláves než kdykoli předtím.
[ Chcete si vyzkoušet Red Hat Enterprise Linux? Stáhněte si ji nyní zdarma. ]