рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо, рдпрд╛ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рдПрд╕рдЯреАрдбреАрдЖрд░рдЖрд░ рдкреЗрдВрдЯ рдХрд░реЗрдВ

рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВ


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

рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдЕрдХреНрд╖рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВ


рдЙрдкрдирд╛рдо

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

$ git status # On branch master nothing to commit, working directory clean $ alias st='git status' $ st # On branch master nothing to commit, working directory clean 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдирд╛рдо рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рднреА рд▓реЛрдЧ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рд╕рдорд╛рдкрди рдЕрдХреНрд╕рд░ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг: (<TAB> рдЯреИрдм рдХреБрдВрдЬреА рджрдмрд╛ рд░рд╣рд╛ рд╣реИ):

 $ git checkout <TAB><TAB> HEAD master origin/HEAD origin/master 

рдпрджрд┐ рд╣рдо рдЙрдкрдирд╛рдо рд╕рд╣ = 'рдЧрд┐рдЯ рдЪреЗрдХрдЖрдЙрдЯ' рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреИрдм рдХреЛ рджрдмрд╛рдХрд░ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо (рдХрдо рд╕реЗ рдХрдо рдмреИрд╢ рдХреЗ рд▓рд┐рдП) рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 $ alias co='git checkout' $ co <TAB><TAB> Display all 124 possibilities? (y or n) .git/ MANIFEST.doc array.c bashline.c ... 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк рдХрдо рдкрддреНрд░ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдСрдЯреЛ-рдкреВрд░реНрдгрддрд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рд╣реЛрдЧрд╛ ... рдпрд╛ рдирд╣реАрдВ? рдЖрдЗрдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдЧреВрдЧрд▓ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдРрд╕рд╛ рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдлрдВрдХреНрд╢рди:

 function make-completion-wrapper () { local function_name="$2" local arg_count=$(($#-3)) local comp_function_name="$1" shift 2 local function=" function $function_name { ((COMP_CWORD+=$arg_count)) COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} ) "$comp_function_name" return 0 }" eval "$function" } 


рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ "рдЬрдЯрд┐рд▓" рдХрдорд╛рдВрдб (рдЬреЛ рдХрд┐ рдЬрдм рд╣рдо рдПрдХ рдЙрдкрдирд╛рдо рдмрдирд╛рддреЗ рд╣реИрдВ, рдХрдорд╛рдВрдб рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рд╕реЗ рдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЧрд┐рдЯ рдЪреЗрдХрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ) рд╕реЗ рдСрдЯреЛ-рдкреВрд░реНрдг рд╡рд╛рдкрд╕ рд▓реМрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдСрдЯреЛ-рдлрд╝рдВрдХреНрд╢рдирд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдПрд▓рд┐рдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рдПрдб рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗред рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ ..? рддреЛ рдпрд╣ рд╣реИ :)ред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:

 $ make-completion-wrapper _git _co git checkout $ complete -o bashdefault -o default -o nospace -F _co co $ co <TAB><TAB> HEAD master origin/HEAD origin/master 

рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд▓реЗрддреЗ рд╣реИрдВ:

1) рдореЗрдХрдЕрдк рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЖрд╡рд░рдг: рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдкреВрд░реНрдг рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдЖрдорддреМрд░ рдкрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, git рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "_git" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЕрджреНрднреБрдд рдореЗрдХ-рдЕрдк-рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо "_co" (рд╕рд╣ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП) рдирд╛рдордХ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ, рдЬреЛ "рдЧрд┐рдЯ рдЪреЗрдХрдЖрдЙрдЯ" рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ
2) рдкреВрд░реНрдг: рд╣рдорд╛рд░реЗ рдирдП рдлрд╝рдВрдХреНрд╢рди "_co" рдХреЛ "рд╕рд╣" рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдСрдЯреЛ-рд╕рдорд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ
3) рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рддрд╛рдХрд┐ рдЙрдкрдирд╛рдо рдФрд░ рд╕реНрд╡рдд: рдкреВрд░реНрдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрдорд╛рдВрдб рдЦреЛ рди рдЬрд╛рдПрдВ, рд╣рдо рдЕрдкрдиреЗ рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ ".bashrc" (рдпрд╛ ".bash_profile" рдпрд╛ ".profile") рдореЗрдВ рдЗрди рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ, рдФрд░ рд╣рдо рдЦреБрд╢ рд╣реЛрдВрдЧреЗ :)ред

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

