Osm málo známých možností Bash

Některé volby Bash jsou dobře známé a často používané. Například mnozí na začátku skriptu píší

set -o xtrace

pro ladění,

set -o errexit

pro ukončení při chybě nebo

set -o errunset

pro ukončení, pokud není proměnná nastavena.

Ale existuje mnoho dalších voleb. Někdy jsou v manuálech popsány příliš zmateně, proto jsem zde shromáždil některé z nejvíce užitečných, s vysvětlením.

Poznámka: Na Macu může být starší verze bash (3.x, nikoli 4.x), kde nejsou všechny tyto volby dostupné. V takovém případě se podívejte na zde nebo zde.

set nebo shopt?

Existují dva způsoby, jak nastavit volby bash: ze skriptu nebo z příkazového řádku. Lze použít zabudované příkazy set a shopt. Oba mění chování shellu, dělají v mnoha ohledech to samé (s různými argumenty) a liší se svým původem. Volby set se dědí nebo přebírají z voleb jiných shellů, zatímco volby shopt jsou vytvořeny v bash.

Pokud chcete vidět aktuální volby, spusťte:

$ set -o
$ shopt

Pro aktivaci volby v set se používá dlouhá nebo krátká syntaxe:

$ set -o errunset
$ set -e

Efekt je stejný.

Chcete-li volbu vypnout, musíte místo mínusu použít plus:

$ set +e

Dlouho jsem si nemohl zapamatovat tuto syntaxi, protože logika se zdá být nesprávná (mínus zahrnuje volbu, zatímco plus — vypíná).

V shopt pro zapnutí a vypnutí voleb se používají (logičtější) příznaky -s (set) a -u (unset):

$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off

Změna adresářů

Existuje několik voleb, které pomáhají při práci s adresáři.

1. cdspell

S tímto nastavením začne bash rozumět překlepům a přenese vás do složky, jejíž název jste zadali chybně.

$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..

Tuto volbu jsem používal mnoho let a velmi zřídka (asi jednou za rok) se rozhodne velmi podivně. Ale v ostatních dnech cdspell šetří čas, doslova každý den.

2. autocd

Pokud nejste ochotni smířit se s neefektivností opakovaného zadávání cd, můžete tuto volbu nastavit pro přesun do složky X, pokud příkaz X neexistuje.

$ shopt -s autocd
$ abcdefg
$ cd ..

V kombinaci s automatickým doplňováním to umožňuje rychle přeskakovat mezi složkami:

$ ./abc[TAB][RETURN]
cd -- ./abcdefg

Jen nezapomeňte nenazvat složku rm -rf * (ano, mimochodem, to je možné).

3. direxpand

To je skvělá volba, která rozšiřuje proměnné prostředí stisknutím Tab:

$ shopt -s direxpand
$ .\/[TAB]     # nahrazuje se na...
$ \/full\/path\/to\/current_working_folder
$ ~\/[TAB]     # nahrazuje se na...
$ \/full\/path\/to\/home\/folder
$ $HOME\/[TAB] #  nahrazuje se na...
$ \/full\/path\/to\/home\/folder

Čistý výstup

4. checkjobs

Tato volba zastavuje odchod ze sezení, pokud se na pozadí stále vykonávají úlohy.

Místo odchodu se zobrazí seznam neukončených úloh. Pokud chcete stále odejít, zadejte to znovu exit.

$ shopt -s checkjobs
$ echo $$
68125             # <= ID procesu pro shell
$ sleep 999 &
$ exit
Existují běžící úlohy.
[1]+  Running                 sleep 999 &
$ echo $$
68125             # <= ID procesu pro shell je stejné
$ exit
Existují běžící úlohy.
[1]+  Running                 sleep 999 &
$ exit
$ echo $$
$ 59316           # <= tentokrát se ID procesu změnilo

Nadpřirozené schopnosti pro zástupce

5. globstar

Tato volba vám dává nadpřirozené schopnosti pro zástupce! Pokud zadáte:

$ shopt -s globstar
$ ls **

pak shell zobrazí všechny adresáře a podsložky rekurzivně.

V kombinaci s direxpand můžete rychle procházet všechno, co je níže v hierarchii:

$ shopt -s direxpand
$ ls **[TAB][TAB]
Zobrazit všech 2033 možností? (y nebo n) 

6. extglob

Tato volba aktivuje funkce, které se obvykle spojují s regulárními výrazy. Někdy je to velmi užitečné:

$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile

Zde jsou vzory umístěny do kulatých závorek a odděleny svislou čarou. Zde jsou dostupné operátory:

? = соответствует нулю или одному вхождению заданных шаблонов
! = показать всё, что не соответствует заданным шаблонам
* = ноль или более вхождений
+ = одно или более вхождений
@ = ровно одно вхождение

Ochrana proti nehodám

7. histverify

Zpočátku může být trochu děsivé používat rychlé spouštění příkazů z historie zkratek !! a !$.

Volba histverify vám umožňuje nejprve vidět, jak Bash interpretuje příkaz, než skutečně spustí:

$ shopt -s histverify
$ echo !$          # <= Po stisknutí Enter příkaz se nespustí
$ echo histverify  # <= Nejprve se zobrazí na obrazovce,
histverify         # <= a pak se spustí 

8. Noclobber

Opět, pro ochranu proti nehodám, konkrétně proti přepsání souboru, který již existuje s operátorem přesměrování (>). To může být katastrofa, pokud nemáte zálohu.

Volba set -C zakazuje takové přepsání. V případě potřeby můžete ochranu obejít pomocí operátoru >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster