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
}
##### ####### ###### ###### # # # # ####### # #######
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # #
##### # # ###### ###### # ### # # # # # #####
# # # # # # # # ### # # # # # #
# # # # # # # # # # # # # # # #
##### ####### # # # # # # # ####### ####### #######
####### ###### ###### ####### ###### ###
# # # # # # # # # ###
# # # # # # # # # ###
##### ###### ###### # # ###### #
# # # # # # # # #
# # # # # # # # # ###
####### # # # # ####### # # ###