рджрд┐рд▓рдЪрд╕реНрдк рдмреИрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддрдХрдиреАрдХ

рдЗрди рдЪрд╛рд▓реЛрдВ рдХреЛ Google рдХреА рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ "рдЯреЙрдпрд▓реЗрдЯ рдкрд░ рдкрд░реАрдХреНрд╖рдг" (рд╢реМрдЪрд╛рд▓рдп рдореЗрдВ рдкрд░реАрдХреНрд╖рдг - рд╢реМрдЪрд╛рд▓рдпреЛрдВ рдореЗрдВ рдкрддреНрд░рдХ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдФрд░ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред





рд╕реБрд░рдХреНрд╖рд╛


рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ

#!/bin/bash set -o nounset set -o errexit
      
      





рдпрд╣ рджреЛ рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред

1) рдЕрдШреЛрд╖рд┐рдд рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕

2) рдЖрджреЗрд╢реЛрдВ рдХреА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдкреНрддрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛

рдпрджрд┐ рдЖрджреЗрд╢ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рдореНрди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 if ! <possible failing command> ; then echo "failure ignored" fi
      
      





рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреБрдЫ рдХрдорд╛рдВрдб рдХреНрд░реИрд╢ рдХреЛрдб рдЬреИрд╕реЗ "mkdir -p" рдФрд░ "rm -f" рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЙрдкрдкреНрд░реЛрдЧреНрд░рд╛рдо (рдХрдорд╛рдВрдб 1 | рдХрдорд╛рдВрдб 2 | рдХрдорд╛рдВрдб 3) рдХреА рдХреЙрд▓рд┐рдВрдЧ рдЪреЗрди рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рднреА рд╣реИрдВ, рдЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 (./failing_command && echo A)
      
      





рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ '&&' рдЕрдЧрд▓реА рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рджреЗрдЧрд╛, рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП 'http://fvue.nl/wiki/Bash:_Error_handling' рджреЗрдЦреЗрдВ



рдХрд╛рд░реНрдпреЛрдВ


рдмреИрд╢ рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рдХрдорд╛рдВрдб рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

рдЙрджрд╛рд╣рд░рдг 1:

 ExtractBashComments() { egrep "^#" } cat myscript.sh | ExtractBashComments | wc
      
      





 comments=$(ExtractBashComments < myscript.sh)
      
      





