Mám nějaké problémy s některými skripty v bash, o chybách a neočekávaném chování. Chtěl bych zjistit příčiny problémů, abych mohl použít opravy. Existuje způsob, jak mohu pro bash změnit nějaký „režim ladění“, abych získal více informací?
Odpovědět
Spusťte bash skript pomocí bash -x ./script.sh
nebo do skriptu přidejte set -x
a podívejte se na výstup ladění.
Další s bash
4.1 nebo novější:
Chcete-li výstup ladění zapsat do samostatného souboru, přidejte toto do svého skriptu:
exec 5> debug_output.txt BASH_XTRACEFD="5"
Viz: https://stackoverflow.com/a/25593226/3776858
Pokud chcete zobrazit čísla řádků, přidejte toto:
PS4="$LINENO: "
Pokud máte přístup k logger
příkaz, pomocí kterého můžete psát výstup ladění pomocí vašeho syslogu s časovým razítkem, názvem skriptu a číslem řádku:
#!/bin/bash exec 5> >(logger -t $0) BASH_XTRACEFD="5" PS4="$LINENO: " set -x # Place your code here
Pomocí možnosti -p
z logger
můžete nastavit jednotlivé zařízení a úroveň zapsat výstup prostřednictvím místního syslogu do vlastního souboru protokolu.
Komentáře
Odpovědět
Používání set -x
Vždy používám set -x
a set +x
. Můžete zalomit oblasti, které chcete vidět, co se s nimi děje, aby se upovídala výřečnost.
#!/bin/bash set -x ..code to debug... set +x
log4bash
Také pokud jste již provedli vývojovou práci a jste obeznámeni se stylem loggerů, které se nazývají log4j, log4perl atd., možná budete chtít použít log4bash .
výňatek
Pojďme tomu čelit – stará stará ozvěna to prostě neřeže. log4bash je pokus o lepší protokolování pro skripty Bash (tj. aby přihlášení v Bash bylo méně nasávání).
Odtud můžete dělat podobné věci ve vašem Bash skripty:
#!/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";
Výsledkem je tento typ výstupu:
log4sh
Pokud potřebujete něco přenosnějšího, existuje i starší log4sh
. Funguje podobně jako log4bash
, k dispozici zde:
Komentáře
- Na Ubuntu mám
alias say="spd-say"
v mém .bashrc, který napodobujesay
příkaz z jiných distribucí nebo OS X. - set -vx by byla dobrá kombinace, pokud by byl použit s debugem trap – trap read. To vám umožní překračovat řádek po řádku a zobrazit výsledky
Odpověď
Existuje „bash debugger, bashdb , což je instalovatelný balíček na mnoha distribucích. Využívá vestavěný režim rozšířeného ladění bash (shopt -s extdebug
). Vypadá to hodně jako gdb; zde je ukázková relace, která vám dá nějakou příchuť:
$ 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
Stejně jako v gdb je příkaz zobrazen těsně před před před spuštěním. Můžeme tedy prozkoumat proměnné, abychom zjistili, co příkaz udělá, než to udělá.
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
To není to, co chceme! Podívejme se na rozšíření parametrů znovu.
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
Dobře, to funguje. Pojďme nastavit newf
na správnou hodnotu.
bashdb<10> eval newf=${f/%JPG/jpg} $? is 0 bashdb<11> print $f $newf 2ndJPG.JPG 2ndJPG.jpg
Vypadá to dobře. Pokračujte ve skriptu.
bashdb<12> next Debugged program terminated normally. Use q to quit or R to restart. $ ls 1st.jpg 2ndJPG.jpg
Odpověď
Standardní metoda pro ladění skriptů ve většině shellů založených na Bourne, jako je bash je napsat set -x
do horní části skriptu. Díky tomu bude bash podrobnější o tom, co se provádí / provádí a jak se vyhodnocují argumenty.
-x Print commands and their arguments as they are executed.
to je užitečné buď pro tlumočníka, nebo uvnitř skriptů. Například:
$ 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
Ve výše uvedeném příkladu vidíme, proč hledání selhává kvůli jednoduchým uvozovkám.
Chcete-li funkci deaktivovat, zadejte set +x
.
Odpovědět
Používání Eclipse
Můžete použít kombinované prostředí Eclipse a Shelled s níže uvedeným skriptem „_DEBUG.sh“.
- Doplněk Eclipse Shelled:
http://sourceforge.net/projects/shelled/files/shelled/update/ - bash debugger – funguje pouze s shelled:
http://sourceforge.net/projects/basheclipse/
Přepínání skořápek
Autor ve výchozím nastavení používá vývojový nástroj Shelled /bin/dash
jako tlumočníka. Změnil jsem to na /bin/bash
, abych měl lepší kompatibilitu s většinou příkladů prostředí na webu a v mém prostředí.
POZNÁMKA: Toto můžete změnit v: Window -> Předvolba -> Shell Script -> Tlumočníci
Pokyny k nastavení
Balíček Debugger obsahuje kroky pro použití skriptu _DEBUG.sh
pro ladění skriptu, který je v zásadě (soubor readme.txt):
- Vytvořit projekt skriptů Shell: Soubor -> Nové -> Jiné – > Shell Script
-> Průvodce projektem skriptů Shell .
script.sh
. Přípona by měla být „.sh“ a je nutností. _DEBUG.sh
do složky projektu. Vložte následující text na začátek souboru script.sh
:
. _DEBUG.sh
Pokud soubor je vytvořen v systému Microsoft Windows, pak nezapomeňte spustit Soubor -> Převést oddělovače řádků na -> Unix .
Nastavit konfiguraci spuštění ladění: Spustit -> Konfigurace ladění -> Bash skript … Zde lze nastavit dvě pole:
a) „Bash script:“ – Cesta v pracovním prostoru Eclipse k Bash skriptu k ladění.
e) „Port debuggeru:“ 33333
Přepnout na perspektivu Debug. Spusťte relaci ladění. Spusťte script.sh
z prostředí bash.
Uživatelské rozhraní ladění bash
Tento bash debugger má všechny funkce standardních programovacích ladicích programů, jako jsou:
- Přepínání bodu zlomu
- Jedna operace krok za krokem
- Step-in, Step-out, Step-over funkce a dílčí rutiny
- Kontrola kódu nebo proměnných kdykoli během běhu skriptu
The Shelled (Shell Script Editor) IDE (integrované vývojové prostředí) má další bonus při provádění kontroly kontextu, zvýraznění a odsazení při psaní skriptu. Pokud se neodsadí správně, můžete tam okamžitě označit / lokalizovat mnoho chyb.
Pak existují další výhody IDE například:
- seznam úkolů TODO
- úkol Mylyn
- seznam záložek
- více Úpravy oken
- Vzdálené sdílení prostředí
Komentáře
- Skvělý tip. Rád bych věděl, že Bash může být takto odladěn.
Odpověď
V posledních letech se objevil úžasný zdroj: http://shellcheck.net
zobrazí vám víc než běžný bash, což vám umožní snadno najít ty otravné neuzavřené uvozovky nebo kudrnaté závorky atd.
Jen se ujistěte, že do sítě nevkládáte citlivé informace (ips, hesla atd.) … (zejména proto, že je to http, nezašifrované) (domnívám se, že je k dispozici i shellcheck) ke stažení, ale nejsem si jistý)
Odpovědět
V současné době existuje VS Code Bash Debug.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Má „Vstup / výstup / over „a také zobrazuje hodnotu každé proměnné.
Komentáře
- tato odpověď neřeší otázku ve správném kontextu; za předpokladu, že příkazový řádek nebyl uveden IDE
odpověď
jednoduše použijte:
#!/bin/bash -x
totéž pro prostředí shell:
#!/bin/sh -x
BASH_XTRACEFD="5"
bash, zapíše se výstup trasování generovaný, kdyžset -x
je povoleno deskriptor souborů 5.exec 5> >(logger -t $0)
přesměruje výstup z deskriptoru souborů 5 nalogger
příkaz.