Вісім маловідомих опцій 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

Додати коментар або відгук