ЁЯПл The SchoolтА║ЁЯз╣ Shell scriptingтА║ЁЯз╣ рдзрдбрд╛ 01 тАФ shell рдХрд╛: рдХреЗрдЕрд░рдЯреЗрдХрд░рдЪрд╛ рдЖрд╡рд╛рдЬ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯз╣ рдзрдбрд╛ 01 тАФ shell рдХрд╛: рдХреЗрдЕрд░рдЯреЗрдХрд░рдЪрд╛ рдЖрд╡рд╛рдЬ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-files-and-paths


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

shell рдХреЛрдгрддреА рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рддреЛ тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ command рдХрдбреЗ рдЕрд╕рдгрд╛рд▒реНрдпрд╛ рддреАрди рдЧреЛрд╖реНрдЯреА: рдПрдХ рдЙрддреНрддрд░, рдПрдХ log, рдЖрдгрд┐ рдПрдХ exit code. рдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рдЕрд╢рд╛ рдЦрд▒реНрдпрд╛ files:

ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА: рддреБрдореНрд╣рд╛рд▓рд╛ 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"]

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдкреНрд░рддреНрдпреЗрдХ 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 рдЕрд╕рддреЛ тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА рддреЗ рддрд┐рдиреНрд╣реА рд╡рд╛рдЪреВ рд╢рдХрддрд╛.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: exit code рд╣рд╛ рддреБрдордЪреА script рдЖрдгрд┐ рддреА рдЪрд╛рд▓рд╡рдгрд╛рд░реЗ рд╕рдЧрд│реЗ рдпрд╛рдВрдЪреНрдпрд╛рдордзрд▓рд╛ рдХрд░рд╛рд░ рдЖрд╣реЗ. "ERROR" рдЫрд╛рдкрдгрд╛рд░рд╛ рдкрдг 0 рдиреЗ exit рд╣реЛрдгрд╛рд░рд╛ deploy рдореНрд╣рдгрдЬреЗ рд╣рд┐рд░рд╡реА рдЦреВрдг рдЖрдгрд┐ рддреБрдЯрд▓реЗрд▓реА site.

тПня╕П рдкреБрдвреЗ

рдзрдбрд╛ 02 тАФ files, paths рдЖрдгрд┐ permissions: рдЗрдорд╛рд░рддреАрдЪрд╛ рдирдХрд╛рд╢рд╛ рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛ рдЦреЛрд▓реАрдд рдХреЛрдг рдЬрд╛рдК рд╢рдХрддреЗ.

ЁЯз╣ Lesson 01 тАФ Why the shell: the caretaker's voice

ЁЯУН You are here: Lesson 01 of 12 ┬╖ Next: lesson-02-files-and-paths


ЁЯУж What's in this branch

The problem the shell solves тАФ and the three things every command has: an answer, a log, and an exit code. Real files you will use all the way through:

ЁЯОТ Before you start: you need bash and a terminal тАФ macOS, Linux, or WSL on Windows. Nothing to install. Good neighbours: the CI/CD school (where these scripts run on every push) and the Docker school (a script is the entrypoint of every container).

ЁЯзТ Explain like I'm 5

The school has a caretaker who does exactly what you say, one line at a time: "list the register", "back up the records", "ring the bell at two". You speak in commands with arguments. The caretaker answers on the notice board (stdout), grumbles into a notebook (stderr), and holds up a card at the end: 0 for "done", any other number for "no". A script is the same orders written down so the caretaker can run them at night without you.

ЁЯЧ║я╕П Diagram

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"]

тЭУ What

ЁЯдФ Why

Every server, container and CI runner still takes orders this way. A developer who can string five commands together in a pipe does in ten seconds what takes a script in another language ten minutes тАФ and every deploy, backup and incident starts in a shell.

ЁЯФз How (in this repo)

bin/school.sh is ~70 lines: strict mode, a HERE anchor, a shared log library, five cmd_* functions and a main with a case. Each lesson points at the lines that teach it.

ЁЯзк Try it

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

тЬЕ Verify тАФ what you should see

A table of five students; exit code: 0 after a good command and 1 after teleport, with ERROR: unknown command printed on stderr; the smoke test ends with ЁЯОЙ the caretaker's routine runs. Compare with expected-output.txt.

ЁЯПБ What you just proved

A command has an answer, a log and an exit code тАФ and you can read all three.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: the exit code is the contract between your script and everything that runs it. A deploy that prints "ERROR" but exits 0 is a green tick and a broken site.

тПня╕П Next

Lesson 02 тАФ files, paths & permissions: the building map and who may enter which room.

тЖР Course homeall lessonsNext тЖТfiles and paths

This page is the lesson's README from the lesson-01-why-the-shell branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.