Fundo
Estou executando um comando maior de uma linha. Ele está gerando inesperadamente (duas vezes por iteração) o seguinte:
__bp_preexec_invoke_exec "$_"
Aqui está o comando reduzido (removida outra atividade em loop):
for i in `seq 1 3`; do sleep .1 ; done
nota: depois de brincar com isso algumas vezes, ele inexplicavelmente para de imprimir a saída inesperada
O que eu tentei
- Se eu remover
sleep .5
, não obtenho a saída inesperada - Se eu simplesmente executar
sleep .5
o prompt retorna, mas não há saída - Pesquisei no Google por
__bp_preexec_invoke_exec
, mas não consigo determinar como isso se aplica ao que estou fazendo
Pergunta
O que é __bp_preexec_invoke_exec "$_"?
Como posso executar isso sem a saída indesejada?
Mais informações sobre a solução graças a @gina2x:
Aqui está a saída dedeclare -f | grep preexec
preexec_functions+=(preexec);
__bp_preexec_interactive_mode="on"
__bp_preexec_invoke_exec ()
if [[ -z "$__bp_preexec_interactive_mode" ]]; then
__bp_preexec_interactive_mode="";
__bp_preexec_interactive_mode="";
local preexec_function;
local preexec_ret_value=0;
for preexec_function in "${preexec_functions[@]}";
if type -t "$preexec_function" > /dev/null; then
$preexec_function "$this_command";
preexec_ret_value="$?";
__bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"
if [[ -z "${iterm2_ran_preexec:-}" ]]; then
__iterm2_preexec "";
iterm2_ran_preexec="";
__iterm2_preexec ()
iterm2_ran_preexec="yes";
Vejo muitas informações "iterm2" (estou em um Mac e usando o iTerm2.app).
Na verdade, quando tento reproduzir usando Terminal.app, não consigo reproduzir a saída inesperada .
Excelente investigação com declare -f
- obrigado!
Parece que
__bp_preexec_invoke_exec
faz parte de https://github.com/rcaloras/bash-preexec/blob/master/bash-preexec.sh . E parece que há um bug nesse script.Esse projeto adiciona a funcionalidade 'preexec' ao bash adicionando armadilha DEBUG, eu não testei, mas posso imaginar que pode não funcionar corretamente da maneira que você vê. Verifique se ele está instalado em seu ambiente - você pode fazer isso por
declare -f
. Parece que com o bash mais recente você pode usar o PS0 em vez desse projeto, o que provavelmente faria o mesmo sem problemas que você vê.