Деякі опції 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