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 Lihtne veaotsing käsureal, mis kuulub osasse Osa II: Süsteemi pilt ja haldus.

Lihtne veaotsing käsureal

Veaotsing ei alga uue käsu proovimisest, vaid olukorra kitsendamisest. Enamiku algaja vigade puhul aitab lühike kontrollrada: mida täpselt käivitati, mida terminal vastas, kus sa oled, kas fail või käsk on olemas ja kas õigused lubavad.

Loogika

Hea käsurea veaotsing liigub kitsamaks:

  1. kirjuta üles täpne käsk ja täpne veateade
  2. kontrolli asukohta ja failinime
  3. kontrolli, kas käsk on leitav
  4. kontrolli õigusi ja skripti esimest rida
  5. kontrolli, kas probleem on paketis, shellis või teekonnas

Ära alusta juhusliku “paranduskäsu” kopeerimisest. Kui esimene oletus on vale, võib järgmine käsk teha olukorra segasemaks.

Kiire orientiir

KontrollKäskMida näed
kus olenpwdpraegune täistee
mis siin onls -lahfailid, kaustad, õigused, peidetud kirjed
kas käsk leitaksecommand -v rgfailitee või tühi väljund
mis liiki käsk see ontype -a rgalias, builtin või failitee
kas fail lubabls -l skript.shõigused ja omanik
mis shelli skript küsibhead -n 1 skript.shnäiteks #!/usr/bin/env bash
kas süntaks on õigegrep --help, man greplühike abi või käsiraamat

Kõige väärtuslikum info on täpne veateade. “Ei tööta” ei ole veel diagnoos; permission denied, command not found või No such file or directory on juba diagnoosi algus.

Tüüpilised algaja vead

  • veateadet ei kopeerita täpselt
  • eeldatakse, et ollakse õiges kataloogis, aga pwd ütleb midagi muud
  • aetakse segi puuduv fail ja puuduv õigus
  • kasutatakse sudo-t enne, kui on selge, miks õigused ei luba
  • parandatakse PATH-i, kuigi käsu nimi oli lihtsalt valesti kirjutatud
  • käivitatakse Bashi skript sh-iga ja saadakse süntaksiviga

Kolme minuti kontrollrada

Kui käsk ei tööta, tee kõigepealt see väike rada.


pwd
ls -lah
command -v rg
type -a rg
echo "$SHELL"

Kui probleem on skriptiga:


ls -l skript.sh
head -n 1 skript.sh
bash skript.sh

Need käsud ei paranda veel midagi. Nad annavad pildi: asukoht, failid, käsu leidmine, shell ja skripti käivitusviis.

Levinud veateated

VeateadeTõenäoline põhjusEsimene kontroll
command not foundkäsk on valesti kirjutatud, paigaldamata või pole PATH-iscommand -v rg, echo "$PATH"
No such file or directoryfailinimi, tee või praegune kataloog on valepwd, ls, ls tee/fail
Permission deniedpuudub lugemis-, kirjutamis- või täitmisõigusls -l fail, ls -ld kaust
syntax errorkäsku tõlgendab vale shell või süntaks on valeecho "$SHELL", head -n 1 skript.sh
package not foundpaketihalduri nimi on vale või nimekiri vanapaketihalduse otsing ja vajadusel update
database is lockedteine paketihaldur töötaboota; ära kustuta lukufaile käsitsi

command not found

See viga tähendab, et shell ei leidnud käivitatavat käsku selle nime järgi.

Kontrolli:


command -v rg
type -a rg
echo "$PATH"

Kui command -v ei näita midagi, on järgmised küsimused:

  • kas käsu nimi on õige
  • kas tööriist on paigaldatud
  • kas paigaldatud tööriista kataloog on PATH-is

Kui nimi on õige ja tööriist puudub, mine peatükki Paketihaldus: apt, dnf, pacman, brew.

No such file or directory

See viga tähendab enamasti, et viitad failile või kataloogile, mida selle tee järgi ei leita.

Kontrolli:


