Mustand: sisu ei ole veel tehniliselt ega keeleliselt täielikult kontrollitud ega toimetatud.

Peatüki vaade

Linux/Unix/macOS käsurea kiirõpik

Praegu loed peatükki Muutujad, keskkond, PATH ja aliased, mis kuulub osasse Osa II: Süsteemi pilt ja haldus.

Muutujad, keskkond, PATH ja aliased

Selles peatükis vaatame shelli muutujaid, keskkonnamuutujaid, PATH-i, alias'eid ja prompti seadistamist.

Kiirspikker

  • nimi=väärtus loob shellimuutuja
  • export NIMI=väärtus loob keskkonnamuutuja
  • echo "$PATH" näitab otsinguteed
  • alias ll='ls -la' loob aliase
  • alias h='history | tail -n 20' loob ajaloo lühialiase
  • env näitab keskkonda

Levinud kontrollkäsud

  • echo "$PATH" kuva otsingutee
  • command -v python3 leia, kust konkreetne käsk leitakse
  • type cd näita, mis liiki käsk see on
  • type -a grep näita kõik samanimelised vasted
  • alias ll='ls -lah' loo lühinimi detailsele ls-ile
  • alias h='history | tail -n 20' loo lühinimi ajaloo vaatamiseks
  • source ~/.zshrc loe shelli seadistusfail uuesti sisse
  • env | grep NIMI kontrolli, kas keskkonnamuutuja on olemas

Loogika

Selles peatükis on kolm eri asja, mida ei tohi segamini ajada:

  1. shellimuutujad
  2. keskkonnamuutujad
  3. alias'ed

Nende rollid on erinevad:

  • muutuja hoiab väärtust
  • keskkonnamuutuja antakse edasi alamprotsessidele
  • alias asendab lühinime teise käsuga

Selles peatükis lisandub veel üks väga tähtis vahe:

  • osa "käske" on shelli enda sees
  • osa on välised programmid failisüsteemis

Käivita need käsud


nimi='Mari'
echo "$nimi"
export PROOV='tere'
env | grep PROOV

echo "$PATH"
command -v python3
type cd
alias ll='ls -la'
ll

Shellimuutuja ja keskkonnamuutuja

Shellimuutuja elab tavaliselt ainult jooksvas shellis. Keskkonnamuutuja eksporditakse edasi alamprotsessidele.

Näide:


nimi='Mari'
export PROJEKT='linux-opik'
sh -c 'echo "$nimi / $PROJEKT"'

Siin alam-shell näeb PROJEKT muutujat, aga mitte tingimata muutujat nimi.

See on kõige olulisem vahe, mida alguses meeles pidada.

Mis asi "käsk" üldse on

Terminalis kirjutatud nimi ei tähenda alati üht ja sama tüüpi asja.

Praktikas võib see olla näiteks:

  • alias
  • shelli funktsioon
  • shelli sisseehitatud käsk
  • shelli reserveeritud sõna
  • väline programm kettal

Näited:

  • cd on tavaliselt shelli sisseehitatud käsk
  • if, for, do, done on shelli reserveeritud sõnad
  • grep, sed, awk, python3 on tavaliselt välised programmid
  • ll võib olla alias

See on tähtis, sest:

  • sisseehitatud käske ei otsita alati PATH-ist
  • reserveeritud sõnad ei ole üldse "programmid"
  • alias võib sama nimega välise käsu varjutada

Kuidas kontrollida, mis tüüpi käsk sul ees on

Kõige praktilisem käsk selle jaoks on:


type cd
type if
type grep
type ll

Tüüpilised tulemused võivad olla:


cd is a shell builtin
if is a shell keyword
grep is /usr/bin/grep
ll is an alias for ls -lah

Kui tahad lihtsalt teada, mida shell jooksutaks, on hea ka:


command -v grep
command -v cd
command -v ll

Praktiline rusikareegel:

  • type on parem õppimiseks, sest ta ütleb ka käsu liigi
  • command -v on hea skriptides ja lühemaks kontrolliks

Kui tahad näha kõiki samanimelisi vasteid, kasuta:


type -a python3
type -a grep

See on eriti kasulik siis, kui süsteemis on mitu sama nimega käsku.

PATH loogika

Kui kirjutad terminali:


python3

siis shell ei tea automaatselt, kus see fail asub. Ta otsib seda kataloogidest, mis on kirjas muutujas PATH.

Seetõttu on need kaks käsku väga praktilised:


echo "$PATH"
command -v python3

Kui käsk ei leidu, on probleem sageli just selles:

  • programm pole paigaldatud
  • selle asukoht pole PATH-is

Kuidas sama nimega käske otsitakse

Kui nimi ei ole alias, funktsioon, sisseehitatud käsk ega reserveeritud sõna, siis hakkab shell otsima väliseid programme mööda PATH-i.

Oluline loogika:

  • PATH on kataloogide nimekiri
  • neid vaadatakse vasakult paremale
  • esimene sobiv fail võidab

Näide:


echo "$PATH"

võib anda midagi sellist:


