Nekatere možnosti Bash so dobro znane in pogosto uporabljene. Na primer, veliko ljudi piše na začetku scenarija
nastavi -o xtrace
za odpravljanje napak,
nastavite -o errexit
pomotoma izstopiti oz
set -o napaka
za izhod, če klicana spremenljivka ni nastavljena.
Vendar obstaja veliko drugih možnosti. Včasih so v manah opisani preveč zmedeno, zato sem tukaj zbral nekaj najbolj uporabnih z razlago.
Opomba: računalniki Mac imajo morda starejšo različico bash (3.x namesto 4.x), kjer niso na voljo vse te možnosti. V tem primeru glej
set
ali shopt
?
Možnosti bash lahko nastavite na dva načina: iz skripta ali iz ukazne vrstice. Uporabite lahko vgrajene ukaze set
и shopt
. Oba spreminjata vedenje lupine, delata približno isto stvar (z različnimi argumenti), vendar se razlikujeta po svojih set
so podedovani ali izposojeni od parametrov drugih lupin, medtem ko parametri shopt
ustvarjen v bashu.
Če želite videti trenutne možnosti, zaženite:
$ set -o
$ shopt
Za aktiviranje možnosti v set
Uporablja se dolga ali kratka sintaksa:
$ set -o errunset
$ set -e
Učinek je enak.
Če želite onemogočiti možnost, morate namesto minusa dati plus:
$ set +e
Dolgo časa se nisem mogel spomniti te sintakse, ker se mi je logika zdela napačna (znak minus omogoči možnost, znak plus pa jo onemogoči).
В shopt
(bolj logične) zastavice se uporabljajo za omogočanje in onemogočanje možnosti -s
(set) in -u
(nenastavljeno):
$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off
Spreminjanje imenikov
Obstaja več možnosti, ki vam pomagajo pri delu z imeniki.
1.cdspell
S to nastavitvijo bo bash začel razumeti tipkarske napake in vas popeljal v mapo, katere ime ste napačno črkovali.
$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..
To možnost uporabljam že vrsto let in zelo redko (mogoče enkrat na leto) naredi zelo čudno odločitev. Ampak ob drugih dneh cdspell
prihrani čas, dobesedno vsak dan.
2. autocd
Če niste pripravljeni sprejeti neučinkovitosti večkratnih vnosov cd
, potem lahko to možnost nastavite tako, da se premakne v mapo X, če ukaz X ne obstaja.
$ shopt -s autocd
$ abcdefg
$ cd ..
V kombinaciji s samodokončanjem vam to omogoča hitro skakanje med mapami:
$ ./abc[TAB][RETURN]
cd -- ./abcdefg
Samo ne poimenuj mape rm -rf *
(ja, mimogrede, to je mogoče).
3.direxpand
To je kul možnost, ki razširi spremenljivke okolja s pritiskom na Tab:
$ shopt -s direxpand
$ ./[TAB] # заменяется на...
$ /full/path/to/current_working_folder
$ ~/[TAB] # заменяется на...
$ /full/path/to/home/folder
$ $HOME/[TAB] # заменяется на...
$ /full/path/to/home/folder
čisti izhod
4. checkjobs
Ta možnost ustavi odjavo iz seje, če v ozadju še vedno potekajo opravila.
Namesto izhoda se prikaže seznam nedokončanih opravil. Če še vedno želite izstopiti, vstopite znova exit
.
$ shopt -s checkjobs
$ echo $$
68125 # <= ID процесса для оболочки
$ sleep 999 &
$ exit
There are running jobs.
[1]+ Running sleep 999 &
$ echo $$
68125 # <= ID процесса для оболочки тот же
$ exit
There are running jobs.
[1]+ Running sleep 999 &
$ exit
$ echo $$
$ 59316 # <= на этот раз ID процесса изменился
Nadomestne velemoči
5.globstar
Ta možnost vam daje nadomestne supermoči! Če vnesete:
$ shopt -s globstar
$ ls **
potem bo lupina rekurzivno prikazala vse imenike in podimenike.
V kombinaciji z direxpand
Hitro si lahko ogledate vse nižje v hierarhiji:
$ shopt -s direxpand
$ ls **[TAB][TAB]
Display all 2033 possibilities? (y or n)
6.extglob
Ta možnost omogoča funkcije, ki so pogosteje povezane z regularnimi izrazi. Včasih je to zelo koristno:
$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile
Tukaj so vzorci postavljeni v oklepaje in ločeni z navpično črto. Tukaj so razpoložljivi operaterji:
? = se ujema z nič ali eno pojavitvijo danih vzorcev! = pokaži vse, kar se ne ujema z danimi vzorci * = nič ali več pojavitev + = ena ali več pojavitev @ = točno ena pojavitev
Zaščita pred nesrečami
7. histverify
Na začetku je lahko nekoliko strašljivo, če uporabimo ukaze za hitri zagon iz zgodovine okrajšav !!
и !$
.
Možnost histverify
vam omogoča, da najprej vidite, kako Bash interpretira ukaz, preden se dejansko zažene:
$ shopt -s histverify
$ echo !$ # <= По нажатию Enter команда не запускается
$ echo histverify # <= Она сначала демонстрируется на экране,
histverify # <= а потом запускается
8. Noclobber
Spet za zaščito pred nesrečami, in sicer pred prepisovanjem datoteke, ki že obstaja z operaterjem preusmeritve (>
). To je lahko katastrofa, če nimate varnostne kopije.
Možnost set -С
prepoveduje takšno prepisovanje. Po potrebi lahko zaščito zaobidete z operaterjem >|
:
$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$
Vir: www.habr.com