Hur felsöker jag ett bash-skript?

Jag har problem med vissa skript i bash, om fel och oväntade beteenden. Jag skulle vilja undersöka orsakerna till problemen så att jag kan ansöka korrigeringar. Finns det något sätt jag kan vända på någon form av ”debug-mode” för bash, för att få mer information?

Svar

Starta ditt bash-skript med bash -x ./script.sh eller lägg till i ditt skript set -x för att se felsökningsutdata.


Ytterligare med bash 4.1 eller senare:

Om du vill skriva felsökningsoutput till en separat fil, lägg till detta i ditt skript:

exec 5> debug_output.txt BASH_XTRACEFD="5" 

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


Om du vill se radnummer lägg till detta:

PS4="$LINENO: " 


Om du har tillgång till logger -kommando så kan du använda detta för att skriva felsökningsoutput via din syslog med tidsstämpel, skriptnamn och radnummer:

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

Du kan använda alternativet -p för logger för att ställa in en enskild anläggning och nivå att skriva utdata via lokal syslog till sin egen loggfil.

Kommentarer

  • -v kan också hjälpa (skriver ut varje rad när de körs. kan kombineras med -x). Och se även: bashdb.sourceforge.net
  • en annan underbar resurs är: shellcheck .net
  • Vad gör ” exec 5 > ” göra?
  • @aggsol: Om du använder BASH_XTRACEFD="5" bash skriver spårningsutgången som genereras när set -x är aktiverat till filbeskrivare 5. exec 5> >(logger -t $0) omdirigerar utdata från filbeskrivare 5 till logger kommando.
  • Undrar du bara att du kan få radnummer och skalskriptsökväg eller namn i PS4?

Svar

Med set -x

använder jag alltid set -x och set +x. Du kan slå in områden som du vill se vad som händer med dem för att vända uppåt / nedåt.

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

log4bash

Också om du har gjort utvecklingsarbete och är bekant med loggarnas stil som går under namnen log4j, log4perl, etc., kanske du vill använda log4bash .

utdrag

Låt oss inse det – vanligt gammalt eko klipper inte det. log4bash är ett försök att få bättre loggning för Bash-skript (dvs. gör att loggning i Bash suger mindre).

Därifrån kan du göra saker som detta 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"; 

Resulterande i denna typ av utdata:

        ss1

log4sh

Om du behöver något mer bärbart finns det också den äldre log4sh. Fungerar som log4bash, tillgänglig här:

Kommentarer

  • På Ubuntu har jag alias say="spd-say" i min .bashrc, som imiterar say -kommando från andra distros eller OS X.
  • set -vx skulle vara en bra kombination om den används med fäll – fälla läs felsökning. Detta gör att du kan gå över rad för rad och se resultaten

Svar

Det finns ”en bash-felsökare, bashdb , som är ett installerbart paket på många distros. Den använder bashs inbyggda utökade felsökningsläge (shopt -s extdebug). Det ser väldigt ut som gdb; här ”är en provsession för att ge lite 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 visas uttalandet precis innan det är på väg att köras. Så vi kan undersöka variabler för att se vad påståendet kommer att göra innan 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 är inte vad vi vill! Låt oss titta på parameterutvidgning 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 fungerar. Låt oss ställa in newf till rätt värde.

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

Ser bra ut. Fortsätt skriptet.

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

Svar

Standardmetoden för felsökning av skript i de flesta Bourne-baserade skal, som bash är att skriva set -x högst upp i ditt skript. Detta kommer att göra bash mer detaljerad om vad som görs / körs och hur argument utvärderas.

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

detta är användbart för antingen tolken eller inuti skript. Till exempel:

$ 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 ovanstående kan vi se varför hitta misslyckas på grund av några enskilda citat.

För att inaktivera funktionen, skriv bara set +x.

Svar

Använda Eclipse

Du kan använda den kombinerade miljön för Eclipse och Shelled med ”_DEBUG.sh” -skriptet länkat nedan.

Byta skal

By standard använder Shelled utvecklingsverktyget /bin/dash som tolk. Jag ändrade detta till /bin/bash för att ha bättre kompatibilitet med de flesta skalexemplen på webben och min miljö.

OBS: Du kan ändra detta genom att gå till: Fönster -> Inställning -> Shell-skript -> Tolkar

Installationsinstruktioner

Debugger-paketet har stegen för att använda _DEBUG.sh -skriptet för din felsökning av skript som i grunden är (readme.txt):

  1. Skapa Shell Script-projekt: Fil -> Nytt -> Övrigt – > Shell-skript

-> Projektguiden för Shell Script .

  • Skapa en Bash-skriptfil: Fil -> Nytt -> Fil . För det här exemplet blir det script.sh. Tillägget ska vara ”.sh” och är ett måste.
  • Kopiera filen _DEBUG.sh till projektmappen.
  • Sätt in följande text överst i filen script.sh:

    . _DEBUG.sh 
  • Om filen skapas i Microsoft Windows och se till att köra File -> Konvertera linjeavgränsare till -> Unix .

  • Ställ in en konfiguration för felsökning: Kör -> Felsökningskonfigurationer -> Bash-skript … Det finns två fält att ställa in här:

    a) ”Bash-skript:” – Sökväg i arbetsytan för Eclipse till Bash-skriptet för att felsöka.
    e) ”Debugger port:” 33333

  • Byt till perspektivet Debug. Starta felsökningssessionen. Starta script.sh från bash-skal.

  • Bas debug UI

    ange bildbeskrivning här

    Denna bash-felsökare har alla funktioner i standardprogrammeringsfelsökare som:

    • Brytpunktbytare
    • Enkel steg-för-steg-operation
    • Step-in, Step-out, Step-over-funktioner och underrutiner
    • Undersökning av kod eller variabler när som helst medan skriptet körs

    Den avskalade (Shell Script Editor) IDE (integrerad utvecklingsmiljö) har en extra bonus att utföra kontextkontroll, markering och indragning medan du skriver ditt manus. Om den inte drar in rätt kan du omedelbart kunna flagga / lokala många fel där.

    Då finns det andra IDE-fördelar såsom:

    • TODO-uppgiftslista
    • Mylyn-uppgift
    • Bokmärkeslista
    • Flera Fönsterredigering
    • Fjärrdelning av miljön

    Kommentarer

    • Coolt tips. Trevligt att veta att Bash kan felsökas så här.

    Svar

    En underbar resurs dök upp de senaste åren: http://shellcheck.net

    det visar dig mer än den vanliga bash gör, så att man lätt kan hitta de irriterande, oavslutade citaten eller lockiga parenteser etc.

    Se bara till att du inte klistrar in känsliga informationer (ips, lösenord, etc) över nätet … (speciellt eftersom det är http, okrypterat) (jag tror att shellcheck också är tillgängligt för att ladda ner, men jag är inte säker)

    Svara

    Numera finns det VS Code Bash Debug.

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

    Den har ”Steg in / ut / över ”och visar också värdet för varje variabel.

    VS Code Bash Debug-skärmdump

    Kommentarer

    • detta svar tar inte upp frågan i rätt sammanhang; förutsatt att kommandoraden eftersom IDE inte nämndes

    Svar

    använd bara:

    #!/bin/bash -x 

    samma för skal:

    #!/bin/sh -x 

    Lämna ett svar

    Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *