Conclusão de bash com mudança de número?

1

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 de preenchimento de zero), e execute um comando "dfkp DFK-nnnn".

Os argumentos devem ser passados textualmente. "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 funcionaria, mas não consigo descobrir como fazer isso quando o número muda.

Qual é a melhor maneira 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).

    
por cde 24.08.2018 / 17:32

1 resposta

2

O Bash 4.0 introduziu uma nova funcionalidade para manipular comandos que não são encontrados - ele chamará uma função nomeado 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 desejar. Já que estamos dependendo do comportamento 4.0, também usei os recursos de expansão de parâmetro de revestimento superior e de carcaça inferior.

command_not_found_handle() {
  case "${1,,}" in
        (dfk-?|dfk-??|dfk-???|dfk-????|dfk-?????)
                echo dfkp "${1^^}" "${@:2}"
                return 0
        ;;
        (*)
                printf 'bash: %s: command not found\n' "$1" >&2
                return 127
        ;;

  esac
}

Se você digitar um comando que não existe, o bash chama essa função com a linha de comando original. A declaração case diminui o primeiro argumento para que seja mais simples compará-lo com os padrões dfk necessários.

Se o comando começar com dfk- e terminar com 1, 2, 3, 4 ou 5 caracteres (aperte isto para ser dígitos como achar melhor), então ele - atualmente ecoa, para depuração, mas então - - chama o programa dfkp com o primeiro parâmetro sendo a versão maiúscula da entrada dfk inicial, seguida pelo restante da linha de comando.

Para comandos que não correspondem a dfk-NNNN , ele cai 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):

$ dfk-1234
dfkp DFK-1234
$ dfk-18875 cat file.txt
dfkp DFK-18875 cat file.txt
$ some-other-command
bash: some-other-command: command not found
$ dfk-1
dfkp DFK-1
$ dfk-12345
dfkp DFK-12345
    
por 24.08.2018 / 20:55