рдмрд╛рд╢ рдореЗрдВ рдЙрдкрдирд╛рдореЛрдВ рдХреА рдХреНрд╖рдорддрд╛ рд╕реАрдорд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХрднреА-рдХрднреА рдлрд╝рдВрдХреНрд╢рди (рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдмреИрд╢ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдХрдорд╛рдВрдб рдереЗ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд░реНрддрдорд╛рди рд╢реЗрд▓ рдХреЗ рд╕рдорд╛рди рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, "$ 1", "$ 2", рдЖрджрд┐ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдПрдХ рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд░рд╣реЗ рдереЗред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо "$ @" (рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ) рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ "рдЬреИрд╕рд╛ рд╣реИ" рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░рдлреЙрд▓реНрдЯ рдкрд░ рдЖрдк рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рджрд┐рдП рдЧрдП рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд░рдВрдЧрддрд╛ рд╣реИ:

 $ color()(set -o pipefail;"$@" 2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1 $ color ls nonexistent ls: nonexistent: No such file or directory #    

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдпрджрд┐ рдЖрдкрдХреЛ рдХрд╣рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рд╣рдореЗрд╢рд╛ рдХрдорд╛рдВрдб рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ:

 $ function echoworld () { echo "$@" world; } $ echoworld Hello Hello world 

рдпрд╛ рдЕрдЧрд░ рдЖрдкрдХреЛ рддрд░реНрдХреЛрдВ рдкрд░ рдХреБрдЫ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 $ function gmo () { git merge "origin/$1"; } $ gmo master # git merge "origin/master" Already up-to-date. 

SSH рдЗрдирдкреБрдЯ рд▓реИрдЧ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ mosh рдХреЗ рд╕рд╛рде


рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдПрд╕рдПрд╕рдПрдЪ рдкрд░ рдмрд╣реБрдд рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдореЗрд░рд┐рдХрд╛ рдореЗрдВ рдЕрдореЗрдЬрд╝реЕрди рдХреЗ рдХреНрд▓рд╛рдЙрдб) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдЖрдк рдореЛрдмрд╛рдЗрд▓ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрд╕рдПрд╕рдПрдЪ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрдирдкреБрдЯ рджреЗрд░реА рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЖрдк рдПрдХ рдЪрд░рд┐рддреНрд░ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдк рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд╛рдж рджреВрд░ рдХреА рддрд░рдл рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ 200 рдПрдордПрд╕ рдпрд╛ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЛрдмрд╛рдЗрд▓ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдирдкреБрдЯ рджреЗрд░реА рдХреЛ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рд╣рдЬ рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд╕рдВрднрд╡рддрдГ, mosh ( http://mosh.mit.edu ) рдирд╛рдордХ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓реЗрдЦрдХ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЗрд╕ рдХрджрд░ рдердХ рдЧрдП рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ UDP рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрдиреЗ SSH рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рдХрдИ SSH рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЗрдирдкреБрдЯ рд╡рд┐рд▓рдВрдм рдФрд░ рдЦреЛрдиреЗ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдХрдореАред рдХрдиреЗрдХреНрд╢рди (рдЕрд╕рдлрд▓ рд▓рд┐рдЦреЗрдВ: рдЯреВрдЯреА рд╣реБрдИ рдкрд╛рдЗрдк, рдЬреЛ рдХреЗрд╡рд▓ рддрдм рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ рдЬрдм рдЖрдк рдХреБрдЫ рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ)ред

рдЗрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рднреА рд╣реИ - рдлрд┐рд▓рд╣рд╛рд▓ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдПрдХ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрд┐рд▓реНрд▓реА рдмрдирд╛рддреЗ рд╣реИрдВ рдпрд╛ рдмрдбрд╝реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдПрд▓рдПрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐рдпрд╛рдВ рдорд┐рд▓реЗрдВрдЧреА, рдФрд░ рд╢реБрд░реБрдЖрдд "рдЦреЛ" рдЬрд╛рдПрдЧреАред рд▓реЗрдЦрдХ рд╕реНрд╡рдпрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреВрд░рд╕реНрде рдкрдХреНрд╖ рдкрд░ рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 1.3 рдореЗрдВ рд╡реЗ рд╕реАрдзреЗ рд╕рд░реНрд╡рд░ (рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ) рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдкреИрдЪ рдмреИрд╢ рддрд╛рдХрд┐ stderr рд▓рд╛рд▓ рд╣реЛ


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓рд╛рд▓ рд╕реНрдЯреИрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрд╢ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ! рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ рдЬреЛ Google рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ: github.com/sickill/stderred ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдХреЙрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ (2, ...) рдФрд░ рдПрдлрд╕реАрдЖрд░ рд╕реЗ рдлрд╝рд░реНрдордкреНрд░рд┐рдВрдЯ, рдФрд░ рдПрдХ рд▓рд╛рд▓ рд░рдВрдЧ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрд╕реНрдХ рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЖрд╡рд░рдг рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рд╡реИрд╕реЗ рднреА рд╣рдо рдЕрдкрдирд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ :)! рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЕрд▓рдЧ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

1. рдмреИрд╢ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ ( ftp.gnu.org/gnu/bash )
2. рдЙрдиреНрд╣реЗрдВ git рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (git init рдФрд░& git add -A && git рдкреНрд░рддрд┐рдмрджреНрдз -m 'рдЖрд░рдВрднрд┐рдХ рдкреНрд░рддрд┐рдмрджреНрдз')
3. рдмрд┐рд▓реНрдб рдмреИрд╢ (?/configure && make)
4. рдЪрд▓рд╛рдУ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (./ash-l)
5. рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

рд╣рдореЗрдВ рд╢реЗрд▓ ред рд╕реА ред рд╕реАред рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓ рдЧрдИ рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдмреИрд╢ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

 #if defined (NO_MAIN_ENV_ARG) /* systems without third argument to main() */ int main (argc, argv) int argc; char **argv; #else /* !NO_MAIN_ENV_ARG */ int main (argc, argv, env) int argc; char **argv, **env; #endif /* !NO_MAIN_ENV_ARG */ { 


рд▓рдЧрднрдЧ 400 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдЬрдмрдХрд┐ рдЕрднреА рднреА рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рд╣рдо рд░реАрдбрд░_рд▓реВрдк () рдХреЙрд▓ рдкрд╛рддреЗ рд╣реИрдВ:

 #if !defined (ONESHOT) read_and_execute: #endif /* !ONESHOT */ shell_initialized = 1; /* Read commands until exit condition. */ reader_loop (); exit_shell (last_command_exit_value); } 


рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдирдВрдмрд░ 2 (stderr) рдХреЗ рд╕рд╛рде рд╣реИрдВрдбрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╣реЛ рддреЛ:

  shell_initialized = 1; color_stderr = get_string_value("COLOR_STDERR"); if (color_stderr && color_stderr[0]) { init_color_stderr(); } /* Read commands until exit condition. */ reader_loop (); 


рдирдВрдмрд░ 2 рдХреЗ рд╕рд╛рде рд╣реИрдВрдбрд▓ рдХреЛ рдХреИрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░реЗрдВ? рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдПрдХ рдкрд╛рдЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде рдирдВрдмрд░ 2 рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдмрджрд▓реЗрдВ, рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдкрдврд╝реЗ рдЧрдП рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ, рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдПрд╕реНрдХ рдЕрдиреБрдХреНрд░рдо рдЬреЛрдбрд╝реЗрдВ:

 static void *colorize_stderr(void *void_thread_args) { struct stderr_thread_data* data = (struct stderr_thread_data*)void_thread_args; int n; char buf[1024]; #define STDERR_PREFIX "\033[31m" #define STDERR_SUFFIX "\033[m" for (;;) { n = read(data->pipe, buf, sizeof(buf)); if (n <= 0) { if (errno == EINTR) continue; pthread_exit(NULL); } write(data->err, STDERR_PREFIX, sizeof(STDERR_PREFIX) - 1); write(data->err, buf, (size_t) n); write(data->err, STDERR_SUFFIX, sizeof(STDERR_SUFFIX) - 1); } } static void init_color_stderr () { pthread_t thr; int pipes[2]; static struct stderr_thread_data data; pipe(pipes); data.err = dup(2); dup2(pipes[1], 2); data.pipe = pipes[0]; pthread_create(&thr, NULL, colorize_stderr, (void*) &data); } 


рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рднреА рд▓рд╛рд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ :(ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд░реАрдбрд▓рд╛рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдХреНрд░реАрди рдкрд░ рд╣рдорд╛рд░реЗ рдЗрдирдкреБрдЯ рдХреЛ рд╕рд┐рд░реНрдл stderr рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ ... рд░реАрдбрд▓рд╛рдЗрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдлрд╡рд╛рд╣ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо rl_redisplay рдлрд╝рдВрдХреНрд╢рди рдХреЛ lib / readline / display.c рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдлрд╝рдВрдХреНрд╢рди, рд╡реИрд╕реЗ, рдмрд╕ рд╣реИ) 1300 рд▓рд╛рдЗрдиреЛрдВ рдкрд░) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд:

 /* Basic redisplay algorithm. */ void rl_redisplay () { /* ...   ... */ if (_rl_echoing_p == 0) return; _rl_output_some_chars("\033[m", 3); /*  -:  ,      ,    */ /* Block keyboard interrupts because this function manipulates global data structures. */ _rl_block_sigint (); RL_SETSTATE (RL_STATE_REDISPLAYING); 


рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐ рд╣реЗрдбрд░ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдпреЗ рдХреНрд░рд┐рдпрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреА рдЧрдИ рдереА), рддреЛ рдЬрдм рд╣рдо .bashrc рдореЗрдВ рд▓рд╛рдЗрди "рдирд┐рд░реНрдпрд╛рдд COLOR_STDERR = 1" рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдирдП рдЙрдмрд▓реЗ рд╣реБрдП рдмреИрд╢ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреВрд░рд╛ рд╕реНрдЯрд╛рдбрд░ рд▓рд╛рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рд╣реИред рд▓реЗрдЦред

рдЪреВрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдмреИрд╢ рдХреА рдЬрдЧрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдЖрдк рдПрдХ рдирдпрд╛, рд╕рдВрдХрд▓рд┐рдд рдмреИрд╢ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, ~ / bash рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ .bashrc рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 if [ ! -z "$PS1" ] && [ -z "$MY_BASH" ] && [ -x ~/bash ]; then export MY_BASH=1 exec ~/bash -l "$@" fi export COLOR_STDERR=1 


рд▓реЙрдЧрд┐рди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ рдпрджрд┐ "~ / bash" рдореМрдЬреВрдж рд╣реИ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ "~ / bash -l" (рдЕрд░реНрдерд╛рдд, рд▓реЙрдЧрд┐рди рд╢реЗрд▓) рд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред рд╡рд┐рдХрд▓реНрдк COLOR_STDERR = 1 рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреИрд╢ рдХрд╛ рд╕реНрдЯреИрдбрд░ рд╣реЛрдЧрд╛ред

рдмреИрд╢ рдХрд╛ рдкреИрдЪ рд╕рдВрд╕реНрдХрд░рдг github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ: github.com/YuriyNasretdinov/bash

рдЪреВрдВрдХрд┐ рд╕рдВрдкрд╛рджрди рдХреЛ рдмреИрд╢ рдХреЗ рд▓рд┐рдП "рдмреИрд╕рд╛рдЦреА" рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдЪ рдХреЛ рдореБрдЦреНрдп рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреБрдж рдореБрдЭреЗ рдордЬрд╝реЗрджрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ: рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдб рд╕реЗ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдореЛрдб рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рдФрд░ рдмрд╛рдХреА рд╕рднреА рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдкреНрд░рд┐рдп рдкрд╛рдардХ, рдЖрдк рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рдЙрдкрдпреЛрдЧреА рдХреБрдЫ рд╕реАрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ :)ред рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХ рд╣реЛ!

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


All Articles