
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_exec
a função e define uma DEBUG
armadilha que usa essa função.
Há uma pergunta no SO:bash: preservar $_
em uma DEBUG
armadilha. A partir daí:
Ao usar uma
DEBUG
armadilha,$_
baseia-se no último comando executado pela armadilha [...] em vez do último comando digitado pelo usuário
É 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_exec
vem e corrigi-lo de acordo com trap '__bp_preexec_invoke_exec' DEBUG
a linha provável. Ou talvez o software culpado já tenha sido corrigido e você só precise atualizar.