Published: 27. 9. 2019   Category: GNU/Linux

Chybová hláška bashe při nelazenení příkazu

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

#######  ######   ######   #######  ######    ###   
#        #     #  #     #  #     #  #     #   ###   
#        #     #  #     #  #     #  #     #   ###   
#####    ######   ######   #     #  ######     #    
#        #   #    #   #    #     #  #   #           
#        #    #   #    #   #     #  #    #    ###   
#######  #     #  #     #  #######  #     #   ###