Некоторые опции Bash хорошо известны и часто используются. Например, многие в начале скрипта пишут
set -o xtrace
set -o errexit
set -o errunset
set
или shopt
?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
$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..
cdspell
экономит время, буквально каждый день.cd
, то можете установить эту опцию для перемещения в папку Х, если команда Х не существует.$ shopt -s autocd
$ abcdefg
$ cd ..
$ ./abc[TAB][RETURN]
cd -- ./abcdefg
rm -rf *
(да, кстати, это возможно).$ shopt -s direxpand
$ ./[TAB] # заменяется на...
$ /full/path/to/current_working_folder
$ ~/[TAB] # заменяется на...
$ /full/path/to/home/folder
$ $HOME/[TAB] # заменяется на...
$ /full/path/to/home/folder
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 процесса изменился
$ shopt -s globstar
$ ls **
direxpand
можно быстро просматривать всё, что ниже в иерархии:$ shopt -s direxpand
$ ls **[TAB][TAB]
Display all 2033 possibilities? (y or n)
$ shopt -s extglob
$ touch afile bfile cfile
$ ls
afile bfile cfile
$ ls ?(a*|b*)
afile bfile
$ ls !(a*|b*)
cfile
? = соответствует нулю или одному вхождению заданных шаблонов ! = показать всё, что не соответствует заданным шаблонам * = ноль или более вхождений + = одно или более вхождений @ = ровно одно вхождение
!!
и !$
.histverify
позволяет сначала посмотреть, как Bash интерпретирует команду, прежде он на самом деле запустится:$ shopt -s histverify
$ echo !$ # <= По нажатию Enter команда не запускается
$ echo histverify # <= Она сначала демонстрируется на экране,
histverify # <= а потом запускается
>
). Это может стать катастрофой, если у вас нет резервной копии.set -С
запрещает такую перезапись. В случае необходимости можно обойти защиту с помощью оператора >|
:$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$
К сожалению, не доступен сервер mySQL