Muutujad, keskkond, PATH ja aliased
Selles peatükis vaatame shelli muutujaid, keskkonnamuutujaid, PATH-i, alias'eid ja prompti seadistamist.
Kiirspikker
nimi=väärtusloob shellimuutujaexport NIMI=väärtusloob keskkonnamuutujaecho "$PATH"näitab otsinguteedalias ll='ls -la'loob aliasealias h='history | tail -n 20'loob ajaloo lühialiaseenvnäitab keskkonda
Levinud kontrollkäsud
echo "$PATH"kuva otsinguteecommand -v python3leia, kust konkreetne käsk leitaksetype cdnäita, mis liiki käsk see ontype -a grepnäita kõik samanimelised vastedalias ll='ls -lah'loo lühinimi detailselels-ilealias h='history | tail -n 20'loo lühinimi ajaloo vaatamisekssource ~/.zshrcloe shelli seadistusfail uuesti sisseenv | grep NIMIkontrolli, kas keskkonnamuutuja on olemas
Loogika
Selles peatükis on kolm eri asja, mida ei tohi segamini ajada:
- shellimuutujad
- keskkonnamuutujad
- 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:
cdon tavaliselt shelli sisseehitatud käskif,for,do,doneon shelli reserveeritud sõnadgrep,sed,awk,python3on tavaliselt välised programmidllvõ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:
typeon parem õppimiseks, sest ta ütleb ka käsu liigicommand -von 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:
PATHon 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
~/binettepoole - 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
~/binotsingutee ette - shell leiab nüüd käsu nime järgi üles
Kui tahad seda püsivaks teha, lisa sama export PATH=... rida:
~/.zshrc, kui kasutadzsh~/.bashrc, kui kasutadbash
.zshrc, .zprofile, .bashrc ja .bash_profile
See on üks suuremaid segaduskohti shelli seadistamisel.
Praktiline jaotus on tavaliselt selline:
~/.zshrc~/.zprofile~/.bashrc~/.bash_profile
sinna pane alias'ed, prompt ja muud interaktiivse shelli mugavused
sinna pane login-shelli algseadistused, näiteks osa PATH-ist
sinna pane alias'ed ja interaktiivse bash'i seadistused
seda loeb bash login-shellis; tihti pannakse see omakorda ~/.bashrc sisse lugema
Hea rusikareegel:
- alias'ed ja prompt lähevad enamasti
~/.zshrcvõi~/.bashrc PATHja muud sessiooni algseadistused lähevad sageli~/.zprofilevõ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:
whichkeskendub rohkem välistele käskudeletypejacommand -vräägivad paremini shelli enda vaatenurgast- aliaste ja sisseehitatud käskude puhul on
typetavaliselt õ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 kasutadzsh~/.bashrc, kui kasutadbash
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:
historynäitab shelli käskude ajalugutail -n 20lõ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
pwdon 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:
\uon kasutajanimi\hon hosti lühinimi\won täielikum tee\Won 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:
%non kasutajanimi%mon 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:
- käivita üks prompti näide
- tee
pwd - liigu teise kausta
- võrdle, mida prompt näitab ja mida
pwdkinnitab
See on parim viis prompti loogikast aru saada.
Mõned praktilised keskkonnamuutujad
Need tulevad väga sageli ette:
PATHkust käske otsidaHOMEkasutaja kodukataloogEDITORvaikimisi tekstiredaktorSHELLkasutatav shell
Näited:
echo "$HOME"
echo "$SHELL"
export EDITOR=vim
Minitest
- Loo alias
la='ls -la'. - Loo alias
h='history | tail -n 20'. - Vaata oma
PATHmuutujat. - Ekspordi muutuja
DEMO=1ja kontrolli seda käsugaenv. - Vaata, kuhu sinu shell käsuajalugu salvestab.
- Lisa alias
ll='ls -lah'oma shelli config-faili ja lae see uuesti sisse.