Hvordan feilsøke et bash-skript?

Jeg har noen problemer med noen skript i bash, om feil og uventet oppførsel. Jeg vil undersøke årsakene til problemene slik at jeg kan søke rettelser. Er det en måte jeg kan slå på en slags «feilsøkingsmodus» for bash, for å få mer informasjon?

Svar

Start ditt bash-skript med bash -x ./script.sh eller legg til i skriptet ditt set -x for å se feilsøkingsutdata.


Tillegg med bash 4.1 eller nyere:

Hvis du vil skrive feilsøkingsutgangen til en egen fil, kan du legge til dette i skriptet:

exec 5> debug_output.txt BASH_XTRACEFD="5" 

Se: https://stackoverflow.com/a/25593226/3776858


Hvis du vil se linjenumre, legg til dette:

PS4="$LINENO: " 


Hvis du har tilgang til logger kommando så kan du bruke dette til å skrive feilsøkingsutdata via syslog med tidsstempel, skriptnavn og linjenummer:

#!/bin/bash exec 5> >(logger -t $0) BASH_XTRACEFD="5" PS4="$LINENO: " set -x # Place your code here 

Du kan bruke alternativet -p for logger kommando for å angi et individuelt anlegg og nivå å skrive utdata via lokal syslog til sin egen loggfil.

Kommentarer

  • -v kan også hjelpe (skriver ut hver linje når de blir henrettet. kan kombineres med -x). Og se også: bashdb.sourceforge.net
  • en annen fantastisk ressurs er: shellcheck .net
  • Hva betyr » exec 5 > » gjør?
  • @aggsol: Hvis du bruker BASH_XTRACEFD="5" bash skriver sporingsutgangen som genereres når set -x aktivert for filbeskrivelse 5. exec 5> >(logger -t $0) omdirigerer utdata fra filbeskrivelse 5 til logger kommando.
  • Bare lurer på, kan du få linjenummer og shell-skriptbane eller navn i PS4?

Svar

Ved hjelp av set -x

bruker jeg alltid set -x og set +x. Du kan pakke inn områdene du vil se hva som skjer med dem, for å snu ordet opp / ned.

#!/bin/bash set -x ..code to debug... set +x 

log4bash

Også Hvis du har gjort utviklingsarbeid og er kjent med stilen til loggere som går under navnene log4j, log4perl osv., kan det være lurt å bruke log4bash .

utdrag

La oss innse det – vanlig gammelt ekko klipper det ikke. log4bash er et forsøk på å få bedre logging for Bash-skript (dvs. få innlogging i Bash til å suge mindre).

Derfra kan du gjøre ting som dette i din Bash-skript:

#!/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"; 

Resultatet i denne typen utdata:

        ss1

log4sh

Hvis du trenger noe mer bærbart, er det også den eldre log4sh. Fungerer som log4bash, tilgjengelig her:

Kommentarer

  • På Ubuntu har jeg alias say="spd-say" i min .bashrc, som etterligner say kommando fra andre distros eller OS X.
  • set -vx vil være en god kombinasjon hvis den brukes med felle – felle lese feilsøking. Dette lar deg gå over linje for linje og se resultatene

Svar

Der «er en bash-feilsøking, bashdb , som er en installerbar pakke på mange distros. Den bruker bashs innebygde utvidede feilsøkingsmodus (shopt -s extdebug). Det ser veldig ut som gdb; her «er en eksamensøkt for å gi litt smak:

$ 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 

Som i gdb, vises utsagnet bare før det er i ferd med å utføres. Så vi kan undersøke variabler for å se hva utsagnet vil gjøre før den gjør det.

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 

Det er ikke det vi vil! La oss se på parameterutvidelse igjen.

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, det fungerer. La oss sette newf til riktig verdi.

bashdb<10> eval newf=${f/%JPG/jpg} $? is 0 bashdb<11> print $f $newf 2ndJPG.JPG 2ndJPG.jpg 

Ser bra ut. Fortsett skriptet.

bashdb<12> next Debugged program terminated normally. Use q to quit or R to restart. $ ls 1st.jpg 2ndJPG.jpg 

Svar

Standardmetoden for feilsøking av skript i de fleste Bourne-baserte skall, som bash er å skrive set -x øverst i skriptet ditt. Dette vil gjøre bash mer detaljert om hva som blir gjort / utført, og hvordan argumenter blir evaluert.

-x Print commands and their arguments as they are executed. 

dette er nyttig for enten tolken eller innvendige skript. For eksempel:

$ 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 

I det ovenstående kan vi se hvorfor funn mislykkes på grunn av noen enkelt anførselstegn.

For å deaktivere funksjonen, skriv bare set +x.

Svar

Ved hjelp av formørkelse

Du kan bruke det kombinerte miljøet til formørkelse og avskallet med skriptet «_DEBUG.sh» lenket nedenfor.

Bytte skjell

By som standard bruker Shelled utviklingsverktøy /bin/dash som tolk. Jeg endret dette til /bin/bash for å ha bedre kompatibilitet med de fleste shelleksemplene på nettet og miljøet mitt.

MERKNAD: Du kan endre dette ved å gå til: Vindu -> Innstilling -> Shell-skript -> Tolker

Installasjonsinstruksjoner

Feilsøkingspakken har trinnene for å bruke _DEBUG.sh skriptet for feilsøking av skript som i utgangspunktet er (readme.txt):

  1. Opprett Shell Script-prosjekt: Fil -> Ny -> Annet – > Shell-skript

-> Prosjektveiviser for Shell Script .

  • Opprett en Bash-skriptfil: Fil -> Ny -> Fil . For dette eksemplet vil det være script.sh. Utvidelsen skal være «.sh» og er et must.
  • Kopier filen _DEBUG.sh til prosjektmappen.
  • Sett inn følgende tekst til toppen av filen script.sh:

    . _DEBUG.sh 
  • Hvis filen er opprettet i Microsoft Windows, og sørg for å utføre File -> Konverter linjeavgrensere til -> Unix .

  • Konfigurer en konfigurasjon for feilsøking: Kjør -> Feilsøkingskonfigurasjoner -> Bash-skript … Det er to felt å sette her:

    a) «Bash-skript:» – Sti i arbeidsområdet til Eclipse til Bash-skriptet for å feilsøke.
    e) «Feilsøkingsport:» 33333

  • Bytt til Debug-perspektivet. Start feilsøkingsøkten. Start script.sh fra bash shell.

  • Bash debug UI

    skriv inn bildebeskrivelse her

    Denne bash-feilsøkingsprogrammet har alle funksjonene til standardprogrammeringsfeilbrytere som:

    • Brytepunktbryter
    • Enkelt trinn-for-trinn-drift
    • Step-in, Step-out, Step-over-funksjoner og underrutiner
    • Undersøk kode eller variabler når som helst mens skriptet kjører

    Den avskallede (Shell Script Editor) IDE (Integrated Development Environment) har en ekstra bonus å utføre kontekstkontroll, fremheve og innrykk mens du skriver skriptet. Hvis den ikke trekker inn riktig, kan du umiddelbart flagge / lokale mange feil der.

    Så er det andre IDE-fordeler som:

    • TODO-oppgaveliste
    • Mylyn Task
    • Bokmerkeliste
    • Flere Vindusredigering
    • Ekstern deling av miljøet

    Kommentarer

    • Kult tips. Fint å vite at Bash kan bli feilsøkt slik.

    Svar

    En fantastisk ressurs dukket opp de siste årene: http://shellcheck.net

    det viser deg mer enn vanlig bash gjør, slik at man enkelt kan finne de irriterende, ikke lukkede anførselstegnene eller krøllete parentes osv.

    Bare pass på at du ikke limer inn sensitive info (ips, passord osv.) over nettet … (spesielt fordi det er http, ukryptert) (jeg tror shellcheck også er tilgjengelig for å laste ned, men jeg er ikke sikker)

    Svar

    I dag er det VS Code Bash Debug.

    https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

    Den har «Gå inn / ut / over «og viser også verdien til hver variabel.

    Skjermbilde av VS Code Bash Debug

    Kommentarer

    • dette svaret tar ikke opp spørsmålet i riktig sammenheng; antar kommandolinje siden IDE ikke ble nevnt

    Svar

    bruk bare:

    #!/bin/bash -x 

    det samme for skall:

    #!/bin/sh -x 

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *