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