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:
- kirjuta üles täpne käsk ja täpne veateade
- kontrolli asukohta ja failinime
- kontrolli, kas käsk on leitav
- kontrolli õigusi ja skripti esimest rida
- 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
| Kontroll | Käsk | Mida näed |
|---|---|---|
| kus olen | pwd | praegune täistee |
| mis siin on | ls -lah | failid, kaustad, õigused, peidetud kirjed |
| kas käsk leitakse | command -v rg | failitee või tühi väljund |
| mis liiki käsk see on | type -a rg | alias, builtin või failitee |
| kas fail lubab | ls -l skript.sh | õigused ja omanik |
| mis shelli skript küsib | head -n 1 skript.sh | näiteks #!/usr/bin/env bash |
| kas süntaks on õige | grep --help, man grep | lü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
| Veateade | Tõenäoline põhjus | Esimene kontroll |
|---|---|---|
command not found | käsk on valesti kirjutatud, paigaldamata või pole PATH-is | command -v rg, echo "$PATH" |
No such file or directory | failinimi, tee või praegune kataloog on vale | pwd, ls, ls tee/fail |
Permission denied | puudub lugemis-, kirjutamis- või täitmisõigus | ls -l fail, ls -ld kaust |
syntax error | käsku tõlgendab vale shell või süntaks on vale | echo "$SHELL", head -n 1 skript.sh |
package not found | paketihalduri nimi on vale või nimekiri vana | paketihalduse otsing ja vajadusel update |
database is locked | teine paketihaldur töötab | oota; ä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:
- mida tahtsid teha
- täpne käsk
- täpne veateade
pwdväljund- 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
- Kontrolli, kas sinu masinas leitakse
python3. - Tee meelega üks vale failinimi ja vaata täpset veateadet.
- Selgita, mis vahe on vigadel
command not foundjaNo such file or directory. - Vaata ühe skripti õigusi käsuga
ls -l. - Kontrolli ühe skripti esimest rida käsuga
head -n 1. - Kirjuta näidis-veakirjeldus, kus on käsk, veateade ja
pwdvä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 oledls -lahvaata faile, õigusi ja peidetud kirjeidcommand -v rgkas käsk leitaksetype -a rgnäita kõik sama nimega vastedls -l skript.shvaata skripti õigusihead -n 1 skript.shvaata skripti shebang'ibash skript.shkäivita teadlikult Bashigagrep --helpkinnita käsu süntaks
Levinud veateated
command not foundkäsk puudub, nimi vale või pole PATH-isNo such file or directorytee, failinimi või asukoht on valePermission deniedõigus ei luba lugeda, kirjutada või käivitadasyntax errorvale shell või vale käsukujupackage not foundpaketinimi või nimekiri on valedatabase is lockedteine paketihaldur töötab