рдЖрда рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рдмреИрд╢ рд╡рд┐рдХрд▓реНрдк

рдХреБрдЫ рдмреИрд╢ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

  set -o xtrace 

рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП,

  set -o errexit 

рдЧрд▓рддреА рд╕реЗ рдпрд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП

  рд╕реЗрдЯ-рдмреА рдЧрд▓рдд 

рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд░ рдмреБрд▓рд╛рдпрд╛ рдЪрд░ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИрдВред рдХрднреА-рдХрднреА рд╡реЗ рдордиреБрд╖реНрдпреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ред

рдиреЛрдЯ: рдореИрдХ рдореЗрдВ рдмреИрд╢ рдХрд╛ рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (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. cdspell


рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, bash рдЯрд╛рдЗрдкреЛрд╕ рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЖрдкрдиреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реИред

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

рдореИрдВрдиреЗ рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдФрд░ рд╢рд╛рдпрдж рд╣реА рдХрднреА (рд╢рд╛рдпрдж рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рдмрд╛рд░) рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдиреНрдп рджрд┐рдиреЛрдВ рдореЗрдВ, cdspell рд╕рдордп рдмрдЪрд╛рддрд╛ рд╣реИ, рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╣рд░ рджрд┐рдиред

2. рдирд┐рд░рдВрдХреБрд╢


рдпрджрд┐ рдЖрдк рдмрд╛рд░-рдмрд╛рд░ cd рдЗрдирдкреБрдЯ рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХреНрд╕ рдХрдорд╛рдВрдб рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдПрдХреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 $ shopt -s autocd $ abcdefg $ cd .. 

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

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

рдмрд╕ рдлрд╝реЛрд▓реНрдбрд░ rm -rf * рди рджреЗрдВ (рд╣рд╛рдВ, рд╡реИрд╕реЗ, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ)ред

3. рдбрд╛рдЗрд░реЗрдХреНрд╕рдкрд╛рдВрдб


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

 $ 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. рдЧреНрд▓реЛрдмрд╕реНрдЯрд╛рд░


рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреЛ рдЕрд▓реМрдХрд┐рдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ! рдпрджрд┐ рдЖрдк рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ:

 $ shopt -s globstar $ ls ** 

рдлрд┐рд░ рд╢реЗрд▓ рдЖрд╡рд░реНрддреА рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдФрд░ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ред

direxpand рд╕рдВрдпреЛрдЬрди рдореЗрдВ 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 рдкрд╣рд▓реЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреИрд╢ рдХрдорд╛рдВрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ:

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

Source: https://habr.com/ru/post/hi452522/


All Articles