AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 780846
Accepted
Anton Samokat
Anton Samokat
Asked: 2024-07-26 19:26:48 +0800 CST2024-07-26 19:26:48 +0800 CST 2024-07-26 19:26:48 +0800 CST

Como sobrecarregar/personalizar o manipulador de comandos do bash (ou qualquer outro shell)?

  • 772

Quando bashalgum comando inexistente é executado, a mensagem de erro correspondente aparece:

$ non-existent-command
non-existent-command: command not found

É possível personalizar esse comportamento?

Eu gostaria de alcançar o seguinte. Quando o comando inserido corresponder, por exemplo, ao padrão s\d\d\d, ele deverá ser tratado de maneira especial:

  • sdeve ser extraído e usado como um comando,
  • \d\d\ddeve ser extraído e usado como argumento para o scomando.
  • O comando criado pela análise acima deve ser executado.

Isto normalmente pode ser conseguido por meio de uma função chamada sque recebe os argumentos necessários. Uma chamada normal é usada para executar tal função. Por exemplo:

s 123

Mas quero customizar o comportamento para bashpoder executar tal função com, por exemplo, as seguintes chamadas:

  • s123
  • s500

Tentei encontrar informações relacionadas man bashpelas seguintes palavras-chave: overload, custom, overridee não tive sucesso.

Pelo que entendi, preciso personalizar de alguma forma o bashmanipulador usado para processar a entrada. Não investiguei basho código-fonte para entender se isso é viável.

Será melhor encontrar uma solução que seja utilizável para qualquer shell.

Provavelmente criar um bashwrapper/adaptador personalizado com a lógica necessária e usá-lo em vez do bashbinário padrão resolverá isso.

bash
  • 1 1 respostas
  • 137 Views

1 respostas

  • Voted
  1. Best Answer
    Ed Morton
    2024-07-26T19:52:35+08:002024-07-26T19:52:35+08:00

    Em bash:

    $ s() { printf 'Called s %s\n' "$*" >&2; }
    

    $ cat $HOME/bin/command_not_found_handle
    #!/usr/bin/env bash
    
    command_not_found_handle() {
        if [[ "$*" =~ ^(s)([0-9]{3})$ ]]; then
            "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}"
        else
            printf 'Command not found: %s\n' "$*" >&2
            return 127
        fi
    }
    

    $ . $HOME/bin/command_not_found_handle
    

    $ s123
    Called s 123
    
    $ s500
    Called s 500
    
    $ echo $?
    0
    

    $ s5001
    Command not found: s5001
    
    $ echo $?
    127
    

    Para sua informação, 127é o status de saída padrão "comando não encontrado". Consulte https://www.gnu.org/software/bash/manual/bash.html#Command-Search-and-Execution para obter mais informações.

    Estou usando apenas BASH_REMATCH[]o procedimento acima para chamar sporque sei que é seguro fazê-lo, pois $*contém o comando como uma única letra e seus argumentos com apenas 3 dígitos. Para algo mais complicado, consulte https://mywiki.wooledge.org/BashFAQ/ 050 .

    Não há solução que funcione em todos os shells, consulte Como definir uma função que lida com `comando não encontrado`? para encontrar informações sobre abordagens acima para alguns outros shells.

    • 5

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve