Kuinka korjata bash-komentosarja?

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

  • -v voivat myös auttaa (tulostaa jokaisen rivin suorituksen aikana). voidaan yhdistää -x: n kanssa). Ja katso myös: bashdb.sourceforge.net
  • toinen upea resurssi on: shellcheck .net
  • Mitä ” exec 5 > ” tehdä?
  • @aggsol: Jos käytät BASH_XTRACEFD="5" bash kirjoittaa jälkilähdön, joka syntyy, kun set -x on käytössä -tiedoston kuvaajaan 5. exec 5> >(logger -t $0) ohjaa ulostulon tiedostokuvaajasta 5 osioon logger -komento.
  • Mietitkö, voitko saada rivinumeron ja komentotulkkikomennon polun tai nimen PS4: ssä?

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ö:

        ss1

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äljittelee say -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.

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):

  1. Luo Shell-komentosarjaprojekti: Tiedosto -> Uusi -> Muu – > Shell-komentosarja

-> Ohjattu komentosarjan komentotulkki .

  • Luo Bash-komentosarjatiedosto: tiedosto -> Uusi -> tiedosto . Tässä esimerkissä se on script.sh. Laajennuksen on oltava ”.sh” ja se on välttämätön.
  • Kopioi tiedosto _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ä

    kirjoita kuvan kuvaus tähän

    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.

    VS Code Bash Debug -näyttökuva

    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 

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *