«__bp_preexec_invoke_exec: Нет такого файла или каталога» при использовании $_

«__bp_preexec_invoke_exec: Нет такого файла или каталога» при использовании $_

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

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

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

решение1

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

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

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

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

Theотвечать:

Стоит отметить, что «последний аргумент последней выполненной команды» включает в себя буквальный текст «последняя выполненная команда», а не «последняя команда, введенная пользователем»; в этом отношении 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строкой. Или, может быть, программное обеспечение, которое является виновником, уже пропатчено, и вам нужно только обновиться.

Связанный контент