Jak ladit bash skript?

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

  • -v může také pomoci (vytiskne každý řádek při provádění. lze kombinovat s -x). A viz také: bashdb.sourceforge.net
  • další skvělý zdroj je: shellcheck .net
  • Co “ provede 5 > “ dělat?
  • @aggsol: Pokud používáte 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 na logger příkaz.
  • Zajímá vás, zda můžete v systému PS4 získat číslo řádku a cestu nebo název skriptu skriptu?

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:

        ss1

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ý napodobuje say 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“.

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

  1. Vytvořit projekt skriptů Shell: Soubor -> Nové -> Jiné – > Shell Script

-> Průvodce projektem skriptů Shell .

  • Vytvořte soubor skriptu Bash: Soubor -> Nový -> Soubor . V tomto příkladu to bude script.sh. Přípona by měla být „.sh“ a je nutností.
  • Zkopírujte soubor _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

    zde zadejte popis obrázku

    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é.

    Screenshot VS Code Bash Debug

    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 

    Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *