ЁЯФА рдзрдбрд╛ 03 тАФ Pipes рдЖрдгрд┐ redirection: рдХреЙрд░рд┐рдбреЙрд░
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдкреБрдвреЗ: lesson-04-text-tools
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ03. рдкреНрд░рддреНрдпреЗрдХ command рдХрдбреЗ рдЕрд╕рдгрд╛рд░реЗ рддреАрди streams, рдЖрдгрд┐ commands рдирд╛ рдПрдХрдореЗрдХрд╛рдВрд╢реА рд╡ files рд╢реА рдЬреЛрдбрдгрд╛рд░реА plumbing.
- lib/log.sh тАФ
log()>&2рдиреЗ stderr рд╡рд░ рд▓рд┐рд╣рд┐рддреЛ, рдореНрд╣рдгреВрди report рд╕реНрд╡рдЪреНрдЫ рд░рд╛рд╣рддреЛ - bin/school.sh тАФ
cmd_listрд╣реА рдПрдХ pipeline рдЖрд╣реЗ:tail | grep | sort | column
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдкреНрд░рддреНрдпреЗрдХ command рд▓рд╛ рддреАрди рдХреЙрд░рд┐рдбреЙрд░ рдЕрд╕рддрд╛рдд: рдПрдХ рдЖрдд рдпреЗрдгрд╛рд░рд╛ (stdin, 0), рдПрдХ report рд╕рд╛рдареА
рдмрд╛рд╣реЗрд░ рдЬрд╛рдгрд╛рд░рд╛ (stdout, 1), рдЖрдгрд┐ рдПрдХ рддрдХреНрд░рд╛рд░реАрдВрд╕рд╛рдареА (stderr, 2). pipe | рдПрдХрд╛
command рдЪрд╛ рдмрд╛рд╣реЗрд░рдЪрд╛ рдХреЙрд░рд┐рдбреЙрд░ рдкреБрдврдЪреНрдпрд╛ command рдЪреНрдпрд╛ рдЖрддрд▓реНрдпрд╛ рдХреЙрд░рд┐рдбреЙрд░рд▓рд╛ рдЬреЛрдбрддреЛ, рдореНрд╣рдгреВрди рдЪрд╛рд░ рдЫреЛрдЯреЗ tools
рдорд┐рд│реВрди рдПрдХрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдЙрддреНрддрд░ рджреЗрдК рд╢рдХрддрд╛рдд. > report file рдордзреНрдпреЗ рдкрд╛рдард╡рддреЛ, >> рд╢реЗрд╡рдЯреА рдЬреЛрдбрддреЛ,
2> рддрдХреНрд░рд╛рд░реА рджреБрд╕рд░реАрдХрдбреЗ рдкрд╛рдард╡рддреЛ. рд╕рдЧрд│реЗ рдЪрд╛рд▓рд╡рдгрд╛рд░рд╛ рдирд┐рдпрдо:
report рдЖрдгрд┐ log рдХрдзреАрдЪ рдПрдХ рдХреЙрд░рд┐рдбреЙрд░ рд╡рд╛рдЯреВрди рдШреЗрдд рдирд╛рд╣реАрдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
K["тМия╕П stdin 0"] --> C["тЪЩя╕П command"]
C -->|"1 stdout"| O["ЁЯУД report тЖТ | next ┬╖ > file ┬╖ >> file"]
C -->|"2 stderr"| E["ЁЯУг log тЖТ 2> file ┬╖ 2>&1 ┬╖ 2>/dev/null"]
тЭУ рдХрд╛рдп
cmd > fileрдмрджрд▓реВрди рдЯрд╛рдХрд╛ ┬╖>> fileрд╢реЗрд╡рдЯреА рдЬреЛрдбрд╛ ┬╖< fileрддрд┐рдереВрди рд╡рд╛рдЪрд╛ ┬╖2> fileerrors рддрд┐рдХрдбреЗ ┬╖2>&1errors report рдордзреНрдпреЗ рдорд┐рд╕рд│рддрд╛рдд ┬╖&>рджреЛрдиреНрд╣реА ┬╖| tee filefile рдордзреНрдпреЗ copy рдХрд░рд╛ рдЖрдгрд┐ рдкреБрдвреЗ рдЪрд╛рд▓реВ рдареЗрд╡рд╛ ┬╖/dev/nullрдХрдЪрд░рд╛рдкреЗрдЯреА.- рдХреНрд░рдо рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛:
cmd > out 2>&1(errors stdout рдЪреНрдпрд╛ рдорд╛рдЧреЗ file рдордзреНрдпреЗ рдЬрд╛рддрд╛рдд);cmd 2>&1 > out(errors terminal рд╡рд░ рдЬрд╛рддрд╛рдд). - Pipes рд╕рдЧрд│реЗ commands рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЪрд╛рд▓рд╡рддрд╛рдд;
set -o pipefail(рдзрдбрд╛ 08) рдордзрд▓рд╛ command fail рдЭрд╛рд▓рд╛ рддрд░ рдкреВрд░реНрдг pipe fail рдХрд░рддреЛ. - Here-docs
<<EOF тАж EOFрдЕрдиреЗрдХ рдУрд│реАрдВрдЪрд╛ text рдЖрдд рджреЗрддрд╛рдд;xargsрдУрд│реАрдВрдЪреЗ arguments рдмрдирд╡рддреЛ.
ЁЯдФ рдХрд╛
pipeline рдореНрд╣рдгрдЬреЗ рдЬреЛрдбрдгреА: list | grep 3A | wc -l "3A рдордзреНрдпреЗ рдХрд┐рддреА" рдпрд╛рдЪреЗ рдЙрддреНрддрд░
рдПрдХрдореЗрдХрд╛рдВрдмрджреНрджрд▓ рдХрдзреАрдЪ рди рдРрдХрд▓реЗрд▓реНрдпрд╛ tools рдиреЗ рджреЗрддреЛ. рд╣реЗ рддреЗрд╡реНрд╣рд╛рдЪ рдЪрд╛рд▓рддреЗ рдЬреЗрд╡реНрд╣рд╛ stdout рд╡рд░
рдлрдХреНрдд data рдЕрд╕рддреЛ, рдореНрд╣рдгреВрдирдЪ log() stderr рд╡рд░ рдЬрд╛рддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
log() >&2 рдиреЗ рд╕рдВрдкрддреЛ. cmd_list { header; tail | filter | sort; } | column -t рдмрд╛рдВрдзрддреЛ. smoke test рдордзрд▓рд╛ L03 рджреЛрди рдХреЙрд░рд┐рдбреЙрд░ рд╡реЗрдЧрд│реЗ рджрд╛рдЦрд╡рддреЛ: 2>/dev/null log рд▓рдкрд╡рддреЛ, 2>&1 >/dev/null рдлрдХреНрдд log рдареЗрд╡рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
bin/school.sh enrol Zoya 3B A > report.txt 2> log.txt; cat report.txt; echo ---; cat log.txt
bin/school.sh list | grep 3B | wc -l # a question, answered by three tools
bin/school.sh list 2>/dev/null | tee copy.txt | head -2 # tee: a copy on the way through
bin/school.sh enrol Bad 9Z 2>&1 >/dev/null # only the complaint (note the order)
cat <<'EOF' | wc -l
one
two
EOF
bin/school.sh remove Zoya; rm -f report.txt log.txt copy.txt
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
report.txt рд░рд┐рдХрд╛рдореА рдЕрд╕рддреЗ рдЖрдгрд┐ log.txt рдордзреНрдпреЗ enrolled Zoya рдЕрд╕рддреЗ; enrol рдирдВрддрд░ pipeline
3 рдЫрд╛рдкрддреЗ (Meera, Rohan, Zoya); рдЪреБрдХреАрдЪреНрдпрд╛ enrol рдордзреНрдпреЗ рдлрдХреНрдд error рдЪреА
рдУрд│ рджрд┐рд╕рддреЗ; here-doc 2 рдореЛрдЬрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА рддрд┐рдиреНрд╣реА streams рдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХ рдХреБрдареЗрд╣реА рд╡рд│рд╡реВ рд╢рдХрддрд╛, рдЖрдгрд┐ script рдЪрд╛ log рддрд┐рдЪреНрдпрд╛ report рдкрд╛рд╕реВрди рджреВрд░ рдХрд╛ рдареЗрд╡рд╛рдпрдЪрд╛ рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣реАрдд рдЖрд╣реЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдЬреНрдпрд╛ function рдЪреЗ output capture рд╣реЛрддреЗ рддреНрдпрд╛рдд stdout рд╡рд░
echo "error"тАФ error рд╣рд╛рдЪ data рдмрдирддреЛ. > file 2>&1рдореНрд╣рдгрд╛рдпрдЪреЗ рдЕрд╕рддрд╛рдирд╛2>&1 > file.- stdin рдРрд╡рдЬреА file argument рд╡рд╛рдЪрдгрд╛рд▒реНрдпрд╛ command рдордзреНрдпреЗ pipe рдХрд░рдгреЗ (pipe рдХреЗрд▓реНрдпрд╛рд╡рд░
grep patternрд▓рд╛ filename рд▓рд╛рдЧрдд рдирд╛рд╣реА).
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: CI stdout artifacts рдореНрд╣рдгреВрди рдЖрдгрд┐ stderr logs рдореНрд╣рдгреВрди capture рдХрд░рддреЗ; рджреЛрдиреНрд╣реА рдорд┐рд╕рд│рдгрд╛рд░реА script рдордзреНрдпреЗрдЪ "WARNING" рдЕрд╕рд▓реЗрд▓реЗ JSON рдмрдирд╡рддреЗ. рдкреНрд░рддреНрдпреЗрдХ pipeline step рдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рдУрд│реАрдд
2>&1 | tee build.logрдЕрд╕рддреЗ.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 04 тАФ text tools: grep, sed, awk рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ рдорд┐рддреНрд░ рдиреЛрдВрджрд╡рд╣реАрддреВрди рдЙрддреНрддрд░реЗ рдХрд╛рдврддрд╛рдд.