2

Я пытаюсь создать новый каталог и одновременно переключиться на него в однострочной команде на Bash, используя mkdir repo && cd $_ . Раньше это работало хорошо для меня на всех дистрибутивах Linux, но теперь, когда я пробую его на Elementary OS 5, выдает следующую ошибку:

:~$ mkdir repo && cd $_
bash: cd: __bp_preexec_invoke_exec: No such file or directory

Это проблема Bash? Как мы можем это исправить?

1 ответ1

1

Это не проблема единственного Баша.

Я думаю, что-то (эмулятор терминала?) интегрируется с Bash, определяет функцию __bp_preexec_invoke_exec и устанавливает ловушку DEBUG которая использует эту функцию.

Есть вопрос о SO: bash: preserve $_ в ловушке DEBUG. Оттуда:

При использовании ловушки DEBUG $_ основывается на последней команде, выполненной ловушкой […], а не на последней команде, введенной пользователем

Ответ:

Стоит отметить, что "последний аргумент последней выполненной команды" включает буквальный текст "последняя выполненная команда", а не «последняя команда, введенная пользователем»; bash ведет себя так, как обещает его документация в этом отношении.

Но не берите в голову: если ваши ловушки никогда не возвращают ненулевые значения (и, таким образом, прерывают команды, которые они выполняли раньше), это достаточно легко обойти:

trapfunc() { local old_=$1; date; : "$old_"; }
trap 'trapfunc "$_"' DEBUG

Например, возьмите iTerm2. Он использует __bp_preexec_invoke_exec (обратите внимание, что в вашем конкретном случае это может быть какая-то другая программа, которая использует то же имя для той же цели). На данный момент я пишу этот ответ, вот что вы можете найти по адресу https://iterm2.com/shell_integration/bash :

# This function is installed as the DEBUG trap.  It is invoked before each
# interactive prompt display.  Its purpose is to inspect the current
# environment to attempt to detect if the current command is being invoked
# interactively, and invoke 'preexec' if so.
__bp_preexec_invoke_exec() {
    # Save the contents of $_ so that it can be restored later on.
    # https://stackoverflow.com/questions/40944532/bash-preserve-in-a-debug-trap#40944702
    __bp_last_argument_prev_command="$1"

Функция продолжается, а затем

__bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"

}

И в другом месте (__bp_install):

trap '__bp_preexec_invoke_exec "$_"' DEBUG

Таким образом, он в основном использует решение из связанного ответа. Обратите внимание, что в коде даже упоминается связанный вопрос!

Вы должны выяснить, откуда взялся ваш __bp_preexec_invoke_exec и соответствующим образом исправить его вместе с вероятной trap '__bp_preexec_invoke_exec' DEBUG . Или, может быть, программное обеспечение, которое является виновником, уже исправлено, и вам нужно только обновить его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .