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
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:
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 etterlignersay
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.
- Eclipse Shelled Plug-in:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash debugger – fungerer bare med shelled:
http://sourceforge.net/projects/basheclipse/
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):
- Opprett Shell Script-prosjekt: Fil -> Ny -> Annet – > Shell-skript
-> Prosjektveiviser for Shell Script .
script.sh
. Utvidelsen skal være «.sh» og er et must. _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
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.
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
BASH_XTRACEFD="5"
bash skriver sporingsutgangen som genereres nårset -x
aktivert for filbeskrivelse 5.exec 5> >(logger -t $0)
omdirigerer utdata fra filbeskrivelse 5 tillogger
kommando.