Eu gostaria de criar uma função ou alias ou conclusão de comando no bash que tomaria um comando como "dfk-1234" ou "DFK-nnnnn" (o número pode ser de 1 a 5 dígitos, não preenchido com zero) e executar um comando "dfkp DFK-nnnn".
Os argumentos devem ser passados literalmente. "dfk-18875 cat file.txt" deve se tornar "dfpk DFK-18875 cat file.txt".
Acho que a conclusão do comando ou a expansão da guia funcionariam, mas não consigo descobrir como fazê-lo quando o número mudar.
Qual é a melhor forma de fazer isso? Uma vez que eu possa lidar com o nome do comando principal, então eu posso lidar com o resto (case, argumentos, etc).
O Bash 4.0 introduziu uma nova funcionalidade para lidar com comandos que não são encontrados - ele chamará uma função chamada
command_not_found_handle
, se essa função existir. Você pode usar esse comportamento para interceptar chamadas para "programas" chamados dfk-NNN ou DFK-NNN e executá-los novamente como quiser. Como já estamos dependendo do comportamento da versão 4.0, também usei os recursos de expansão de parâmetros de maiúsculas e minúsculas.Se você inserir um comando que não existe, o bash chama essa função com a linha de comando original. A
case
instrução coloca em letras minúsculas o primeiro argumento para que seja mais simples compará-lo com osdfk
padrões necessários.Se o comando começar
dfk-
e terminar com 1, 2, 3, 4 ou 5 caracteres (aperte-os para serem dígitos como achar melhor), então ele -- atualmente ecoa, para depuração, mas então -- chama odfkp
programa com o o primeiro parâmetro é a versão em maiúsculas da entrada dfk inicial, seguida pelo restante da linha de comando.Para comandos que não correspondem
dfk-NNNN
, ele falha e imprime uma mensagem de erro bash simulada para stderr e retorna 127. (Isso corresponde ao comportamento padrão, como se command_not_found_handle não existisse).Uma sessão de amostra (com a depuração de eco instalada, pois não tenho um programa dfkp real):