Hogyan lehet hibakeresni egy bash szkriptet?

Problémáim vannak a bash néhány szkriptjével, a hibákkal és a váratlan viselkedéssel kapcsolatban. Szeretném megvizsgálni a problémák okait, hogy alkalmazhassam javítások. Van-e mód arra, hogy valamilyen “hibakeresési módot” kapcsoljak a bash-hoz, hogy több információt kapjak?

Válasz

Indítsa el a bash parancsfájlt a bash -x ./script.sh paranccsal, vagy adjon hozzá a szkriptbe set -x a hibakeresési kimenet megtekintéséhez.


Kiegészítő a bash 4.1 vagy újabb verzióval:

Ha a hibakeresési kimenetet külön fájlba szeretné írni, adja hozzá ezt a szkriptjéhez:

exec 5> debug_output.txt BASH_XTRACEFD="5" 

Lásd: https://stackoverflow.com/a/25593226/3776858


Ha sorszámokat szeretne látni, adja hozzá ezt:

PS4="$LINENO: " 


Ha van hozzáférése a logger parancsot, akkor ezt használhatja a hibakimenet írására a syslogon keresztül időbélyeggel, szkript nevével és sorszámával:

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

Használhatja a logger parancs -p opcióját egyéni létesítmény és szint beállításához hogy a kimenetet helyi syslogon keresztül írja a saját naplófájljába.

Megjegyzések

  • -v szintén segíthetnek (minden sort kinyomtatnak, amikor végrehajtják őket). kombinálható -x). És lásd még: bashdb.sourceforge.net
  • egy másik csodálatos forrás: shellcheck .net
  • Mit ” hajt végre 5 > ” csinálni?
  • @aggsol: Ha a BASH_XTRACEFD="5" bash szót használja, akkor a set -x engedélyezve van fájlleíró 5. exec 5> >(logger -t $0) átirányítja a kimenetet az 5. fájlleíróból a logger parancs.
  • Csak arra kíváncsi, hogy kaphat-e sorszámot és shell parancsfájl útvonalat vagy nevet a PS4-ben?

Válasz

A set -x

használatával mindig set -x és set +x. Azokat a területeket beburkolhatja, amelyekkel látni szeretné, hogy mi történik velük, hogy a beszédet fel / le tudja változtatni.

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

log4bash

ha végzett fejlesztési munkát, és ismeri a log4j, log4perl stb. nevű loggerek stílusát, akkor érdemes használni a log4bash .

kivonat

Nézzünk szembe vele – a sima régi visszhang csak nem vágja le. A log4bash egy kísérlet arra, hogy jobb naplózást kapjon a Bash szkriptek számára (azaz a Bash naplózását kevesebbet szívassa).

Innen hasonló dolgokat tehet a Bash szkriptek:

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

Ebből a típusú kimenetből származik:

        ss1

log4sh

Ha valami hordozhatóbbra van szüksége, akkor a régebbi log4sh is. A log4bash, itt érhető el:

Megjegyzések

  • Az Ubuntuban alias say="spd-say" van a .bashrc fájlban, amely utánozza a say parancs más disztribúciókból vagy az OS X-ből.
  • A set -vx jó kombináció lenne, ha trap – trap read hibakeresővel használják. Ez lehetővé teszi, hogy soronként haladjon és lásd az eredményeket

Válasz

Van egy bash hibakereső, bashdb , amely számos disztróhoz telepíthető csomag. A bash beépített kiterjesztett hibakeresési módját használja (shopt -s extdebug). Nagyon hasonlít a gdb; here “példamenetre, hogy adjon némi ízt:

$ 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 

A gdb-hez hasonlóan az utasítás is előtt jelenik meg, mielőtt végrehajtaná. Tehát megvizsgálhatjuk a változókat, hogy lássuk, mit fog tenni az utasítás, mielőtt megteszi.

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 

Ez nem az, amit akarunk! Nézzük meg a A paraméterek újbóli kibővítése.

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, ez működik. Állítsa a “s newf értéket a helyes értékre.

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

Jól néz ki. Folytassa a szkriptet.

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

Válasz

A szkriptek hibakeresésének szokásos módszere a legtöbb Bourne-alapú héjban, például A bash az, hogy set -x -t írjon a szkript tetejére. Ezáltal a bash részletesebbé válik abban, hogy mit csinálnak / hajtanak végre, és hogyan értékelik az argumentumokat.

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

