2014-09-12 15 views
5

Często piszę ccclear zamiast clear.Jak używać regex w aliasach basha

Czy można używać wyrażenia regularnego w aliasie? Coś jak:

alias c\+lear='clear' 
+2

myślę, że nie jest to możliwe. –

+0

@AvinashRaj, ... nie z pseudonimem, nie. Pożądane zachowanie można jednak osiągnąć w inny sposób. –

+1

Użyj skrótu klawiaturowego dla 'wyczyść'. Jest to dość częsta operacja. 'Ctrl + L' powinno działać z domyślnymi ustawieniami. – PSkocik

Odpowiedz

5

nr

Aliasy prowadzone proste podstawienie prefiks i nie są wystarczająco silne, o wiele więcej.

Jednak w Bash 4 można użyć funkcji o nazwie command_not_found_handle, aby uruchomić w tym przypadku i uruchomić dowolną logikę.

command_not_found_handle() { 
    if [[ $1 =~ ^c+lear$ ]]; the 
    clear 
    else 
    return 127 
    fi 
} 

Jeśli chcesz, aby móc dodać nowe mapowanie dynamicznie:

declare -A common_typos=() 
common_typos['^c+lear$']=clear 
command_not_found_handle() { 
    local cmd=$1; shift 
    for regex in "${!common_typos[@]}"; do 
    if [[ $cmd =~ $regex ]]; then 
     "${common_typos[$regex]}" "[email protected]" 
     return 
    fi 
    done 
    return 127 
} 

Z powyższego można dodać nowe mapowanie trywialnie:

common_typos['^ls+$']=ls 
+0

Ouch! Miałem tu subtelny błąd, w którym zamiast powtarzać, wykonywałem iterację zamiast zamienników. Poprawiona wersja jest już dostępna. –