рдЖрда рдЕрд▓реНрдк-рдЬреНрдЮрд╛рдд рдмреЕрд╢ рдкрд░реНрдпрд╛рдп

рдХрд╛рд╣реА рдмреЕрд╢ рдкрд░реНрдпрд╛рдп рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рдЖрдгрд┐ рдЕрдиреЗрдХрджрд╛ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддрд╛рдд. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдмрд░реЗрдЪ рд▓реЛрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рд▓рд┐рд╣рд┐рддрд╛рдд

рд╕реЗрдЯ-рдУрдХреНрд╕реНрдЯреНрд░реЗрд╕

рдбреАрдмрдЧрд┐рдВрдЧрд╕рд╛рдареА,

рд╕реЗрдЯ -рдУ рддреНрд░реБрдЯреА

рдЪреБрдХреВрди рдмрд╛рд╣реЗрд░ рдкрдбрдгреЗ рдХрд┐рдВрд╡рд╛

set -o errunset

рдХреЙрд▓ рдХреЗрд▓реЗрд▓реЗ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рд╕реЗрдЯ рдХреЗрд▓реЗрд▓реЗ рдирд╕рд▓реНрдпрд╛рд╕ рдмрд╛рд╣реЗрд░ рдкрдбрдгреНрдпрд╛рд╕рд╛рдареА.

рдкрдг рдЗрддрд░ рдЕрдиреЗрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд. рдХрдзреАрдХрдзреА рдорд╛рдирд╕рдордзреНрдпреЗ рддреНрдпрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдЦреВрдк рдЧреЛрдВрдзрд│рд╛рдд рдЯрд╛рдХрд▓реЗ рдЬрд╛рддреЗ, рдореНрд╣рдгреВрди рдореА рдпреЗрдереЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рд╕рд╣ рдХрд╛рд╣реА рдЙрдкрдпреБрдХреНрдд рдЧреЛрд╖реНрдЯреА рдЧреЛрд│рд╛ рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд.

рдЯреАрдк: Macs рдордзреНрдпреЗ bash рдЪреА рдЬреБрдиреА рдЖрд╡реГрддреНрддреА рдЕрд╕реВ рд╢рдХрддреЗ (3.x рдРрд╡рдЬреА 4.x) рдЬрд┐рдереЗ рд╣реЗ рд╕рд░реНрд╡ рдкрд░реНрдпрд╛рдп рдЙрдкрд▓рдмреНрдз рдирд╛рд╣реАрдд. рдпрд╛ рдкреНрд░рдХрд░рдгрд╛рдд, рдкрд╣рд╛ рдпреЗрдереЗ рдХрд┐рдВрд╡рд╛ рдпреЗрдереЗ.

set рдХрд┐рдВрд╡рд╛ shopt?

рдмреЕрд╢ рдкрд░реНрдпрд╛рдп рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪреЗ рджреЛрди рдорд╛рд░реНрдЧ рдЖрд╣реЗрдд: рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреВрди рдХрд┐рдВрд╡рд╛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрдирд╡рд░реВрди. рддреБрдореНрд╣реА рдЕрдВрдЧрднреВрдд рдХрдорд╛рдВрдб рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ set ╨╕ shopt. рджреЛрдШреЗрд╣реА рд╢реЗрд▓рдЪреЗ рд╡рд░реНрддрди рдмрджрд▓рддрд╛рдд, рдмрд░реЗрдЪ рдХрд╛рд╣реА рд╕рдорд╛рди рдХрд░рддрд╛рдд (рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдпреБрдХреНрддрд┐рд╡рд╛рджрд╛рдВрд╕рд╣), рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдЪреНрдпрд╛рдордзреНрдпреЗ рднрд┐рдиреНрди рдЕрд╕рддрд╛рдд рдореВрд│... рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ set рдЗрддрд░ рд╢реЗрд▓рдЪреНрдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдордзреВрди рд╡рд╛рд░рд╕рд╛ рдХрд┐рдВрд╡рд╛ рдХрд░реНрдЬ рдШреЗрддрд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд, рддрд░ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ shopt рдмреЕрд╢ рдордзреНрдпреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ.

рдЖрдкрдг рд╡рд░реНрддрдорд╛рди рдкрд░реНрдпрд╛рдп рдкрд╛рд╣реВ рдЗрдЪреНрдЫрд┐рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдЪрд╛рд▓рд╡рд╛:

$ set -o
$ shopt

рдордзреНрдпреЗ рдкрд░реНрдпрд╛рдп рд╕рдХреНрд░рд┐рдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА set рд▓рд╛рдВрдм рдХрд┐рдВрд╡рд╛ рд▓рд╣рд╛рди рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ:

$ set -o errunset
$ set -e

рдкреНрд░рднрд╛рд╡ рд╕рдорд╛рди рдЖрд╣реЗ.

рдкрд░реНрдпрд╛рдп рдЕрдХреНрд╖рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рдЬрд╛ рдРрд╡рдЬреА рдкреНрд▓рд╕ рдареЗрд╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ:

$ set +e

рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рдорд▓рд╛ рд╣рд╛ рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЖрдард╡рдд рдирд╛рд╣реА рдХрд╛рд░рдг рддрд░реНрдХ рдЪреБрдХреАрдЪрд╛ рд╡рд╛рдЯрдд рд╣реЛрддрд╛ (рд╡рдЬрд╛ рдЪрд┐рдиреНрд╣ рдкрд░реНрдпрд╛рдп рд╕рдХреНрд╖рдо рдХрд░рддреЗ рдЖрдгрд┐ рдЕрдзрд┐рдХ рдЪрд┐рдиреНрд╣ рддреЗ рдЕрдХреНрд╖рдо рдХрд░рддреЗ).

╨Т shopt (рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ) рдзреНрд╡рдЬ рдкрд░реНрдпрд╛рдп рд╕рдХреНрд╖рдо рдЖрдгрд┐ рдЕрдХреНрд╖рдо рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддрд╛рдд -s (рд╕реЗрдЯ) рдЖрдгрд┐ -u (рд╕реЗрдЯ рди рдХреЗрд▓реЗрд▓реЗ):

$ shopt -s cdspell # <= on
$ shopt -u cdspell # <= off

рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрджрд▓рдгреЗ

рдбрд┐рд░реЗрдХреНрдЯрд░реАрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕ рдорджрдд рдХрд░рдгрд╛рд░реЗ рдЕрдиреЗрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд.

1.рд╕реАрдбреАрд╕реНрдкреЗрд▓

рдпрд╛ рд╕реЗрдЯрд┐рдВрдЧрд╕рд╣, bash рдЯрд╛рдпрдкреЛрдЬ рд╕рдордЬрдгреНрдпрд╛рд╕ рд╕реБрд░рд╡рд╛рдд рдХрд░реЗрд▓ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдШреЗрдКрди рдЬрд╛рдИрд▓ рдЬреНрдпрд╛рдЪреЗ рдирд╛рд╡ рддреБрдореНрд╣реА рдЪреБрдХреАрдЪреЗ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ.

$ shopt -s cdspell
$ mkdir abcdefg
$ cd abcdeg
abcdefg
$ cd ..

рдореА рдмрд░реНрдпрд╛рдЪ рд╡рд░реНрд╖рд╛рдВрдкрд╛рд╕реВрди рд╣рд╛ рдкрд░реНрдпрд╛рдп рд╡рд╛рдкрд░рдд рдЖрд╣реЗ рдЖрдгрд┐ рдлрд╛рд░рдЪ рдХреНрд╡рдЪрд┐рддрдЪ (рдХрджрд╛рдЪрд┐рдд рд╡рд░реНрд╖рд╛рддреВрди рдПрдХрджрд╛) рддреЛ рдПрдХ рдЕрддрд┐рд╢рдп рд╡рд┐рдЪрд┐рддреНрд░ рдирд┐рд░реНрдгрдп рдШреЗрддреЛ. рдкрдг рдЗрддрд░ рджрд┐рд╡рд╢реА cdspell рд╡реЗрд│ рд╡рд╛рдЪрд╡рддреЗ, рдЕрдХреНрд╖рд░рд╢рдГ рджрд░рд░реЛрдЬ.

2. рдСрдЯреЛрд╕реАрдбреА

рдЖрдкрдг рдПрдХрд╛рдзрд┐рдХ рдиреЛрдВрджреАрдВрдЪреА рдЕрдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реНрд╡реАрдХрд╛рд░рдгреНрдпрд╛рд╕ рддрдпрд╛рд░ рдирд╕рд▓реНрдпрд╛рд╕ cd, рдирдВрддрд░ X рдХрдорд╛рдВрдб рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕рд▓реНрдпрд╛рд╕ X рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рд╣рд▓рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рд╣рд╛ рдкрд░реНрдпрд╛рдп рд╕реЗрдЯ рдХрд░реВ рд╢рдХрддрд╛.

$ shopt -s autocd
$ abcdefg
$ cd ..

рд╕реНрд╡рдпрдВрдкреВрд░реНрдг рд╕рд╣ рдПрдХрддреНрд░рд┐рдд, рд╣реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдлреЛрд▓реНрдбрд░ рджрд░рдореНрдпрд╛рди рджреНрд░реБрддрдкрдгреЗ рдЬрд╛рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ:

$ ./abc[TAB][RETURN]
cd -- ./abcdefg

рдлрдХреНрдд рдлреЛрд▓реНрдбрд░рд▓рд╛ рдирд╛рд╡ рджреЗрдК рдирдХрд╛ rm -rf * (рд╣реЛрдп, рддрд╕реЗ, рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ).

3.direexpand

рд╣рд╛ рдПрдХ рдЫрд╛рди рдкрд░реНрдпрд╛рдп рдЖрд╣реЗ рдЬреЛ рдЯреЕрдм рджрд╛рдмреВрди рдкрд░реНрдпрд╛рд╡рд░рдг рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЛ:

$ shopt -s direxpand
$ ./[TAB]     # ╨╖╨░╨╝╨╡╨╜╤П╨╡╤В╤Б╤П ╨╜╨░...
$ /full/path/to/current_working_folder
$ ~/[TAB]     # ╨╖╨░╨╝╨╡╨╜╤П╨╡╤В╤Б╤П ╨╜╨░...
$ /full/path/to/home/folder
$ $HOME/[TAB] #  ╨╖╨░╨╝╨╡╨╜╤П╨╡╤В╤Б╤П ╨╜╨░...
$ /full/path/to/home/folder

рд╕реНрд╡рдЪреНрдЫ рдЖрдЙрдЯрдкреБрдЯ

4. рдЪреЗрдХ рдЬреЙрдм

рдЬрд░ рдкрд╛рд░реНрд╢реНрд╡рднреВрдореАрдд рдЕрдЬреВрдирд╣реА рдиреЛрдХрд░реНтАНрдпрд╛ рдЪрд╛рд▓реВ рдЕрд╕рддреАрд▓ рддрд░ рд╣рд╛ рдкрд░реНрдпрд╛рдп рд╕рддреНрд░рд╛рддреВрди рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░рдгреЗ рдерд╛рдВрдмрд╡рддреЛ.

рдмрд╛рд╣реЗрд░ рдкрдбрдгреНрдпрд╛рдРрд╡рдЬреА, рдЕрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдВрдЪреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдЬреВрдирд╣реА рдмрд╛рд╣реЗрд░ рдкрдбрд╛рдпрдЪреЗ рдЕрд╕рд▓реНрдпрд╛рд╕, рдкреБрдиреНрд╣рд╛ рдПрдВрдЯрд░ рдХрд░рд╛ 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 рдХрдорд╛рдВрдб рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЪрд╛рд▓рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдмреЕрд╢рдЪрд╛ рдЕрд░реНрде рдХрд╕рд╛ рд▓рд╛рд╡рддреЛ рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд░рдердо рдкрд╛рд╣реВ рджреЗрддреЗ:

$ shopt -s histverify
$ echo !$          # <= ╨Я╨╛ ╨╜╨░╨╢╨░╤В╨╕╤О Enter ╨║╨╛╨╝╨░╨╜╨┤╨░ ╨╜╨╡ ╨╖╨░╨┐╤Г╤Б╨║╨░╨╡╤В╤Б╤П
$ echo histverify  # <= ╨Ю╨╜╨░ ╤Б╨╜╨░╤З╨░╨╗╨░ ╨┤╨╡╨╝╨╛╨╜╤Б╤В╤А╨╕╤А╤Г╨╡╤В╤Б╤П ╨╜╨░ ╤Н╨║╤А╨░╨╜╨╡,
histverify         # <= ╨░ ╨┐╨╛╤В╨╛╨╝ ╨╖╨░╨┐╤Г╤Б╨║╨░╨╡╤В╤Б╤П 

8. рдиреЛрдХреНрд▓реЛрдмрд░

рдкреБрдиреНрд╣рд╛, рдЕрдкрдШрд╛рддрд╛рдВрдкрд╛рд╕реВрди рд╕рдВрд░рдХреНрд╖рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдореНрд╣рдгрдЬреЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдСрдкрд░реЗрдЯрд░ (>). рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдмреЕрдХрдЕрдк рдирд╕рд▓реНрдпрд╛рд╕ рд╣реА рдЖрдкрддреНрддреА рдЕрд╕реВ рд╢рдХрддреЗ.

рдкрд░реНрдпрд╛рдп set -╨б рдЕрд╢рд╛ рдУрд╡реНрд╣рд░рд░рд╛рдИрдЯрд┐рдВрдЧрд▓рд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ. рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдкрдг рдСрдкрд░реЗрдЯрд░ рд╡рд╛рдкрд░реВрди рд╕рдВрд░рдХреНрд╖рдг рдмрд╛рдпрдкрд╛рд╕ рдХрд░реВ рд╢рдХрддрд╛ >|:

$ touch afile
$ set -C
$ echo something > afile
-bash: afile: cannot overwrite existing file
$ echo something >| afile
$

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