ez mind az értelmező, mind a belső szkriptek számára hasznos. Például:

$ 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 

A fentiekben láthatjuk, hogy a keresés miért nem sikerül egyes idézetek miatt.

A szolgáltatás deaktiválásához írja be a következőt: set +x.

Válasz

Az Eclipse használata

Használhatja az Eclipse és a Shelled kombinált környezetét az alább linkelt “_DEBUG.sh” parancsfájlokkal.

Héjak váltása

alapértelmezés szerint a Shelled fejlesztőeszköz a /bin/dash -t használja tolmácsként. Ezt megváltoztattam a következőre: /bin/bash, hogy jobban kompatibilis legyek a webes shell-példákkal és a környezetemmel.

MEGJEGYZÉS: Ezt megváltoztathatja: Ablak -> Előny -> Shell szkript -> Tolmácsok

Telepítési utasítások

A Debugger csomag megadja a _DEBUG.sh parancsfájl használatának lépéseit a szkript hibakereséséhez, amely alapvetően (a readme.txt):

  1. Shell Script Project létrehozása: File -> Új -> Egyéb – > Shell szkript

-> Shell Script Projekt Varázsló .

  • Bash szkriptfájl létrehozása: fájl -> Új -> fájl . Ebben a példában ez script.sh lesz. A kiterjesztés “.sh” legyen, és kötelező.
  • Másolja a _DEBUG.sh fájlt a projekt mappába.
  • Helyezze be a következő szöveg a fájl tetejére script.sh:

    . _DEBUG.sh 
  • Ha a fájl létrejön a Microsoft Windows rendszerben, akkor mindenképpen hajtsa végre a fájlt -> Vonalelválasztók konvertálása -> Unix .

  • Állítsa be a hibakeresés indításának konfigurációját: Futtassa -> Hibakeresési konfigurációk -> Bash szkript … Itt két mezőt kell beállítani:

    a) “Bash script:” – Az Eclipse munkaterületén található útvonal a hibakereséshez szükséges Bash scripthez.
    e) “Debugger port:” 33333

  • Váltás a Debug perspektívára. Indítsa el a hibakeresési munkamenetet. Indítsa el az script.sh parancsot a bash shellből.

  • A bash hibakereső felhasználói felület

    írja ide a kép leírását

    Ez a bash hibakereső rendelkezik a szokásos programozási hibakeresők teljes funkcióival, például:

    • Töréspont váltás
    • Egyetlen lépésenkénti művelet
    • Step-in, Step-out, Step-over függvények és alprogramok
    • Kód vagy változók vizsgálata a parancsfájl futása közben bármikor

    A Shelled (Shell Script Editor) IDE (Integrált Fejlesztői Környezet) további bónuszt jelent a kontextusellenőrzés, kiemelés és behúzás végrehajtása közben a szkript írásakor. Ha nem megfelelően behúzza, akkor előfordulhat, hogy sok hibát megjelöl / lokalizál.

    Ezután vannak egyéb IDE előnyök például:

    • TODO feladatlista
    • Mylyn Task
    • könyvjelzők listája
    • több Ablakszerkesztés
    • A környezet távoli megosztása

    Megjegyzések

    • Jó tipp. Örülök, hogy tudom, hogy a Bash képes így kell hibakeresni.

    Válasz

    Az elmúlt években egy csodálatos forrás jelent meg: http://shellcheck.net

    többet mutat, mint a szokásos bash, lehetővé téve az ember számára, hogy könnyedén megtalálja azokat a bosszantó, lezáratlan idézeteket vagy göndör zárójelek stb.

    Csak arra ügyeljen, hogy ne illessze be az érzékeny infókat (ips, jelszavakat stb.) a netre … (főleg, hogy http, titkosítatlan) (úgy gondolom, hogy a shellcheck is elérhető letölteni, de nem vagyok biztos benne)

    Válasz

    Manapság létezik a VS Code Bash hibakeresés.

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

    “Lépjen be / ki /” over “és megmutatja az egyes változók értékét is.

    VS Code Bash Debug képernyőkép

    Megjegyzések

    • ez a válasz nem a megfelelő kontextusban foglalkozik a kérdéssel; parancssort feltételezve, mivel az IDE nem került említésre

    Válasz

    egyszerűen használja:

    #!/bin/bash -x 

    ugyanaz a shell esetében:

    #!/bin/sh -x 

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük