ЁЯз╣ рдзрдбрд╛ 01 тАФ shell рдХрд╛: рдХреЗрдЕрд░рдЯреЗрдХрд░рдЪрд╛ рдЖрд╡рд╛рдЬ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-files-and-paths
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
shell рдХреЛрдгрддреА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рддреЛ тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ command рдХрдбреЗ рдЕрд╕рдгрд╛рд▒реНрдпрд╛ рддреАрди рдЧреЛрд╖реНрдЯреА: рдПрдХ рдЙрддреНрддрд░, рдПрдХ log, рдЖрдгрд┐ рдПрдХ exit code. рдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рдЕрд╢рд╛ рдЦрд▒реНрдпрд╛ files:
- bin/school.sh тАФ command-line tool рдореНрд╣рдгреВрди рд╢рд╛рд│реЗрдЪреА рдиреЛрдВрджрд╡рд╣реА: рдкрд╛рдЪ sub-commands, рдкреВрд░реНрдг рдХреЛрд░реНрд╕ рдПрдХрд╛рдЪ script рдордзреНрдпреЗ
- bin/backup.sh тАФ lock, rotation рдЖрдгрд┐ verification рдЕрд╕рд▓реЗрд▓рд╛ рд░рд╛рддреНрд░реАрдЪрд╛ backup (capstone)
- bin/smoke_test.sh тАФ рдкреНрд░рддреНрдпреЗрдХ рдзрдбреНрдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛, рдЦрд▒реНрдпрд╛ scripts рд╡рд░ рд╕рд┐рджреНрдз рдХреЗрд▓реЗрд▓реА
- tests/run_tests.sh тАФ рд╕рд╛рдзреНрдпрд╛ bash рдЪреНрдпрд╛ ~30 рдУрд│реАрдВрдордзреНрдпреЗ 14 checks
- data/register.csv тАФ рдиреЛрдВрджрд╡рд╣реА
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА: рддреБрдореНрд╣рд╛рд▓рд╛ bash рдЖрдгрд┐ рдПрдХ terminal рд▓рд╛рдЧреЗрд▓ тАФ macOS, Linux, рдХрд┐рдВрд╡рд╛ Windows рд╡рд░ WSL. рдХрд╛рд╣реАрд╣реА install рдХрд░рд╛рдпрдЪреЗ рдирд╛рд╣реА. рдЪрд╛рдВрдЧрд▓реЗ рд╢реЗрдЬрд╛рд░реА: CI/CD рд╢рд╛рд│рд╛ (рдЬрд┐рдереЗ рдпрд╛ scripts рдкреНрд░рддреНрдпреЗрдХ push рд╡рд░ рдЪрд╛рд▓рддрд╛рдд) рдЖрдгрд┐ Docker рд╢рд╛рд│рд╛ (рдкреНрд░рддреНрдпреЗрдХ container рдЪреА entrypoint рд╣реА рдПрдХ script рдЕрд╕рддреЗ).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдд рдПрдХ рдХреЗрдЕрд░рдЯреЗрдХрд░ рдЖрд╣реЗ рдЬреЛ рддреБрдореНрд╣реА рд╕рд╛рдВрдЧрд╛рд▓ рддреЗрдЪ рдХрд░рддреЛ, рдПрдХрд╛ рд╡реЗрд│реА рдПрдХ рдУрд│: "рдиреЛрдВрджрд╡рд╣реА рджрд╛рдЦрд╡", "рдиреЛрдВрджреАрдВрдЪрд╛ backup рдШреЗ", "рджреЛрди рд╡рд╛рдЬрддрд╛ рдШрдВрдЯрд╛ рд╡рд╛рдЬрд╡". рддреБрдореНрд╣реА arguments рд╕рд╣ commands рдордзреНрдпреЗ рдмреЛрд▓рддрд╛. рдХреЗрдЕрд░рдЯреЗрдХрд░ рд╕реВрдЪрдирд╛ рдлрд▓рдХрд╛рд╡рд░ (stdout) рдЙрддреНрддрд░ рджреЗрддреЛ, рд╡рд╣реАрдд (stderr) рдХреБрд░рдХреБрд░ рд▓рд┐рд╣рд┐рддреЛ, рдЖрдгрд┐ рд╢реЗрд╡рдЯреА рдПрдХ рдХрд╛рд░реНрдб рдЙрдВрдЪрд╛рд╡рддреЛ: "рдЭрд╛рд▓реЗ" рд╕рд╛рдареА 0, "рдирд╛рд╣реА" рд╕рд╛рдареА рдЗрддрд░ рдХреЛрдгрддрд╛рд╣реА рдЖрдХрдбрд╛. script рдореНрд╣рдгрдЬреЗ рддреЗрдЪ рдЖрджреЗрд╢ рд▓рд┐рд╣реВрди рдареЗрд╡рд▓реЗрд▓реЗ, рдореНрд╣рдгрдЬреЗ рдХреЗрдЕрд░рдЯреЗрдХрд░ рддреЗ рд░рд╛рддреНрд░реА рддреБрдордЪреНрдпрд╛рд╢рд┐рд╡рд╛рдп рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
P["$ bin/school.sh list --class 3A"] --> C["ЁЯз╣ the caretaker (bash)"]
C --> O["ЁЯУД stdout тАФ the report"]
C --> E["ЁЯУг stderr тАФ the log"]
C --> X["ЁЯФв exit code $? тАФ 0 or not"]
тЭУ рдХрд╛рдп
- command рдореНрд╣рдгрдЬреЗ рдПрдХ program рдХрд┐рдВрд╡рд╛ built-in; рддреНрдпрд╛рдорд╛рдЧреЗ arguments рдпреЗрддрд╛рдд; flags
(
--class,-h) рд╣реЗ рд░реВрдвреАрдиреЗ arguments рдЪ рдЕрд╕рддрд╛рдд. - рдкреНрд░рддреНрдпреЗрдХ command рдПрдХрд╛ exit code рдиреЗ рд╕рдВрдкрддреЛ:
0рдпрд╢,1тАУ255рдЕрдкрдпрд╢.$?рдордзреНрдпреЗ рд╢реЗрд╡рдЯрдЪрд╛ code рдЕрд╕рддреЛ.&&,||,if, cron, CI рдЖрдгрд┐ Docker рд╕рдЧрд│реЗ рддреЛрдЪ рд╡рд╛рдЪрддрд╛рдд. - рдмрд╣реБрддреЗрдХ Linux рдЖрдгрд┐ macOS рд╡рд░ bash рд╣рд╛ shell рдЖрд╣реЗ; sh (POSIX) рд╣реА рдЬреБрдиреА
рд╕рд╛рдорд╛рдпрд┐рдХ рднрд╛рд╖рд╛ рдЖрд╣реЗ. file рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрдЪреЗ
#!/usr/bin/env bashрдирд┐рд╡рдб рдХрд░рддреЗ. man cmd,cmd --help,type cmd,which cmdрд╣рд╛ рд╕реВрдЪрдирд╛ рдлрд▓рдХ рдЖрд╣реЗ.
ЁЯдФ рдХрд╛
рдкреНрд░рддреНрдпреЗрдХ server, container рдЖрдгрд┐ CI runner рдЕрдЬреВрдирд╣реА рдЕрд╕реЗрдЪ рдЖрджреЗрд╢ рдШреЗрддреЛ. рдкрд╛рдЪ commands pipe рдордзреНрдпреЗ рдЬреЛрдбреВ рд╢рдХрдгрд╛рд░рд╛ developer рджрд╣рд╛ seconds рдордзреНрдпреЗ рдЬреЗ рдХрд░рддреЛ, рддреНрдпрд╛рд▓рд╛ рджреБрд╕рд▒реНрдпрд╛ рднрд╛рд╖реЗрдд script рд▓рд┐рд╣реВрди рджрд╣рд╛ рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧрддрд╛рдд тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ deploy, backup рдЖрдгрд┐ incident shell рдордзреВрдирдЪ рд╕реБрд░реВ рд╣реЛрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
bin/school.sh рд╕реБрдорд╛рд░реЗ ~70 рдУрд│реАрдВрдЪреА рдЖрд╣реЗ: strict mode, рдПрдХ HERE anchor, рд╕рд╛рдорд╛рдпрд┐рдХ log
library, рдкрд╛рдЪ cmd_* functions рдЖрдгрд┐ case рдЕрд╕рд▓реЗрд▓реЗ рдПрдХ main. рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛
рддреНрдпрд╛рд▓рд╛ рд╢рд┐рдХрд╡рдгрд╛рд▒реНрдпрд╛ рдУрд│реАрдВрдХрдбреЗ рдмреЛрдЯ рджрд╛рдЦрд╡рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
bin/school.sh list # the register
bin/school.sh list --class 3A; echo "exit code: $?"
bin/school.sh teleport; echo "exit code: $?" # an unknown command: a log line, exit 1
bin/school.sh --help
bash bin/smoke_test.sh # the whole course in a minute
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
рдкрд╛рдЪ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдЪреЗ table; рдЪрд╛рдВрдЧрд▓реНрдпрд╛ command рдирдВрддрд░ exit code: 0 рдЖрдгрд┐ teleport рдирдВрддрд░ 1,
рдЖрдгрд┐ stderr рд╡рд░ ERROR: unknown command рдЫрд╛рдкрд▓реЗрд▓реЗ; smoke test
ЁЯОЙ the caretaker's routine runs рдиреЗ рд╕рдВрдкрддреЛ.
expected-output.txt рд╢реА рддреБрд▓рдирд╛ рдХрд░рд╛.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
command рдХрдбреЗ рдПрдХ рдЙрддреНрддрд░, рдПрдХ log рдЖрдгрд┐ рдПрдХ exit code рдЕрд╕рддреЛ тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА рддреЗ рддрд┐рдиреНрд╣реА рд╡рд╛рдЪреВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдпрд╢ рдард░рд╡рдгреНрдпрд╛рд╕рд╛рдареА output рд╡рд╛рдЪрдгреЗ.
$?рд╡рд╛рдЪрд╛. School.shрдЯрд╛рдЗрдк рдХрд░рдгреЗ тАФ рдЕрдХреНрд╖рд░рд╛рдВрдЪрд╛ case рдорд╣рддреНрддреНрд╡рд╛рдЪрд╛ рдЖрд╣реЗ; рдЖрдгрд┐./рдХрд┐рдВрд╡рд╛bin/рд▓рд╛рдЧрддреЗ, shell рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ directory рдордзреНрдпреЗ рд╢реЛрдзрдд рдирд╛рд╣реА.- shell рдЪреА рднреАрддреА рд╡рд╛рдЯрдгреЗ. рддреЛ рдХреЗрдЕрд░рдЯреЗрдХрд░ рдЖрд╣реЗ, рдЬрд╛рджреВрдЧрд╛рд░ рдирд╛рд╣реА.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: exit code рд╣рд╛ рддреБрдордЪреА script рдЖрдгрд┐ рддреА рдЪрд╛рд▓рд╡рдгрд╛рд░реЗ рд╕рдЧрд│реЗ рдпрд╛рдВрдЪреНрдпрд╛рдордзрд▓рд╛ рдХрд░рд╛рд░ рдЖрд╣реЗ. "ERROR" рдЫрд╛рдкрдгрд╛рд░рд╛ рдкрдг 0 рдиреЗ exit рд╣реЛрдгрд╛рд░рд╛ deploy рдореНрд╣рдгрдЬреЗ рд╣рд┐рд░рд╡реА рдЦреВрдг рдЖрдгрд┐ рддреБрдЯрд▓реЗрд▓реА site.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 02 тАФ files, paths рдЖрдгрд┐ permissions: рдЗрдорд╛рд░рддреАрдЪрд╛ рдирдХрд╛рд╢рд╛ рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛ рдЦреЛрд▓реАрдд рдХреЛрдг рдЬрд╛рдК рд╢рдХрддреЗ.