Восем малавядомых опцый Bash

Некаторыя опцыі Bash добра вядомыя і часта выкарыстоўваюцца. Напрыклад, шмат хто ў пачатку скрыпту пішуць

набор -o xtrace

для адладкі,

усталяваць -o errexit

для выхаду па памылцы або

set -o errunset

для выхаду, калі выкліканая пераменная не ўстаноўлена.

Але ёсць шмат іншых опцый. Часам яны занадта блытана апісаны ў манах, таму я сабраў тут некаторыя з найбольш карысных, з тлумачэннем.

Заўвага: на Mac можа стаяць старая версія bash (3.x, а не 4.x), дзе не ўсе гэтыя опцыі даступныя. У гэтым выпадку глядзіце тут або тут.

set або shopt?

Ёсць два спосабу ўсталёўкі параметраў bash: са скрыпту ці з каманднага радка. Можна выкарыстоўваць убудаваныя каманды set и shopt. Абедзве змяняюць паводзіны абалонкі, робяць шмат у чым адно і тое ж (з рознымі аргументамі), а адрозніваюцца сваім паходжаннем. Параметры set успадкоўваюцца або запазычаюцца з параметраў іншых абалонак, у той час як параметры shopt створаны ў bash.

Калі хочаце паглядзець на бягучыя опцыі, запусціце:

$ set -o
$ shopt

Для актывацыі опцыі ў set выкарыстоўваецца доўгі ці кароткі сінтаксіс:

$ set -o errunset
$ set -e

Эфект аднолькавы.

Каб адключыць опцыю, трэба паставіць плюс замест мінусу:

$ set +e

Доўгі час я не мог запомніць гэты сінтаксіс, паколькі логіка здаецца няправільнай (мінус уключае опцыю, а плюс - адключае).

В shopt для ўключэння і адключэнні опцый выкарыстоўваюцца (больш лагічныя) сцягі -s (set) і -u (unset):

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

Змяненне каталогаў

Ёсць некалькі опцый, якія дапамагаюць працаваць з каталогамі.

1. cdspell

З такой наладай bash пачне разумець памылкі друку і будзе пераносіць вас у тэчку, назоў якой вы набралі з памылкай.

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

Я выкарыстоўваў гэтую опцыю шмат гадоў, і вельмі рэдка (магчыма, раз у год) яна прымае вельмі дзіўнае рашэнне. Але затое ў астатнія дні cdspell эканоміць час, літаральна кожны дзень.

2. autocd

Калі вы не гатовы мірыцца з неэфектыўнасцю шматразовага ўводу cd, то можаце ўсталяваць гэтую опцыю для перамяшчэння ў тэчку Х, калі каманда Х не існуе.

$ shopt -s autocd
$ abcdefg
$ cd ..

У спалучэнні з аўтазапаўненнем гэта дазваляе хутка скакаць па тэчках:

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

Толькі не называйце тэчку rm -rf * (так, дарэчы, гэта магчыма).

3. direxpand

Гэта класная опцыя, якая пашырае зменныя асяроддзі па націску Tab:

$ shopt -s direxpand
$ ./[TAB]     # заменяется на...
$ /full/path/to/current_working_folder
$ ~/[TAB]     # заменяется на...
$ /full/path/to/home/folder
$ $HOME/[TAB] #  заменяется на...
$ /full/path/to/home/folder

Чыстае выйсце

4. checkjobs

Гэты параметр спыняе выхад з сеанса, калі ў фонавым рэжыме яшчэ выконваюцца заданні.

Замест выхаду выводзіцца спіс незавершаных заданняў. Калі вы ўсё роўна хочаце выйсці, то яшчэ раз увядзіце 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 процесса  изменился

Звышздольнасці па падстаноўцы

5. globstar

Гэтая опцыя дае вам звышздольнасці па падстаноўцы! Калі ўвесці:

$ shopt -s globstar
$ ls **

тады абалонка пакажа рэкурсіўна ўсе каталогі і падкаталогі.

У спалучэнні з direxpand можна хутка праглядаць усё, што ніжэй у іерархіі:

$ shopt -s direxpand
$ ls **[TAB][TAB]
Display all 2033 possibilities? (y or n) 

6. extglob

Гэтая опцыя актывуе функцыі, якія часцей асацыююцца з рэгулярнымі выразамі. Часам гэта вельмі карысна:

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

Тут шаблоны змяшчаюцца ў круглыя ​​дужкі і падзяляюцца вертыкальнай рысай. Вось даступныя аператары:

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

Абарона ад няшчасных выпадкаў

7. histverify

Спачатку можа быць крыху страшнавата выкарыстоўваць выкарыстоўваць хуткі запуск каманд з гісторыі скарачэннямі !! и !$.

опцыя histverify дазваляе спачатку паглядзець, як Bash інтэрпрэтуе каманду, перш за ён на самай справе запусціцца:

$ shopt -s histverify
$ echo !$          # <= По нажатию Enter команда не запускается
$ echo histverify  # <= Она сначала демонстрируется на экране,
histverify         # <= а потом запускается 

8. Noclobber

Ізноў жа, для абароны ад няшчасных выпадкаў, а менавіта ад перазапісу файла, які ўжо існуе з аператарам рэдырэкту (>). Гэта можа стаць катастрофай, калі ў вас няма рэзервовай копіі.

опцыя set -С забараняе такі перазапіс. У выпадку неабходнасці можна абысці абарону з дапамогай аператара. >|:

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

Крыніца: habr.com

Дадаць каментар