
Estoy intentando crear un nuevo directorio y cambiar simultáneamente a él con un comando de una línea en Bash usando mkdir repo && cd $_
. Esto me ha funcionado bien anteriormente en todas las distribuciones de Linux, pero ahora, cuando lo pruebo en Elementary OS 5, me arroja el siguiente error:
:~$ mkdir repo && cd $_
bash: cd: __bp_preexec_invoke_exec: No such file or directory
¿Es esto un problema de Bash? como podemos arreglar esto?
Respuesta1
Este no es un problema de único Bash.
Supongo que algo (¿un emulador de terminal?) se integra con Bash, define __bp_preexec_invoke_exec
la función y establece una DEBUG
trampa que usa esta función.
Hay una pregunta sobre SO:bash: preservar $_
en una DEBUG
trampa. A partir de ahí:
Cuando se utiliza una
DEBUG
trampa,$_
se basa en el último comando ejecutado por la trampa […] en lugar del último comando que ingresó el usuario.
Elrespuesta:
Vale la pena señalar que "el último argumento del último comando ejecutado" incluye el texto literal "último comando ejecutado", no "último comando ingresado por el usuario"; bash se está comportando como promete su documentación a este respecto.
Pero no importa eso: a menos que sus trampas alguna vez devuelvan valores distintos de cero (y por lo tanto aborten los comandos que ejecutaron antes), esto es bastante fácil de solucionar:
trapfunc() { local old_=$1; date; : "$old_"; } trap 'trapfunc "$_"' DEBUG
Por ejemplo, tomemos iTerm2. Utiliza __bp_preexec_invoke_exec
(nota en tu caso particular puede ser algún otro programa que use el mismo nombre para el mismo fin). En el momento en que estoy escribiendo esta respuesta, esto es lo que puedes encontrar enhttps://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"
La función continúa y luego
__bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"
}
Y en otros lugares ( __bp_install
):
trap '__bp_preexec_invoke_exec "$_"' DEBUG
Básicamente utiliza la solución de la respuesta vinculada. Tenga en cuenta que el código incluso menciona la pregunta vinculada.
Debe averiguar de dónde __bp_preexec_invoke_exec
viene y parchearlo en consecuencia junto con trap '__bp_preexec_invoke_exec' DEBUG
la línea probable. O tal vez el software culpable ya haya sido parcheado y solo necesite actualizarlo.