pwd
ls
ls -lah
ls kahtlane-fail

Pööra tähelepanu kolmele asjale:

  • suur- ja väiketähed peavad klappima
  • tühikutega failinimed vajavad jutumärke
  • suhteline tee sõltub praegusest kataloogist

Näiteks:


ls "Minu fail.txt"
ls ./skript.sh
ls ../andmed/sisend.txt

Permission denied

See viga ei tähenda automaatselt, et pead kasutama sudo-t. Kõigepealt vaata, milline õigus puudu on.


ls -l fail
ls -ld kaust

Kui skript ei käivitu, kontrolli õigusi ja proovi seda teadlikult shelliga:


ls -l skript.sh
bash skript.sh

Kui skript peab olema otse käivitatav, siis täitmisõigus lisatakse näiteks nii:


chmod u+x skript.sh
./skript.sh

Kui probleem on süsteemikaustas, peatu korraks. Küsimus ei ole ainult käsus, vaid selles, kas sul peaks üldse olema õigus seda kohta muuta.

Vale shell või vale süntaks

Shellid on sarnased, kuid mitte samad. Bashi skript võib anda vea, kui käivitad selle sh-iga.

Kontrolli aktiivset shelli:


echo "$SHELL"

Kontrolli skripti esimest rida:


head -n 1 skript.sh

Bashi skripti tavaline esimene rida on:


#!/usr/bin/env bash

Kui tahad olla kindel, et skripti käivitab Bash:


bash skript.sh

Kui käsk ise on võõras, kinnita süntaks enne:


grep --help
man grep

Kui probleem tuli pärast paigaldust

Paigaldus võib õnnestuda, aga uus käsk ei ilmu kohe sinu shelli nähtavale.

Kontrolli:


command -v htop
type -a htop
echo "$PATH"

Kui pakett paigaldati Homebrew, pip või mõne projekti tööriistaga, võib vaja olla:

  • avada uus terminaliaken
  • aktiveerida õige virtuaalkeskkond
  • kontrollida, mis nimega käivitatav käsk päriselt paigaldati

Hea veakirjeldus

Kui küsid abi inimeselt või foorumist, pane kaasa vähemalt:

  1. mida tahtsid teha
  2. täpne käsk
  3. täpne veateade
  4. pwd väljund
  5. süsteem või keskkond, näiteks macOS, Ubuntu, WSL või terminal.cs.ut.ee

Hea veakirjeldus säästab aega ja vähendab juhuslike oletuste hulka.

Minitest

  1. Kontrolli, kas sinu masinas leitakse python3.
  2. Tee meelega üks vale failinimi ja vaata täpset veateadet.
  3. Selgita, mis vahe on vigadel command not found ja No such file or directory.
  4. Vaata ühe skripti õigusi käsuga ls -l.
  5. Kontrolli ühe skripti esimest rida käsuga head -n 1.
  6. Kirjuta näidis-veakirjeldus, kus on käsk, veateade ja pwd väljund.

Peatüki täisspikker

Baas ja süsteemipilt

Eesmärk

kitsenda viga enne parandamist: täpne veateade, asukoht, olemasolu, käsu leitavus, õigused ja shelli/süntaksi kontroll

Kontrollrada

  • pwdkontrolli, kus oled
  • ls -lahvaata faile, õigusi ja peidetud kirjeid
  • command -v rgkas käsk leitakse
  • type -a rgnäita kõik sama nimega vasted
  • ls -l skript.shvaata skripti õigusi
  • head -n 1 skript.shvaata skripti shebang'i
  • bash skript.shkäivita teadlikult Bashiga
  • grep --helpkinnita käsu süntaks

Levinud veateated

  • command not foundkäsk puudub, nimi vale või pole PATH-is
  • No such file or directorytee, failinimi või asukoht on vale
  • Permission deniedõigus ei luba lugeda, kirjutada või käivitada
  • syntax errorvale shell või vale käsukuju
  • package not foundpaketinimi või nimekiri on vale
  • database is lockedteine paketihaldur töötab