Некаторыя опцыі 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