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

ЁЯЧ║я╕П рдзрдбрд╛ 02 тАФ Files, paths рдЖрдгрд┐ permissions: рдЗрдорд╛рд░рддреАрдЪрд╛ рдирдХрд╛рд╢рд╛

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдкреБрдвреЗ: lesson-03-pipes-redirection


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

рдзрдбреЗ 01тАУ02. рдЧреЛрд╖реНрдЯреА рдХреБрдареЗ рдЖрд╣реЗрдд, рддреНрдпрд╛рдВрдирд╛ рдХреБрдареВрдирд╣реА рдирд╛рд╡ рдХрд╕реЗ рджреНрдпрд╛рдпрдЪреЗ, рдЖрдгрд┐ рдХреЛрдг рддреНрдпрд╛ рд╡рд╛рдЪреВ, рдмрджрд▓реВ рдХрд┐рдВрд╡рд╛ рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЗ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╢рд╛рд│рд╛ рд╣реА рдПрдХ рдЗрдорд╛рд░рдд рдЖрд╣реЗ: рдПрдХ рдореБрдЦреНрдп рджрд╛рд░ (/), рдХреЙрд░рд┐рдбреЙрд░ (folders) рдЖрдгрд┐ рдЦреЛрд▓реНрдпрд╛ (files). рддреБрдореНрд╣реА рдЦреЛрд▓реАрдЪреЗ рдирд╛рд╡ рдореБрдЦреНрдп рджрд╛рд░рд╛рдкрд╛рд╕реВрди рд╕рд╛рдВрдЧреВ рд╢рдХрддрд╛ тАФ absolute path, /home/you/school/data/register.csv тАФ рдХрд┐рдВрд╡рд╛ рддреБрдореНрд╣реА рдЬрд┐рдереЗ рдЙрднреЗ рдЖрд╣рд╛рдд рддрд┐рдереВрди тАФ relative path, data/register.csv. рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реАрд╡рд░ рдПрдХ рдкрд╛рдЯреА рдЕрд╕рддреЗ рдХреА рдХреЛрдг рддреА рд╡рд╛рдЪреВ рд╢рдХрддреЗ, рддрд┐рдЪреНрдпрд╛рд╡рд░ рд▓рд┐рд╣реВ рд╢рдХрддреЗ, рдХрд┐рдВрд╡рд╛ рдЖрдд рдЬрд╛рдК/рдЪрд╛рд▓рд╡реВ рд╢рдХрддреЗ: owner, рддреНрдпрд╛рдЪрд╛ group, рдЖрдгрд┐ рдмрд╛рдХреА рд╕рдЧрд│реЗ.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart TD
  R["/"] --> H["home/you"] --> S["school/"] --> D["data/register.csv  -rw-r--r--"]
  S --> B["bin/school.sh  -rwxr-xr-x"]
  S --> L["lib/log.sh"]

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

ЁЯдФ рдХрд╛

"No such file" рдЖрдгрд┐ "permission denied" рдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА script рдордзрд▓реНрдпрд╛ рджреЛрди рд╕рд░реНрд╡рд╛рдд рдиреЗрд╣рдореАрдЪреНрдпрд╛ errors рдЖрд╣реЗрдд, рдЖрдгрд┐ рджреЛрдиреНрд╣реА рдпрд╛рдЪ рдзрдбреНрдпрд╛рдд рдЖрд╣реЗрдд. рдлрдХреНрдд рдПрдХрд╛рдЪ folder рдордзреВрди рдЪрд╛рд▓рд╡рд▓реНрдпрд╛рд╡рд░ рдЪрд╛рд▓рдгрд╛рд░реА script рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓реА рдирд╛рд╣реА.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

school.sh HERE рдХрд╛рдврддреЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░реВрди ../data/register.csv рд▓рд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ, рдореНрд╣рдгреВрди bin/school.sh рдЖрдгрд┐ cd /tmp && /path/to/bin/school.sh рд╕рд╛рд░рдЦреЗрдЪ рд╡рд╛рдЧрддрд╛рдд.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

ls -la bin/ data/                       # who may run what
cd /tmp && "$OLDPWD/bin/school.sh" list && cd -     # called from elsewhere: still finds the register
cp bin/school.sh /tmp/s.sh && chmod -x /tmp/s.sh && /tmp/s.sh list; echo "exit $?"   # permission denied тЖТ 126
chmod 600 data/register.csv && ls -l data/register.csv && chmod 644 data/register.csv
find . -name '*.sh' | sort

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

рдиреЛрдВрджрд╡рд╣реА /tmp рдордзреВрдирд╣реА рджрд┐рд╕рддреЗ; x рдирд╕рд▓реЗрд▓реА copy Permission denied рдЖрдгрд┐ exit 126 рдиреЗ fail рд╣реЛрддреЗ; 600 рдирдВрддрд░ ls -l -rw------- рджрд╛рдЦрд╡рддреЛ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рддреБрдореНрд╣реА рдХреЛрдгрддреНрдпрд╛рд╣реА file рд▓рд╛ рдХреБрдареВрдирд╣реА рдирд╛рд╡ рджреЗрдК рд╢рдХрддрд╛, рддрд┐рдЪреА permission рдкрд╛рдЯреА рд╡рд╛рдЪреВ рд╢рдХрддрд╛, рдЖрдгрд┐ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ files рд╕реНрд╡рддрдГ рд╢реЛрдзрдгрд╛рд░реА script рд▓рд┐рд╣реВ рд╢рдХрддрд╛.

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

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: group рд▓рд╛ рд╡рд╛рдЪрддрд╛ рдпреЗрдгрд╛рд░реА secrets, 644 рд╡рд░ рдЕрд╕рд▓реЗрд▓реА deploy key, image рдордзреНрдпреЗ x рдирд╕рд▓реЗрд▓реА script тАФ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЦрд░рд╛ incident рдЖрд╣реЗ. ship рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА ls -l рдХрд░рд╛.

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

рдзрдбрд╛ 03 тАФ pipes рдЖрдгрд┐ redirection: рдХреЙрд░рд┐рдбреЙрд░, рдЖрдгрд┐ report рд╡ log рдХрдзреАрдЪ рдХрд╛ рдорд┐рд╕рд│реВ рдирдпреЗрдд.

ЁЯЧ║я╕П Lesson 02 тАФ Files, paths & permissions: the building map

ЁЯУН You are here: Lesson 02 of 12 ┬╖ Next: lesson-03-pipes-redirection


ЁЯУж What's in this branch

Lessons 01тАУ02. Where things are, how to name them from anywhere, and who may read, change or run them.

ЁЯзТ Explain like I'm 5

The school is a building with one front door (/), corridors (folders) and rooms (files). You can name a room from the front door тАФ an absolute path, /home/you/school/data/register.csv тАФ or from where you are standing тАФ a relative path, data/register.csv. Each room has a sign saying who may read it, write on it, or enter/run it: the owner, their group, everyone else.

ЁЯЧ║я╕П Diagram

flowchart TD
  R["/"] --> H["home/you"] --> S["school/"] --> D["data/register.csv  -rw-r--r--"]
  S --> B["bin/school.sh  -rwxr-xr-x"]
  S --> L["lib/log.sh"]

тЭУ What

ЁЯдФ Why

"No such file" and "permission denied" are the two most common errors in any script, and both are this lesson. A script that works only when run from one folder is not finished.

ЁЯФз How (in this repo)

school.sh computes HERE and refers to ../data/register.csv from it, so bin/school.sh and cd /tmp && /path/to/bin/school.sh behave the same.

ЁЯзк Try it

ls -la bin/ data/                       # who may run what
cd /tmp && "$OLDPWD/bin/school.sh" list && cd -     # called from elsewhere: still finds the register
cp bin/school.sh /tmp/s.sh && chmod -x /tmp/s.sh && /tmp/s.sh list; echo "exit $?"   # permission denied тЖТ 126
chmod 600 data/register.csv && ls -l data/register.csv && chmod 644 data/register.csv
find . -name '*.sh' | sort

тЬЕ Verify тАФ what you should see

The register lists from /tmp too; the copy without x fails with Permission denied and exit 126; ls -l shows -rw------- after 600.

ЁЯПБ What you just proved

You can name any file from anywhere, read its permission sign, and write a script that finds its own files.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: secrets readable by the group, a deploy key at 644, a script without x in the image тАФ each is a real incident. ls -l before you ship.

тПня╕П Next

Lesson 03 тАФ pipes & redirection: the corridors, and why the report and the log must never mix.

тЖР Previouswhy the shellNext тЖТpipes redirection

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