$_ 使用時に「__bp_preexec_invoke_exec: そのようなファイルまたはディレクトリはありません」

$_ 使用時に「__bp_preexec_invoke_exec: そのようなファイルまたはディレクトリはありません」

私は、 を使用して、Bash の 1 行のコマンドで新しいディレクトリを作成し、同時にそのディレクトリに切り替えようとしていますmkdir repo && cd $_。 これは、これまですべての Linux ディストリビューションでうまく機能していましたが、Elementary OS 5 で試すと、以下のエラーが発生します。

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

これは Bash の問題ですか? どうすれば修正できますか?

答え1

これはBashだけの問題ではありません。

私の推測では、何か(ターミナル エミュレーターなど)が Bash と統合され、__bp_preexec_invoke_exec関数を定義し、DEBUGこの関数を使用するトラップを設定します。

SOに質問があります:bash:トラップ$_に保存する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があります。または、原因となっているソフトウェアがすでにパッチ適用されていて、更新するだけでよい場合もあります。

関連情報