/Users/vilo/bin:/usr/local/bin:/usr/bin:/bin

Kui samanimeline programm on:

  • /Users/vilo/bin/grep
  • /usr/bin/grep

siis leitakse esimesena /Users/vilo/bin/grep, sest see kataloog on PATH-is eespool.

See on põhjus, miks PATH järjekord loeb.

Kuidas panna oma bin ette või taha

Väga tavalised kohad enda tööriistade jaoks on:

  • ~/bin
  • ~/.local/bin

Kui tahad, et sealt otsitaks esimesena, lisa see PATH-i ette:


export PATH="$HOME/bin:$PATH"

või:


export PATH="$HOME/.local/bin:$PATH"

Kui tahad, et sealt otsitaks alles hiljem, lisa see lõppu:


export PATH="$PATH:$HOME/bin"

See tähendab:

  • ette lisamine annab sinu tööriistadele eelisõiguse
  • lõppu lisamine jätab süsteemi vaikevahendid ettepoole

Hea praktiline soovitus on:

  • kui tead, et tahad omaenda skripte eelistada, lisa ~/bin ettepoole
  • kui tahad olla ettevaatlikum, lisa see lõppu

Näide oma käsu lisamisest PATH-i


mkdir -p "$HOME/bin"
cat > "$HOME/bin/tere" <<'EOF'
#!/bin/sh
echo "Tere oma bin-kataloogist"
EOF
chmod +x "$HOME/bin/tere"
export PATH="$HOME/bin:$PATH"
command -v tere
tere

Siin juhtub:

  • lood oma väikese käsu
  • teed selle käivitatavaks
  • lisad ~/bin otsingutee ette
  • shell leiab nüüd käsu nime järgi üles

Kui tahad seda püsivaks teha, lisa sama export PATH=... rida:

  • ~/.zshrc, kui kasutad zsh
  • ~/.bashrc, kui kasutad bash

.zshrc, .zprofile, .bashrc ja .bash_profile

See on üks suuremaid segaduskohti shelli seadistamisel.

Praktiline jaotus on tavaliselt selline:

  • ~/.zshrc
  • sinna pane alias'ed, prompt ja muud interaktiivse shelli mugavused

  • ~/.zprofile
  • sinna pane login-shelli algseadistused, näiteks osa PATH-ist

  • ~/.bashrc
  • sinna pane alias'ed ja interaktiivse bash'i seadistused

  • ~/.bash_profile
  • seda loeb bash login-shellis; tihti pannakse see omakorda ~/.bashrc sisse lugema

Hea rusikareegel:

  • alias'ed ja prompt lähevad enamasti ~/.zshrc või ~/.bashrc
  • PATH ja muud sessiooni algseadistused lähevad sageli ~/.zprofile või ~/.bash_profile

Näiteks zsh puhul:


cat >> ~/.zprofile <<'EOF'
export PATH="$HOME/bin:$PATH"
EOF

cat >> ~/.zshrc <<'EOF'
alias ll='ls -lah'
alias h='history | tail -n 20'
EOF

Kui mõni alias või PATH-i muudatus "mõnikord töötab ja mõnikord mitte", siis põhjus on väga sageli just selles, et rida sattus valesse startup-faili.

Miks which võib olla petlik

Mõnes süsteemis kasutatakse ka käsku:


which grep

Aga õppimise mõttes on parem eelistada:


type grep
command -v grep

Põhjus on lihtne:

  • which keskendub rohkem välistele käskudele
  • type ja command -v räägivad paremini shelli enda vaatenurgast
  • aliaste ja sisseehitatud käskude puhul on type tavaliselt õpetlikum

Värvid või mitte

Mõned keskkonnad kasutavad värve vaikimisi, teised mitte. Näiteks:


ls --color=auto
grep --color=auto root /etc/passwd

Värvid võivad aidata, kuid skriptides ei tasu neid alati eeldada.

Alias'ed

Alias on lühike mugav nimi sagedase käsu jaoks.

Mõistlikud alias'ed on:


alias ll='ls -lah'
alias la='ls -A'
alias l='ls -CF'
alias h='history | tail -n 20'
alias gs='git status'
alias gp='git pull'
alias v='vim'

Need on head just sellepärast, et:

  • nad lühendavad sageli kasutatavaid käske
  • nad ei varja liiga palju loogikat
  • neid on lihtne meeles pidada

Alias h on praktiline just sellepärast, et ta näitab kiirelt viimaseid ajalookirjeid ilma, et peaks kogu ajalugu läbi kerima.

Väldi alias'eid, mis muudavad ohtlikke käske liiga "maagiliseks".

Kuhu alias'ed panna

Tavaliselt:

  • ~/.zshrc, kui kasutad zsh
  • ~/.bashrc, kui kasutad bash

Siin tähendab ~ sinu kodukataloogi lühikuju.

Näide:


cat >> ~/.zshrc <<'EOF'
alias ll='ls -lah'
alias la='ls -A'
alias h='history | tail -n 20'
alias gs='git status'
alias gp='git pull'
EOF

Pärast faili muutmist lae seadistus uuesti sisse:


source ~/.zshrc

või:


source ~/.bashrc

Ajalugu shellis

Paljud shellid lubavad ajalugu mugavalt kasutada ja isegi seadistada.

Varases algusosas piisab täiesti käsust history. Alles pärast torude ja filtrite selgeks saamist muutub loomulikuks ka lühem vaade, kus ajaloost näidatakse ainult viimaseid ridu.

Näiteks:


history
history | tail -n 20
echo $HISTFILE
echo $HISTSIZE

Kui tahad ajaloo jaoks lühikest mugavat alias't, siis üks hea ja arusaadav variant on:


alias h='history | tail -n 20'

See on hea just sellepärast, et:

  • history näitab shelli käskude ajalugu
  • tail -n 20 lõikab sellest välja viimased 20 rida
  • sama kuju on algajale kergem lugeda kui shellispetsiifiline fc

Mõnes shellis kohtab ka kujusid nagu history 20, history -20 või fc -l -20, kuid neid ei tasu õpiku põhikuju näitena eelistada, sest need ei käitu kõikjal ühtemoodi.

Mõnes shellis saab seadistada:

  • mitu käsku meelde jäetakse
  • kas duplikaadid eemaldatakse
  • kas ajalugu kirjutatakse faili kohe või alles shelli sulgemisel

See on eriti kasulik bash-i ja zsh-i kasutamisel.

Prompti eri kujud

Prompt on tekst, mida näed enne käsu sisestamist. See ei ole käsu osa, vaid shelli kasutajaliidese osa.

Praktikas võib prompt näidata:

  • kasutajanime
  • masina nime
  • praegust kataloogi
  • aktiivset virtuaalkeskkonda
  • seda, kas oled tavakasutaja või root

Sama asukoht võib eri promptidega välja näha näiteks nii:


$ pwd
/Users/vilo/proov

% pwd
/Users/vilo/proov

vilo@macbook proov % pwd
/Users/vilo/proov

vilo@server:~/proov$ pwd
/home/vilo/proov

(.venv) vilo@macbook proov % pwd
/Users/vilo/proov

Oluline reegel on:

  • prompti kuju on mugavus
  • pwd on kindel kontroll

Ajutised prompti näited bashi jaoks

Neid tasub alguses proovida ajutiselt jooksvas shellis, mitte kohe config-faili kirjutada.

Väga lihtne prompt:


export PS1='$ '

Kasutaja, host ja täielik tee:


export PS1='\u@\h \w \$ '

Ainult viimase kataloogi nimi:


export PS1='\u@\h \W \$ '

Koos kellaajaga:


export PS1='[\A] \u@\h \W \$ '

Siin:

  • \u on kasutajanimi
  • \h on hosti lühinimi
  • \w on täielikum tee
  • \W on ainult viimase kataloogi nimi

Ajutised prompti näited zsh jaoks

zsh kasutab promptis veidi teisi lühikoode.

Väga lihtne prompt:


export PROMPT='%# '

Kasutaja, host ja kodukataloogi suhteline tee:


export PROMPT='%n@%m %~ %# '

Ainult viimase kataloogi nimi:


export PROMPT='%n@%m %1~ %# '

Virtuaalkeskkonna ja git-haru asemel me siin veel midagi automaatselt juurde ei lisa, aga just sellise loogika peale need keerukamad promptid ehitataksegi.

Siin:

  • %n on kasutajanimi
  • %m on hosti lühinimi
  • %~ on tee kodukataloogi suhtes
  • %1~ on ainult viimane olulisem teelõik
  • %# annab tavakasutajale % ja root'ile #

Värvilised promptid

Värv on ainult visuaalne abi. See ei muuda käsu sisu, aga võib aidata kiiremini aru saada, kus sa oled.

Lihtne värviline prompt zsh jaoks:


export PROMPT='%F{blue}%n@%m%f %F{green}%1~%f %# '

Lihtne värviline prompt bash jaoks:


export PS1='\[\e[34m\]\u@\h\[\e[0m\] \[\e[32m\]\W\[\e[0m\] \$ '

Kui tahad lihtsalt katsetada:

  1. käivita üks prompti näide
  2. tee pwd
  3. liigu teise kausta
  4. võrdle, mida prompt näitab ja mida pwd kinnitab

See on parim viis prompti loogikast aru saada.

Mõned praktilised keskkonnamuutujad

Need tulevad väga sageli ette:

  • PATH kust käske otsida
  • HOME kasutaja kodukataloog
  • EDITOR vaikimisi tekstiredaktor
  • SHELL kasutatav shell

Näited:


echo "$HOME"
echo "$SHELL"
export EDITOR=vim

Minitest

  1. Loo alias la='ls -la'.
  2. Loo alias h='history | tail -n 20'.
  3. Vaata oma PATH muutujat.
  4. Ekspordi muutuja DEMO=1 ja kontrolli seda käsuga env.
  5. Vaata, kuhu sinu shell käsuajalugu salvestab.
  6. Lisa alias ll='ls -lah' oma shelli config-faili ja lae see uuesti sisse.