No bash: processando todas as linhas de comando sem usar a depuração de depuração?

2

Eu tenho um mecanismo complicado embutido em meu ambiente bash que requer a execução de alguns scripts quando o prompt é gerado, mas também quando o usuário pressiona enter para começar a processar um comando. Vou dar uma descrição simplista:

A armadilha de depuração faz isso de maneira bastante limitada: ele é acionado toda vez que uma instrução é executada.

trap 'echo $BASH_COMMAND' DEBUG  # example only

Infelizmente, isso significa que, quando digito isso:

sleep 1; sleep 2; sleep 3

em vez de processar um $ BASH_COMMAND que contém a linha inteira, recebo os três suspensos em três armadilhas diferentes. Pior ainda:

sleep 1 | sleep 2 | sleep 3

dispara todos os três enquanto o pipe está configurado - antes que o sleep 1 comece a ser executado, a saída pode levar você a acreditar que o sleep 3 está em execução.

Eu preciso de uma maneira de executar um script logo no começo, processando o comando inteiro, e prefiro que ele não seja disparado quando o comando prompt for executado, mas eu posso lidar com isso se for necessário.

    
por Sniggerfardimungus 03.12.2014 / 03:12

1 resposta

3

Não é muito bonito, mas se você realmente precisar disso, poderá usar PROMPT_COMMAND além da depuração de depuração para se livrar das chamadas extras:

trap 'debug_hook' DEBUG

debug_hook()
{ 
  [ -n "$debug_hook_on" ] || return 
  debug_hook_on="" 
  echo hook             # cmds to run ...
}

PROMPT_COMMAND='debug_hook_on=1'

Agora:

$ echo 1 ; echo 2 | cat
hook
1
2

No entanto, ainda não temos acesso a toda a linha de entrada: $BASH_COMMAND é apenas echo 1 .

Outra ideia inspirada por este artigo é usar ligações readline para ter acesso ao todo linha:

$ bind -x '"\C-o":hook'
$ hook(){ echo "hook: $READLINE_LINE";  }
$ bind 'RETURN: "\C-o\n"'

Agora funciona:

hook: echo 1; echo 2
$ echo 1; echo 2
1
2

Uma coisa a ter em mente: para uma entrada de várias linhas, ela será invocada uma vez para cada linha, o que pode não ser o que você deseja (poderia usar uma combinação de ambas as abordagens).

    
por 03.12.2014 / 14:55