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. ]