Jak ladit skript Bash Shell pod Linuxem nebo UNIXem
Z mého mailbagu:
Napsal jsem malý skript hello world. Jak mohu odladit bash shell skripty běžící na systémech podobných Linuxu nebo Unixu?
Jedná se o nejčastější dotaz nových sysadminů nebo uživatelů Linuxu/UNIXu. Ladění skriptů shellu může být zdlouhavá práce (čti nelehká). Existují různé způsoby ladění shellového skriptu.
Pro procházení jednotlivých řádků skriptu je třeba shellu bash předat argument -x nebo -v.
Podívejme se, jak ladit skript bash běžící v systému Linux a Unix pomocí různých metod.
volba-x pro ladění shellového skriptu bash
Spustit shellový skript s volbou -x.$ bash -x script-name
$ bash -x domains.sh
Použití vestavěného příkazu set
Shell bash nabízí možnosti ladění, které lze zapnout nebo vypnout pomocí příkazu set:
- set -x : Zobrazuje příkazy a jejich argumenty v průběhu jejich provádění.
- set -v : Zobrazí vstupní řádky shellu tak, jak jsou čteny.
Dva výše uvedené příkazy můžete použít v samotném shellovém skriptu:
#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands
Můžete nahradit standardní řádek Shebang:#!/bin/bash
s následujícím kódem (pro ladění):#!/bin/bash -xv
Použití inteligentní funkce DEBUG
Nejprve přidejte speciální proměnnou _DEBUG. Když potřebujete ladit skript, nastavte _DEBUG na hodnotu ‚on‘:_DEBUG="on"
Na začátek skriptu umístěte následující funkci:
function DEBUG(){ && $@}
Nyní všude, kde potřebujete ladit, jednoduše použijte funkci DEBUG následujícím způsobem:DEBUG echo "File is $filename"
ORDEBUG set -x
Cmd1
Cmd2
DEBUG set +x
Po ukončení ladění (a před přesunem skriptu do produkce) nastavte _DEBUG na ‚off‘. Není třeba mazat ladicí řádky._DEBUG="off" # set to anything but not to 'on'
Ukázkový skript:
#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"
Uložení a zavření souboru. Spusťte skript takto:$ ./script.sh
Výstup:
Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5
Nyní nastavte DEBUG na vypnuto (musíte upravit soubor):_DEBUG="off"
Spustit skript:$ ./script.sh
Výstup:
Found in xyz.txt file2 + 3 = 5
Výše uvedená technika je jednoduchá, ale poměrně účinná. Můžete také zkusit místo funkce použít alias DEBUG.
Debugging Common Bash Shell Scripting Errors
Bash nebo sh či ksh dává na obrazovku různá chybová hlášení a v mnoha případech nemusí chybové hlášení poskytnout podrobné informace.
Překročení uplatnění oprávnění ke spuštění souboru
Při psaní prvního shellového skriptu bash hello world se může stát, že se objeví chyba následujícího znění:bash: ./hello.sh: Permission denied
Nastavení oprávnění pomocí příkazu chmod:$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
Neočekávaná chyba konce souboru
Pokud se objeví chybová zpráva Neočekávaný konec souboru, otevřete soubor se skriptem a a ujistěte se, že obsahuje otevírací i uzavírací uvozovky. V tomto příkladu má příkaz echo otevírací uvozovky, ale nemá žádné uzavírací:
#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote
Zkontrolujte také, zda nechybí závorky a závorky ({}):
#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...
Chybějící klíčová slova jako fi, esac, ;; atd.
Pokud jste vynechali koncové klíčové slovo jako fi nebo ;;, zobrazí se chyba typu „xxx unexpected“. Proto se ujistěte, že všechny vnořené příkazy if a case končí správnými klíčovými slovy. Požadavky na syntaxi najdete v manuálové stránce bashe. V tomto příkladu chybí fi:
#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing
Přesun nebo úprava shellového skriptu na krabicích Windows nebo Unix
Nevytvářejte skript v Linuxu/Unixu a nepřesouvejte jej do Windows. Dalším problémem je úprava shellového skriptu v bashi na Windows 10 a jeho přesunutí/nahrání na unixový server. Výsledkem bude chyba typu příkaz nenalezen kvůli návratu vozíku (DOS CR-LF). DOSovské nové řádky CR-LF můžete převést do unixového/linuxového formátu pomocí následující syntaxe:dos2unix my-script.sh
Tip 1 – Odeslání ladicí zprávy na stderr
Standardní chyba je výchozí chybové výstupní zařízení, které se používá pro zápis všech chybových zpráv systému. Proto je dobré posílat zprávy na výchozí chybové zařízení:
# Write error to stdoutecho "Error: file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error: file not found" 1>&2
Tip 2 – Zapněte zvýrazňování syntaxe při použití textového editoru vim
Většina moderních textových editorů umožňuje nastavit možnost zvýrazňování syntaxe. To je užitečné pro detekci syntaxe a prevenci běžných chyb, jako je otevírání nebo uzavírání uvozovek. Skript bash můžete zobrazit v různých barvách. Tato funkce usnadňuje psaní ve strukturách shellového skriptu a chyby syntaxe jsou vizuálně odlišeny. Zvýraznění neovlivňuje význam samotného textu; je vytvořeno pouze pro vás. V tomto příkladu je pro můj skript bashe použito zvýraznění syntaxe ve vimu:
Obr.01: Zvýraznění syntaxe skriptu shellu Bash pomocí textového editoru vim
Tip 3 – Použijte shellcheck k odřádkování skriptu
ShellCheck je nástroj statické analýzy skriptů shellu. Lze jej použít k nalezení chyb ve vašich shellových skriptech. Je napsán v jazyce Haskell. Pomocí tohoto nástroje můžete najít varování a návrhy pro shellové skripty bash/sh. Podívejme se, jak ShellCheck nainstalovat a používat v systému Linux nebo systému podobném Unixu, abyste vylepšili své shellové skripty, vyhnuli se chybám a zvýšili produktivitu.
Podívejte se také:
- Podívejte se, jak zapnout zvýrazňování syntaxe pod textovým editorem vim.
- Man stránka Bash
- BASH s debuggerem a vylepšenou podporou ladění a zpracováním chyb
🐧 Zatím 24 komentářů… Přidat jeden ↓
Kategorie | Seznam příkazů pro Unix a Linux |
---|---|
Soubor Správa | cat |
Firewall | Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04 |
Síťové nástroje | dig – host – ip – nmap |
OpenVPN | CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04 |
Správce balíčků | apk – apt |
Správa procesů | bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – time |
Searching | grep – whereis – which |
User Information | groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w |
WireGuard VPN | Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04 |