GNU/Linux >> Znalost Linux >  >> Linux

Použití slovních modifikátorů s historií Bash v Linuxu

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


Linux
  1. Analýza historie Bash v Linuxu

  2. Použití příkazu Linux Basename ve skriptech Bash

  3. Používáte SDL2 na linuxu s g++?

  1. Používáte zalamování slov s Mc?

  2. Použití Linux Sleep Command ve skriptech Bash

  3. Linux Bash XMLLINT s XPATH

  1. Jak vymazat historii příkazového řádku BASH v Linuxu

  2. Jak vymazat historii Bash na Linuxu

  3. Příklad použití pojmenovaných kanálů v Linux Bash