рдЙрджрд╛рд╣рд░рдг 2:

 SumLines() { # iterating over stdin - similar to awk local sum=0 local line=тАЭтАЭ while read line ; do sum=$((${sum} + ${line})) done echo ${sum} } SumLines < data_one_number_per_line.txt
      
      





рдЙрджрд╛рд╣рд░рдг 3:

 log() { # classic logger local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: " echo "${prefix} $@" >&2 } log "INFO" "a message"
      
      





рдЕрдкрдиреЗ рд╕рднреА рдХреЛрдб рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдХреЗрд╡рд▓ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ / рд╕реНрдерд┐рд░рд╛рдВрдХ рдЫреЛрдбрд╝рдХрд░ "рдореБрдЦреНрдп" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рддрд░реНрдХ рд╣реЛрдВрдЧреЗред



рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдШреЛрд╖рдгрд╛


рдмреИрд╢ рдЖрдкрдХреЛ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг:

рд╕реНрдерд╛рдиреАрдп (рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд░)

рдЖрд╕рд╛рдиреА рд╕реЗ (рдЪрд░ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдЙрд╕реЗ рдкреБрди: рд╕реМрдВрдкрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ)

 ##  DEFAULT_VAL  ,    ,   '-7' readonly DEFAULT_VAL=${DEFAULT_VAL:-7} myfunc() { #       local some_var=${DEFAULT_VAL} ... }
      
      





рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рдПрдХ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯрд╛рдЗрдк рдХрд╛ рдПрдХ рдЪрд░ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ:

 x=5 x=6 readonly x x=7 # failure
      
      





рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдЪрд░ рдпрд╛ рддреЛ рд╕реНрдерд╛рдиреАрдп рд╣реИрдВ рдпрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ, рдпрд╣ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред



рдмреИрдХрдЯрд┐рдХреНрд╕ `` рдХреЗ рдмрдЬрд╛рдп $ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдмреИрдХ рдХреЛрдЯреНрд╕ рдХреЛ рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдХреБрдЫ рдлреЛрдВрдЯ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд┐рдВрдЧрд▓ рдХреЛрдЯреНрд╕ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

$ () рдирд┐рд░реНрдорд╛рдг рднреА рдЖрдкрдХреЛ рднрд╛рдЧрдиреЗ рдХреЗ рд╕рд╛рде рд╕рд┐рд░рджрд░реНрдж рдХреЗ рдмрд┐рдирд╛ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

 #   : ABCD echo "A-`echo B-\`echo C-\\\`echo D\\\`\``" echo "A-$(echo B-$(echo C-$(echo D)))"
      
      







рд╕рд┐рдВрдЧрд▓ рдмреНрд░реИрдХреЗрдЯ [] рдХреЗ рдмрдЬрд╛рдп рдбрдмрд▓ рд╕реНрдХреНрд╡рд╛рдпрд░ рдмреНрд░реИрдХреЗрдЯ [[]] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдбрдмрд▓ рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдЪрд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЕрдирдЬрд╛рдиреЗ рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЛрдХрддреЗ рд╣реИрдВ:

  $ [ a < b ] -bash: b: No such file or directory $ [[ a < b ]]
      
      





рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕рд░рд▓ рд╣реИ:

 [ "${name}" \> "a" -o ${name} \< "m" ] [[ "${name}" > "a" && "${name}" < "m" ]]
      
      





рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рднреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:



рдирдП рдСрдкрд░реЗрдЯрд░:





рдЕрдиреБрдкреВрд░рдХ / рд╕рдВрд╢реЛрдзрд┐рдд рдкрд░рд┐рдЪрд╛рд▓рдХ:





рдЙрджрд╛рд╣рд░рдг:

 t="abc123" [[ "$t" == abc* ]] # true (globbing) [[ "$t" == "abc*" ]] # false (literal matching) [[ "$t" =~ [abc]+[123]+ ]] # true (regular expression) [[ "$t" =~ "abc*" ]] # false (literal matching)
      
      





рдмреИрд╢ 3.2 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЙрджреНрдзреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдЖрдкрдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЪрд░ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 r="a b+" [[ "a bbb" =~ $r ]] # true
      
      





рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреА рддреБрд▓рдирд╛ рдХреЗрд╕ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ:

 case $t in abc*) <action> ;; esac
      
      







рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ:


рдмреИрд╢ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ (рдХрдо) рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:

рдЖрдзрд╛рд░:

 f="path1/path2/file.ext" len="${#f}" # = 20 (  ) #    : ${<>:<_>}  ${<>:<_>:<_>} slice1="${f:6}" # = "path2/file.ext" slice2="${f:6:5}" # = "path2" slice3="${f: -8}" # = "file.ext" (      '-') pos=6 len=5 slice4="${f:${pos}:${len}}" # = "path2"
      
      





рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди:

 f="path1/path2/file.ext" single_subst="${f/path?/x}" # = "x/path2/file.ext" (  ) global_subst="${f//path?/x}" # = "x/x/file.ext" (  )
      
      





рдЪрд░ рдХрд╛ рдкреГрдердХреНрдХрд░рдг:

 f="path1/path2/file.ext" readonly DIR_SEP="/" array=(${f//${DIR_SEP}/ }) second_dir="${array[1]}" # = path2
      
      





рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣рдЯрд╛рдиреЗ:

# рдкрд╣рд▓реЗ рдореИрдЪ рддрдХ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣рдЯрд╛рдПрдВ

 f="path1/path2/file.ext" extension="${f#*.}" # = "ext"
      
      





# рдЖрдЦрд┐рд░реА рдореИрдЪ рддрдХ рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣рдЯрд╛рдПрдВ

 f="path1/path2/file.ext" filename="${f##*/}" # = "file.ext"
      
      





# рдкрд╣рд▓реЗ рдореИрдЪ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рд╕реЗ рд╣рдЯрд╛рдПрдВ

 f="path1/path2/file.ext" dirname="${f%/*}" # = "path1/path2"
      
      





# рд▓рд╛рдЗрди рд╕реЗ рдЕрдВрддрд┐рдо рдореИрдЪ рддрдХ рд╣рдЯрд╛рдПрдВ

 f="path1/path2/file.ext" root="${f%%/*}" # = "path1"
      
      







рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ


рдХреБрдЫ рдХрдорд╛рдВрдбреНрд╕ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ, '<()' рдСрдкрд░реЗрдЯрд░ рдЙрдирдХреА рдорджрдж рдХрд░реЗрдЧрд╛, рдпрд╣ рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

# рджреЛ URL рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░реЗрдВ

 diff <(wget -O - url1) <(wget -O - url2)
      
      





рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдЪрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

# рдорд╛рд░реНрдХрд░ - рдХреЛрдИ рднреА рд╢рдмреНрджред

 command << MARKER ... ${var} $(cmd) ... MARKER
      
      





рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдорд╛рд░реНрдХрд░ рдХреЛ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

# рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди '$ var' рд▓реМрдЯрд╛рдПрдЧрд╛ рди рдХрд┐ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╡реИрд▓реНрдпреВ

 var="text" cat << 'MARKER' ... $var ... MARKER
      
      







рдирд┐рд░реНрдорд┐рдд рдЪрд░




рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 for i in "$@"; do echo '$@ param:' $i; done for i in "$*"; do echo '$! param:' $i; done
      
      





рдирд┐рд╖реНрдХрд░реНрд╖:

 bash ./parameters.sh arg1 arg2 $@ param: arg1 $@ param: arg2 $! param: arg1 arg2
      
      







рдбрд┐рдмрдЧрд┐рдВрдЧ


рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрд╛рдБрдЪ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ 15 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдЪрд▓рдиреЗ рдкрд░ рд╕рдордп рдмрдЪрд╛рддрд╛ рд╣реИ):

 bash -n myscript.sh
      
      





рдЕрдиреБрд░реЗрдЦрдг:

 bash -v myscripts.sh
      
      





рдЬрдЯрд┐рд▓ рдЖрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЗрдЦрдг:

 bash -x myscript.sh
      
      





-V рдФрд░ -x рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХреЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдкрдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдорд╢реАрди рдкрд░ рдЪрд▓рддреА рд╣реИ рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдирд┐рдореНрди рдкрд░ рд╣реИ:

 set -o verbose set -o xtrace
      
      





рд╕рдВрдХреЗрдд рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:




рдпрджрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рдЖрдЗрдЯрдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдпрд╛ рд░реВрдмреА рднрд╛рд╖рд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рд╕рдВрджрд░реНрдн:

рдЙрдиреНрдирдд рдмреИрд╢-рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдЧрд╛рдЗрдб: tldp.org/LDP/abs/html

рдмреИрд╢ рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓: www.gnu.org/software/bash/manual/bashref.html

рдореВрд▓ рд▓реЗрдЦ: robertmuth.blogspot.ru/2012/08/better-bash-scripting-in-15-miner.html



All Articles