Você pode fazer isso usando o seguinte:
- Defina
shopt extdebug
, ativando várias opções de depuração. O relevante é: Se o comando executado pela armadilha DEBUG retornar um valor diferente de zero, o próximo comando será ignorado e não executado. Precisamos que isso não tente realmente executar olal
indefinido. comando. - Um
trap
para o sinalDEBUG
, que é executado antes de qualquer comando ser executado. Defina a armadilha assim:trap 'insane_magic_alias' DEBUG
.
A função insane_magic_alias
interpreta o comando prestes a ser executado (em $BASH_COMMAND
) e o processa, abortando a execução do comando realmente inserido no processo por return 1
, a menos que type
diga que existe, nesse caso caso não façamos nada (e deixe correr).
# make sure to name this function appropriately...
function insane_magic_alias {
local CMD=$BASH_COMMAND
# make sure this isn't a command that exists
if ! type "$( echo "$CMD" | awk -F' ' '{ print $1 }' )" >/dev/null 2>&1 ; then
# handle calls to 'l*'
if [[ ${#CMD} -gt 1 && "${CMD:0:1}" = l ]] ; then
# actual transformed program call
ls -${CMD:1}
# abort execution of undefined command
return 1
fi
fi
# either execute an existing command, or show the "command not found" message
return 0
}
Resultado:
$ lal
total 0
drwxr-xr-x 2 danielbeck staff 68 2 Aug 22:53 .
drwxr-xr-x@ 78 danielbeck staff 2652 2 Aug 22:53 ..
Observe que o seu bash acha que você tem um trabalho em execução por um momento logo depois (se você imprimir as informações do trabalho no seu PROMPT_COMMAND
, você notará isso). Além disso, provavelmente, alguns outros efeitos colaterais que fazem isso falhar em qualquer caso, não apenas uma simples demonstração ...