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 nebo .
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 . 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 -eEfekt je stejný.
Chcete-li volbu vypnout, musíte místo mínusu použít plus:
$ set +eDlouho 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 # <= offZmě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ěniloNadpř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*)
cfileZde 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
