Kdysi hodně dávno u nás vyšla oranžová brožura s názvem Domluvte se s počítačem (dostupné na uložto). Tedy domluvte se s pomocí některého z programovacích jazyků: BASIC, Pascal nebo Prolog. Jako uživatel ZX Spectra jsem využil tu basicovskou část. Pascal mi byl později vnucen na ČVUT a když jsem si výše uvedené PDF prohlédl, pohled na jeho syntaktické diagramy mi rozjitřil staré rány na duši.
Brožura byla vyšperkovaná vtipy od Vladimíra Jiránka. Některé jsou aktuální i dnes. Jedním z nich je i následující (řekl bych, že i kultovní):
Sorry, vole error.
A teď k tomu, jak zařídit aby vás váš GNU Bourne-Again SHell oblažil stejnou hláškou v případě, že zadáte neexistující příkaz? Pokud bash nenajde požadovaný příkaz mezi svými vestavěnými funkcemi a ani v systémových cestách definovaných v proměnné prostředí $PATH zkusí ještě zavolat funkci command_not_found_handle, které jako parametr předá vámi volaný (nenazelený příkaz). A chování této funkce si můžete nadefinovat pomocí:
function command_not_found_handle() { echo "Sorry, vole error!" >&2 return 127 }
Ten návratový kód 127 je v bashi používán právě pro návrat při chybě s nenalezeným příkazem a funkce by při nedefinovaném návratovém kódu vrátila nulu (tedy okay) a to by mohlo něco rozbít (např. set -e, exit on error). Některé distribuce tohle použivají a v případě překlepů nabízejí příkazy s podobným názvem a nebo návod jak daný program nainstalovat z repozitáře.
Zmíněnou funkci si hoďte do ~/.bashrc a nyní budete počítač hovořit po našem!
Ještě me napadla jedna varianta, pokud je dostupný příkaz banner, aby se to vypsalo pěkně velkejma jako na terminálu pana ynženýra:
function command_not_found_handle() { local msg="Sorry, vole error!" if [ -f /usr/bin/banner ] then banner "$msg" else echo "$msg" fi >&2 return 127 }
##### ####### ###### ###### # # # # ####### # ####### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # # ###### ###### # ### # # # # # ##### # # # # # # # # ### # # # # # # # # # # # # # # # # # # # # # # ##### ####### # # # # # # # ####### ####### ####### ####### ###### ###### ####### ###### ### # # # # # # # # # ### # # # # # # # # # ### ##### ###### ###### # # ###### # # # # # # # # # # # # # # # # # # # ### ####### # # # # ####### # # ###