Hvordan debugger man et bash-script?

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

  • -v kan også hjælpe (udskriver hver linje, når de bliver udført. kan kombineres med -x). Og se også: bashdb.sourceforge.net
  • en anden vidunderlig ressource er: shellcheck .net
  • Hvad betyder ” exec 5 > ” gør?
  • @aggsol: Hvis du bruger BASH_XTRACEFD="5" bash skriver sporeoutputtet, der genereres, når set -x aktiveret til filbeskrivelse 5. exec 5> >(logger -t $0) omdirigerer output fra filbeskrivelse 5 til logger kommando.
  • Kun undrende kan du få linjenummer og shell script sti eller navn i PS4?

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:

        ss1

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 efterligner say 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”.

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

  1. Opret Shell Script-projekt: File -> Ny -> Andet – > Shell-script

-> Guiden Shell-projektprojekt .

  • Opret en Bash-scriptfil: File -> Ny -> Fil . I dette eksempel er det script.sh. Udvidelsen skal være “.sh” og er et must.
  • Kopier filen _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

    indtast billedebeskrivelse her

    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.

    Skærmbillede af VS Code Bash Debug

    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 

    Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *