Jak ladit skript Bash Shell pod Linuxem nebo UNIXem

Říj 6, 2021
admin

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.
Jak ladit shellový skript bash v systému Linux nebo Unix
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"
OR
DEBUG 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:

Jak ladit skript shellu Bash pod Linuxem nebo UNIXem pomocí funkce 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

🐧 Získejte nejnovější návody na Linux, Open Source & DevOps prostřednictvím RSS kanálu nebo týdenního e-mailového zpravodaje.
🐧 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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.