Obter armadilha DEBUG bash para executar apenas uma vez para e / ou listas?

3

Suponha que eu defina uma armadilha em DEBUG da seguinte forma:

unset PROMPT_COMMAND # don't want $PROMPT_COMMAND triggering DEBUG trap
trap 'printf %s\n "most recent history line: $(history 1)" >&2' DEBUG

Se eu fizer um comando simples, ele imprime meu comando para stderr:

$ echo foo
most recent history line:   483  echo foo

No entanto, se eu executar um e / ou lista, o DEBUG trap é invocado várias vezes, uma vez por comando de lista executado:

$ echo foo && echo bar
most recent history line:   483  echo foo && echo bar
foo
most recent history line:   483  echo foo && echo bar
bar

Existe alguma maneira de eu conseguir que o DEBUG trap seja executado apenas uma vez por comando (simples ou não) inserido no prompt? Se não, qual é a melhor maneira para o meu código de armadilha detectar se ele já foi executado desde a última vez que o prompt foi desenhado?

    
por Richard Hansen 17.04.2014 / 21:46

1 resposta

3

Os trabalhos a seguir, mas parece um pouco desajeitado (espero uma resposta mais inteligente):

PROMPT_COMMAND='at_prompt=t'
trap '
    [ -z "${at_prompt+set}" ] ||
    printf %s\n "most recent history line: $(history 1)" >&2
    unset at_prompt
' DEBUG
    
por 17.04.2014 / 21:50