Задний план

Я запускаю более крупную однострочную команду. Он неожиданно выводит (дважды за итерацию) следующее:

__bp_preexec_invoke_exec "$_"

Вот урезанная команда (удалено другое действие в цикле):

for i in `seq 1 3`; do sleep .1 ; done

примечание: после того, как я поиграл с этим несколько раз, он по необъяснимым причинам перестает печатать неожиданный вывод

Что я пробовал

  • Если я удалю sleep .5, я не получу неожиданный вывод
  • Если я просто запускаю sleep .5, приглашение возвращается, но вывода нет
  • Я погуглил __bp_preexec_invoke_exec, но не могу определить, как это применимо к тому, что я делаю.

Вопрос

Что такое __bp_preexec_invoke_exec "$_"?

Как я могу запустить это без нежелательного вывода?


Больше информации о решении благодаря @gina2x:

Вот вывод declare -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";

Я вижу там много информации «iterm2» (я на Mac и использую iTerm2.app).

На самом деле, когда я пытаюсь воспроизвести с помощью Terminal.app, я не могу воспроизвести неожиданный вывод.

Отличное расследование с declare -f - спасибо!

2
WEBjuju 27 Дек 2017 в 00:01
Вы пробовали отладчик bash -x, например: bash -x -c 'for i in $(seq 3); do sleep .1 ; done'
 – 
hschou
26 Дек 2017 в 19:30
Я попробую; Я только что попробовал, но он снова остановил вывод. это очень странно.
 – 
WEBjuju
26 Дек 2017 в 19:43
2
Бьюсь об заклад, вы используете какой-то странный сторонний скрипт в .bashrc. Таким образом, первое, что нужно попробовать, это запустить bash --norc --noprofile и повторить упражнение.
 – 
jimmij
26 Дек 2017 в 20:11
Ну, ~/.bashrc имеет только это: [[ "$-" != *i* ]] && return, но я проверил /etc/bashrc, и хотя он также имеет раздел are we an interactive shell? с более длинным сценарием, похоже, он поставляется с centos (выпуск CentOS Linux 7.4.1708 (основной)). неожиданный вывод, кажется, отображается только один раз, а затем не через какое-то неизвестное время; возможно, изменение длины аргумента sleep снова запускает вывод, но поскольку он делает это, а затем нет, трудно научно применить идеи отладки, представленные до сих пор. я буду продолжать пытаться.
 – 
WEBjuju
26 Дек 2017 в 20:45

1 ответ

Лучший ответ

Похоже, __bp_preexec_invoke_exec является частью https://github .com/rcaloras/bash-preexec/blob/master/bash-preexec.sh. И похоже, что в этом скрипте есть ошибка.

Этот проект добавляет функциональность «preexec» в bash, добавляя ловушку DEBUG, я не тестировал, но могу предположить, что она может работать не так, как вы ее видите. Проверьте, установлен ли он в вашей среде — это можно сделать с помощью declare -f. Похоже, что с более новым bash вы можете использовать PS0 вместо этого проекта, который, вероятно, сделает то же самое без проблем, которые вы видите.

5
gena2x 26 Дек 2017 в 21:32
Когда я пытаюсь воспроизвести с помощью Terminal.app вместо iTerm2.app (на Mac), я не могу воспроизвести неожиданный вывод. Отличное расследование - я добавил эту и другую вспомогательную информацию в конец своего поста для дальнейшего разъяснения того, что я видел.
 – 
WEBjuju
27 Дек 2017 в 00:03