
私は、 を使用して、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
があります。または、原因となっているソフトウェアがすでにパッチ適用されていて、更新するだけでよい場合もあります。