„__bp_preexec_invoke_exec: Keine solche Datei oder kein solches Verzeichnis“ bei Verwendung von $_

„__bp_preexec_invoke_exec: Keine solche Datei oder kein solches Verzeichnis“ bei Verwendung von $_

Ich versuche, ein neues Verzeichnis zu erstellen und gleichzeitig mit einem Einzeilenbefehl in Bash dorthin zu wechseln mkdir repo && cd $_. Dies hat bei mir bisher auf allen Linux-Distributionen gut funktioniert, aber jetzt, wenn ich es auf Elementary OS 5 versuche, erhalte ich den folgenden Fehler:

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

Ist das ein Bash-Problem? Wie können wir das beheben?

Antwort1

Dies ist kein alleiniges Problem von Bash.

Ich vermute, dass etwas (ein Terminalemulator?) in Bash integriert ist, __bp_preexec_invoke_execdie Funktion definiert und eine DEBUGFalle stellt, die diese Funktion verwendet.

Es gibt eine Frage zu SO:bash: $_in einer DEBUGFalle bewahren. Daraus:

Bei der Verwendung einer DEBUGFalle $_basiert es auf dem letzten von der Falle ausgeführten Befehl […] und nicht auf dem letzten vom Benutzer eingegebenen Befehl.

DerAntwort:

Es ist erwähnenswert, dass „das letzte Argument des zuletzt ausgeführten Befehls“ den wörtlichen Text „letzter ausgeführter Befehl“ und nicht „letzter vom Benutzer eingegebener Befehl“ enthält. Bash verhält sich in dieser Hinsicht so, wie es die Dokumentation verspricht.

Aber egal: Sofern Ihre Traps nie Werte ungleich Null zurückgeben (und dadurch zuvor ausgeführte Befehle abbrechen), lässt sich dies recht einfach umgehen:

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

Nehmen wir zum Beispiel iTerm2. Es verwendet __bp_preexec_invoke_exec(beachten Sie, dass es in Ihrem speziellen Fall ein anderes Programm sein kann, das denselben Namen für denselben Zweck verwendet). Im Moment schreibe ich diese Antwort. Dies finden Sie unterhttps://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"

Die Funktion wird fortgesetzt und dann

__bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command"

}

Und anderswo ( __bp_install):

trap '__bp_preexec_invoke_exec "$_"' DEBUG

Es wird also grundsätzlich die Lösung aus der verlinkten Antwort verwendet. Beachten Sie, dass der Code sogar die verlinkte Frage erwähnt!

Sie sollten herausfinden, woher Ihr Fehler __bp_preexec_invoke_execkommt, und ihn zusammen mit der wahrscheinlichen Zeile entsprechend patchen trap '__bp_preexec_invoke_exec' DEBUG. Oder vielleicht wurde die Software, die der Übeltäter ist, bereits gepatcht und Sie müssen sie nur aktualisieren.

verwandte Informationen