Que tal exec zsh
?
Mas esse recurso pode realmente ser implementado no bash (desde a versão 4.0; usuários do OSX, consulte o parágrafo anterior). Mais ou menos. Quando o bash encontra um comando que não é encontrado no PATH
, ele executa uma função chamada command_not_found_handle
. Você pode escrever uma função que tente abrir o arquivo se for um arquivo no diretório atual.
typeset -A extension_aliases
command_not_found_handle () {
if [[ $# -eq 1 && -e $1 && $1 = *.* ]]; then
local handler="${extension_aliases[${1##*.}]}"
if [[ -n $local_handler ]]; then
eval "$local_handler \"\$@\""
return
fi
fi
return 127
}
Em vez de alias -s txt=nano
, use extension_aliases[txt]=nano
.
Existem limitações para essa abordagem. O arquivo deve estar no diretório atual, porque command_not_found_handle
é chamado apenas com um nome de comando que não contém uma barra. Além disso, você não terá conclusão para o nome do arquivo.
É muito mais simples usar os mecanismos existentes:
xdg-open word.txt
ou no Debian e derivados
see word.txt
Você obtém muitos benefícios: já existe um banco de dados do sistema que mapeia extensões para programas, a conclusão funcionará e não requer nenhum tratamento especial do shell. Ele exige um pouco mais de digitação, mas você pode definir um alias de um caractere para ele (você precisará de um espaço depois dele) ou uma associação de chave que insira xdg-open
no início da linha:
bind -x '"\eo": READLINE_LINE="xdg-open $READLINE_LINE"; READLINE_POINT+=9'