Это не проблема единственного Баша.
Я думаю, что-то (эмулятор терминала?) интегрируется с 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
. Или, может быть, программное обеспечение, которое является виновником, уже исправлено, и вам нужно только обновить его.