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á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:
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 asay
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.
- Eclipse Shelled plug-in:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash hibakereső – csak héjjal működik:
http://sourceforge.net/projects/basheclipse/
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):
- Shell Script Project létrehozása: File -> Új -> Egyéb – > Shell szkript
-> Shell Script Projekt Varázsló .
script.sh
lesz. A kiterjesztés “.sh” legyen, és kötelező. _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
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.
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
BASH_XTRACEFD="5"
bash szót használja, akkor aset -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 alogger
parancs.