Π’ΠΎΡΠ΅ΠΌΡŒ малоизвСстных ΠΎΠΏΡ†ΠΈΠΉ Bash

НСкоторыС ΠΎΠΏΡ†ΠΈΠΈ Bash Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстны ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. НапримСр, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π² Π½Π°Ρ‡Π°Π»Π΅ скрипта ΠΏΠΈΡˆΡƒΡ‚

set -o xtrace

для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ,

set -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