$_를 사용할 때 "__bp_preexec_invoke_exec: 해당 파일이나 디렉터리가 없습니다."

$_를 사용할 때 "__bp_preexec_invoke_exec: 해당 파일이나 디렉터리가 없습니다."

새 디렉토리를 생성하고 동시에 Bash에서 mkdir repo && cd $_. 이것은 이전에 모든 Linux 배포판에서 잘 작동했지만 이제 Elementary OS 5에서 시도하면 아래 오류가 발생합니다.

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

이게 배쉬 문제인가요? 이 문제를 어떻게 해결할 수 있나요?

답변1

이것은 단독 Bash의 문제가 아닙니다.

내 추측으로는 뭔가(터미널 에뮬레이터?)가 Bash와 통합되어 __bp_preexec_invoke_exec함수를 정의하고 DEBUG이 함수를 사용하는 트랩을 설정하는 것 같습니다.

SO에 대한 질문이 있습니다.bash : 트랩 $_에 보존DEBUG. 거기에서 :

DEBUG트랩 을 사용할 때 $_사용자가 입력한 마지막 명령이 아닌 트랩이 실행한 마지막 명령 […]을 기반으로 합니다.

그만큼답변:

"실행된 마지막 명령의 마지막 인수"에는 "사용자가 입력한 마지막 명령"이 아니라 "마지막 명령 실행"이라는 리터럴 텍스트가 포함된다는 점에 주목할 가치가 있습니다. bash는 이와 관련하여 문서에서 약속한대로 작동합니다.

하지만 염두에 두지 마세요. 트랩이 0이 아닌 값을 반환하지 않는 한(따라서 이전에 실행한 명령을 중단하지 않는 한) 이 문제는 해결하기 충분히 쉽습니다.

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. 아니면 원인이 되는 소프트웨어가 이미 패치되어 업데이트만 하면 될 수도 있습니다.

관련 정보