"__bp_preexec_invoke_exec: Arquivo ou diretório inexistente" ao usar $_

"__bp_preexec_invoke_exec: Arquivo ou diretório inexistente" ao usar $_

Estou tentando criar um novo diretório e alternar simultaneamente para ele em um comando de linha no Bash usando mkdir repo && cd $_. Isso funcionou bem para mim anteriormente em todas as distros Linux, mas agora, quando tento no Elementary OS 5, recebo o erro abaixo:

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

Isso é um problema do Bash? Como podemos consertar isso?

Responder1

Este não é um problema exclusivo do Bash.

Meu palpite é que algo (um emulador de terminal?) Integra-se ao Bash, define __bp_preexec_invoke_execa função e define uma DEBUGarmadilha que usa essa função.

Há uma pergunta no SO:bash: preservar $_em uma DEBUGarmadilha. A partir daí:

Ao usar uma DEBUGarmadilha, $_baseia-se no último comando executado pela armadilha [...] em vez do último comando digitado pelo usuário

Oresponder:

É importante notar que “o último argumento do último comando executado” inclui o texto literal “último comando executado”, e não “último comando digitado pelo usuário”; bash está se comportando conforme sua documentação promete a esse respeito.

Mas não importa isso: a menos que suas armadilhas retornem valores diferentes de zero (e, portanto, abortem comandos executados antes), isso é fácil de contornar:

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

Por exemplo, pegue o iTerm2. Ele usa __bp_preexec_invoke_exec(observe que no seu caso específico pode ser algum outro programa que use o mesmo nome para a mesma finalidade). No momento em que estou escrevendo esta resposta, é isso que você pode encontrar emhttps://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"

A função continua e então

__bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"

}

E em outro lugar ( __bp_install):

trap '__bp_preexec_invoke_exec "$_"' DEBUG

Basicamente, ele usa a solução da resposta vinculada. Observe que o código até menciona a pergunta vinculada!

Você deve descobrir de onde __bp_preexec_invoke_execvem e corrigi-lo de acordo com trap '__bp_preexec_invoke_exec' DEBUGa linha provável. Ou talvez o software culpado já tenha sido corrigido e você só precise atualizar.

informação relacionada