Minulla on joitain ongelmia joidenkin bash-komentosarjojen kanssa, virheistä ja odottamattomasta käyttäytymisestä. Haluaisin tutkia ongelmien syitä, jotta voin soveltaa korjauksia. Onko mahdollista kääntää jonkinlainen ”debug-mode” bashille saadaksesi lisätietoja?
Vastaa
Käynnistä bash-komentosarja tiedostolla bash -x ./script.sh
tai lisää komentosarjaasi set -x
nähdäksesi virheenkorjauksen.
Lisätunnus bash
4.1 tai uudempi:
Jos haluat kirjoittaa virheenkorjaustuloksen erilliseen tiedostoon, lisää tämä komentosarjaasi:
exec 5> debug_output.txt BASH_XTRACEFD="5"
Katso: https://stackoverflow.com/a/25593226/3776858
Jos haluat nähdä rivinumerot, lisää tämä:
PS4="$LINENO: "
Jos sinulla on käyttöoikeus logger
-komennon avulla voit kirjoittaa tämän virheenkorjaustulostuksen syslogisi kautta aikaleimalla, komentosarjan nimellä ja rivinumerolla:
#!/bin/bash exec 5> >(logger -t $0) BASH_XTRACEFD="5" PS4="$LINENO: " set -x # Place your code here
Voit määrittää logger
-komennon -p
-komennolla yksittäisen tilan ja tason. kirjoittaa lähdön paikallisen järjestelmälokin kautta omaan lokitiedostoonsa.
Kommentit
Vastaa
Käyttämällä set -x
Käytän aina set -x
ja set +x
. Voit kääriä alueita, jotka haluat nähdä, mitä heidän kanssaan tapahtuu, kääntääksesi sanatarkkuuden ylös / alas.
#!/bin/bash set -x ..code to debug... set +x
log4bash
myös Jos olet tehnyt kehitystyötä ja tunnet loggereiden tyylin, jonka nimi on log4j, log4perl jne., kannattaa ehkä käyttää log4bash .
ote
Ollaksemme vastakkain – tavallinen vanha kaiku vain ei leikkaa sitä. log4bash on yritys saada parempi kirjaus Bash-komentosarjoille (ts. tehdä kirjaaminen Bashin imemisestä vähemmän).
Sieltä voit tehdä tällaisia asioita omassa Bash-komentosarjat:
#!/usr/bin/env bash source log4bash.sh log "This is regular log message... log and log_info do the same thing"; log_warning "Luke ... you turned off your targeting computer"; log_info "I have you now!"; log_success "You"re all clear kid, now let"s blow this thing and go home."; log_error "One thing"s for sure, we"re all gonna be a lot thinner."; # If you have figlet installed -- you"ll see some big letters on the screen! log_captains "What was in the captain"s toilet?"; # If you have the "say" command (e.g. on a Mac) log_speak "Resistance is futile";
Tuloksena tämän tyyppinen lähtö:
log4sh
Jos tarvitset jotain kannettavampaa, siellä on myös vanhempi log4sh
. Toimii samalla tavalla kuin log4bash
, saatavilla täältä:
Kommentit
- Ubuntussa minulla on
alias say="spd-say"
.bashrc-tiedostossa, joka jäljitteleesay
-komento muilta distrosilta tai OS X: ltä. - set -vx olisi hyvä yhdistelmä, jos sitä käytetään trap – trap read debug -toiminnon kanssa. Tämän avulla voit siirtyä rivi riviltä ja nähdä tulokset
vastaus
Siellä on bash-virheenkorjaus, bashdb , joka on asennettava paketti moniin distroihin. Se käyttää bashin sisäänrakennettua laajennettua virheenkorjaustilaa (shopt -s extdebug
). Se näyttää paljon kuin gdb; tässä ”näyteistunto antaa makua:
$ ls 1st.JPG 2ndJPG.JPG $ cat ../foo.sh for f in *.JPG do newf=${f/JPG/jpg} mv $f $newf done $ bashdb ../foo.sh (foo.sh:1): 1: for f in *.JPG bashdb<0> next (foo.sh:3): 3: newf=${f/JPG/jpg} bashdb<1> next (foo.sh:4): 4: mv $f $newf
Kuten gdb: ssä, lauseke näytetään juuri ennen sitä aiotaan suorittaa. Joten voimme tutkia muuttujia nähdäksemme, mitä käsky tekee ennen kuin se tekee sen.
bashdb<2> print $f $newf 1st.JPG 1st.jpg bashdb<3> next (foo.sh:1): 1: for f in *.JPG bashdb<4> next (foo.sh:3): 3: newf=${f/JPG/jpg} bashdb<5> next (foo.sh:4): 4: mv $f $newf bashdb<6> print $f $newf 2ndJPG.JPG 2ndjpg.JPG
Se ei ole sitä, mitä haluamme! Katsotaanpa parametrien laajennus uudelleen.
bashdb<7> print $f ${f/JPG/jpg} 2ndJPG.JPG 2ndjpg.JPG bashdb<8> print $f ${f/JPG$/jpg} 2ndJPG.JPG 2ndJPG.JPG bashdb<9> print $f ${f/%JPG/jpg} 2ndJPG.JPG 2ndJPG.jpg
OK, se toimii. Antakaa ”s asettaa newf
oikeaan arvoon.
bashdb<10> eval newf=${f/%JPG/jpg} $? is 0 bashdb<11> print $f $newf 2ndJPG.JPG 2ndJPG.jpg
Näyttää hyvältä. Jatka komentosarjaa.
bashdb<12> next Debugged program terminated normally. Use q to quit or R to restart. $ ls 1st.jpg 2ndJPG.jpg
Vastaus
Vakiomenetelmä komentosarjojen virheenkorjaamiseksi useimmissa Bourne-pohjaisissa kuoreissa, kuten bash on kirjoittaa set -x
komentosarjan yläosaan. Tämä tekee bashista tarkemman sanan siitä, mitä tehdään / suoritetaan ja kuinka argumentit arvioidaan.
-x Print commands and their arguments as they are executed.
tästä on hyötyä joko tulkille tai komentosarjoille. Esimerkiksi:
$ find "$fileloc" -type f -prune "$filename" -print + find /var/adm/logs/morelogs -type f -prune "-name *.user" -print find: unknown predicate "-name *.user" $ find "$fileloc" -type f -prune $filename -print + find /var/adm/logs/morelogs -type f -prune -name "*.user" -print find: "/var/adm/logs/morelogs": No such file or directory
Yllä olevasta näet, miksi haku epäonnistuu joidenkin yksittäisten lainausten vuoksi.
Poista ominaisuus käytöstä kirjoittamalla set +x
.
Vastaa
Eclipsen käyttäminen
Voit käyttää Eclipse- ja Shelled-yhdistettyä ympäristöä alla linkitetyn komentosarjan ”_DEBUG.sh” kanssa.
- Eclipse-kuorittu laajennus:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash-virheenkorjaus – toimii vain kuorineen:
http://sourceforge.net/projects/basheclipse/
kuoren vaihtaminen
oletuksena Shelled-kehitystyökalu käyttää tulkkina /bin/dash
. Vaihdoin tämän muotoon /bin/bash
, jotta se olisi paremmin yhteensopiva useimpien verkon ja ympäristöni komentotulkkien kanssa.
HUOMAUTUS: Voit muuttaa tätä siirtymällä kohtaan: Ikkuna -> Etusija -> Shell-komentosarja -> Tulkit
Asennusohjeet
Debugger-paketissa on ohjeet _DEBUG.sh
-skriptin käyttämiseen komentosarjojen virheenkorjauksessa, joka on periaatteessa (readme.txt):
- Luo Shell-komentosarjaprojekti: Tiedosto -> Uusi -> Muu – > Shell-komentosarja
-> Ohjattu komentosarjan komentotulkki .
script.sh
. Laajennuksen on oltava ”.sh” ja se on välttämätön. _DEBUG.sh
projektikansioon. Lisää seuraava teksti tiedoston yläosaan script.sh
:
. _DEBUG.sh
Jos tiedosto on luotu Microsoft Windowsissa, suorita sitten tiedosto -> Muunna rivien erottimet -> Unix .
Määritä virheenkorjauksen käynnistysmääritys: Suorita -> Virheenkorjauskokoonpanot -> Bash-komentosarja … Täällä on kaksi kenttää:
a) ”Bash-komentosarja:” – Eclipsen työtilan polku Bash-komentosarjaan virheenkorjaamiseksi.
e) ”Debugger-portti:” 33333
Vaihda Debug-perspektiiviin. Aloita virheenkorjausistunto. Käynnistä script.sh
bash-kuoresta.
Bash-virheenkorjauskäyttöliittymä
Tämä virheenkorjausohjelma sisältää kaikki tavallisten ohjelmointivirheenkorjaajien ominaisuudet, kuten:
- Katkaisupisteen vaihto
- Yksi vaihe vaiheelta -toiminto
- Step-in, Step-out, Step-over -toiminnot ja alirutiinit
- Koodin tai muuttujien tutkiminen missä tahansa vaiheessa komentosarjan ollessa käynnissä
Kuoritulla (Shell Script Editor) IDE: llä (integroitu kehitysympäristö) on ylimääräinen bonus kontekstin tarkistamisesta, korostamisesta ja sisennyksestä kirjoittaessasi komentosarjaa. Jos se ei sisennä oikein, saatat pystyä välittömästi ilmoittamaan / paikallistamaan monia virheitä siellä.
Sitten on muita IDE-etuja kuten:
- TODO-tehtäväluettelo
- Mylyn-tehtävä
- Kirjanmerkkiluettelo
- Useita Ikkunan muokkaus
- Ympäristön etäjako
Kommentit
- Viileä vinkki. Kiva tietää, että Bash voi virheenkorjaus tällä tavalla.
Vastaus
Viime vuosina on ilmestynyt upea resurssi: http://shellcheck.net
se näyttää sinulle enemmän kuin tavallinen bash, jolloin joku voi helposti löytää ne ärsyttävät suljetut lainaukset tai kiharat hakasulkeet jne.
Varmista, että et liitä arkaluonteisia tietoja (ips, salasanat jne.) Internetiin … (varsinkin kun se on http, salaamaton) (uskon myös, että shellcheck on saatavana ladata, mutta en ole varma)
Vastaa
Nykyään on olemassa VS Code Bash -vianetsintä.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Siinä on ”Astu sisään / ulos / over ”ja näyttää myös kunkin muuttujan arvon.
Kommentit
- tämä vastaus ei koske kysymystä oikeassa yhteydessä; oletetaan komentorivi, koska IDE: tä ei mainittu
Vastaa
käytä vain:
#!/bin/bash -x
sama kuorelle:
#!/bin/sh -x
BASH_XTRACEFD="5"
bash kirjoittaa jälkilähdön, joka syntyy, kunset -x
on käytössä -tiedoston kuvaajaan 5.exec 5> >(logger -t $0)
ohjaa ulostulon tiedostokuvaajasta 5 osioonlogger
-komento.