Jeg har nogle problemer med nogle scripts i bash, om fejl og uventet opførsel. Jeg vil gerne undersøge årsagerne til problemerne, så jeg kan anvende rettelser. Er der en måde, hvorpå jeg kan vende en slags “debug-mode” til bash for at få mere information?
Svar
Start dit bash-script med bash -x ./script.sh
eller tilføj i dit script set -x
for at se debug-output.
Ekstra med bash
4.1 eller nyere:
Hvis du vil skrive fejlretningsoutputtet til en separat fil, skal du tilføje dette til dit script:
exec 5> debug_output.txt BASH_XTRACEFD="5"
Se: https://stackoverflow.com/a/25593226/3776858
Hvis du vil se linjenumre, tilføj dette:
PS4="$LINENO: "
Hvis du har adgang til logger
kommando, så kan du bruge dette til at skrive fejlretningsoutput via din syslog med tidsstempel, scriptnavn og linjenummer:
#!/bin/bash exec 5> >(logger -t $0) BASH_XTRACEFD="5" PS4="$LINENO: " set -x # Place your code here
Du kan bruge indstilling -p
til logger
kommando til at indstille en individuel facilitet og niveau at skrive output via lokal syslog til sin egen logfil.
Kommentarer
Svar
Brug af set -x
Jeg bruger altid set -x
og set +x
. Du kan pakke områder, som du vil se, hvad der sker med dem for at vende ordlængde op / ned.
#!/bin/bash set -x ..code to debug... set +x
log4bash
Også hvis du har udført udviklingsarbejde og er bekendt med loggers stil, der går under navnene log4j, log4perl osv., kan du muligvis bruge log4bash .
uddrag
Lad os se det – almindeligt gammelt ekko klipper det bare ikke. log4bash er et forsøg på at få bedre logning af Bash-scripts (dvs. få logning i Bash til at sutte mindre).
Derfra kan du gøre ting som dette i din Bash-scripts:
#!/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";
resulterer i denne type output:
log4sh
Hvis du har brug for noget mere bærbart, er der også den ældre log4sh
. Fungerer som log4bash
, tilgængelig her:
Kommentarer
- På Ubuntu har jeg
alias say="spd-say"
i min .bashrc, som efterlignersay
kommando fra andre distroer eller OS X. - set -vx ville være en god kombination, hvis den bruges med trap-trap read debug. Dette giver dig mulighed for at gå over linje for linje og se resultaterne
Svar
Der er “en bash debugger, bashdb , som er en installerbar pakke på mange distroer. Det bruger bashs indbyggede udvidede fejlretningstilstand (shopt -s extdebug
). Det ligner meget gdb; her “er en eksempelsession for at give en smag:
$ 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 udsagnet lige før det er ved at blive udført. Så vi kan undersøge variabler for at se, hvad udsagnet vil gøre, før det gø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, hvad vi vil! Lad os se på parameterudvidelse igen.
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. Lad “s indstille newf
til den korrekte værdi.
bashdb<10> eval newf=${f/%JPG/jpg} $? is 0 bashdb<11> print $f $newf 2ndJPG.JPG 2ndJPG.jpg
Ser godt ud. Fortsæt scriptet.
bashdb<12> next Debugged program terminated normally. Use q to quit or R to restart. $ ls 1st.jpg 2ndJPG.jpg
Svar
Standardmetoden til fejlfinding af scripts i de fleste Bourne-baserede skaller, som bash er at skrive set -x
øverst i dit script. Dette vil gøre bash mere detaljeret om, hvad der gøres / udføres, og hvordan argumenter vurderes.
-x Print commands and their arguments as they are executed.
dette er nyttigt for enten tolken eller indvendige scripts. 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 ovenstående kan vi se, hvorfor find mislykkes på grund af nogle enkelt citater.
For at deaktivere funktionen skal du bare skrive set +x
.
Svar
Brug af Eclipse
Du kan bruge det kombinerede miljø for Eclipse og Shelled med nedenstående script “_DEBUG.sh”.
- Eclipse Shelled Plug-in:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash debugger – fungerer kun med shelled:
http://sourceforge.net/projects/basheclipse/
Skifte skaller
Af som standard bruger det beskyttede udviklingsværktøj /bin/dash
som tolk. Jeg ændrede dette til /bin/bash
for at få bedre kompatibilitet med de fleste shelleksempler på nettet og mit miljø.
BEMÆRK: Du kan ændre dette ved at gå til: Vindue -> Præference -> Shell-script -> Tolke
Installationsvejledning
Fejlfindingspakken har trinnene til at bruge _DEBUG.sh
scriptet til din fejlfinding i script, som grundlæggende er (readme.txt):
- Opret Shell Script-projekt: File -> Ny -> Andet – > Shell-script
-> Guiden Shell-projektprojekt .
script.sh
. Udvidelsen skal være “.sh” og er et must. _DEBUG.sh
til projektmappen. Indsæt følgende tekst til toppen af filen script.sh
:
. _DEBUG.sh
Hvis filen er oprettet i Microsoft Windows, skal du sørge for at udføre File -> Konverter linjeafgrænsere til -> Unix .
Konfigurer en konfiguration til start af debug: Kør -> Fejlfindingskonfigurationer -> Bash-script … Der er to felter, der skal indstilles her:
a) “Bash-script:” – Sti i Eclipses arbejdsområde til Bash-scriptet, der skal debugges.
e) “Debugger port:” 33333
Skift til Debug-perspektivet. Start debugging-sessionen. Start script.sh
fra bash shell.
Bas debug UI
Denne bash debugger har de fulde funktioner i standardprogrammeringsfejlfindere, såsom:
- Brydepunkt-skift
- Enkelt trin-for-trin-handling
- Step-in, Step-out, Step-over-funktioner og underrutiner
- Undersøgelse af kode eller variabler til enhver tid, mens scriptet kører
Den afskærmede (Shell Script Editor) IDE (Integrated Development Environment) har en ekstra bonus til at udføre kontekstkontrol, fremhævning og indrykning, mens du skriver dit script. Hvis det ikke indrykker korrekt, kan du straks være i stand til at markere / lokale mange fejl der.
Så er der andre IDE-fordele såsom:
- TODO-opgaveliste
- Mylyn-opgave
- Bogmærkeliste
- Flere Vinduesredigering
- Fjerndeling af miljøet
Kommentarer
- Sejt tip. Rart at vide, at Bash kan debugged som denne.
Svar
En vidunderlig ressource dukkede op i de senere år: http://shellcheck.net
det viser dig mere end den almindelige bash gør, så man let kan finde de irriterende, ikke lukkede citater eller krøllede parenteser osv.
Bare sørg for at du ikke indsætter følsomme oplysninger (ips, adgangskoder osv.) over nettet … (især da det er http, ukrypteret) (jeg tror shellcheck er også tilgængelig for at downloade, men jeg er ikke sikker)
Svar
I dag findes VS Code Bash Debug.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Det har “Trin ind / ud / over “og viser også værdien af hver variabel.
Kommentarer
- dette svar adresserer ikke spørgsmålet i den rigtige kontekst; antager kommandolinje, da IDE ikke blev nævnt
Svar
brug blot:
#!/bin/bash -x
det samme for shell:
#!/bin/sh -x
BASH_XTRACEFD="5"
bash skriver sporeoutputtet, der genereres, nårset -x
aktiveret til filbeskrivelse 5.exec 5> >(logger -t $0)
omdirigerer output fra filbeskrivelse 5 tillogger
kommando.