zsh precmd 함수에서 명령의 종료 상태를 얻는 방법은 무엇입니까?

zsh precmd 함수에서 명령의 종료 상태를 얻는 방법은 무엇입니까?

실행 중인 명령에 대한 일부 상황 정보를 추가할 수 있도록 함수와 함께 add-zsh-hook precmd를 사용합니다.

즉, precmd 함수에 대한 호출은 이전 명령이 성공했는지 여부를 확인하기 위한 매개변수나 환경 변수를 제공하지 않는 것으로 보입니다. 결과에 따라 다르게 행동할 수 있다는 사실을 알게 되어 기쁩니다.

견본:

_after() {
  printf 'args:%s\n' "$*" # nothing
  printf 'After\n'
  # env #: nothing useful here
}

autoload -U add-zsh-hook
add-zsh-hook precmd _after

답변1

마지막 명령의 종료 상태는 일반적인 및 를 precmd통해 후크 에서 액세스할 수 있습니다 . 후크의 첫 번째 명령만 검색할 수 있다는 점을 기억하세요. Hook의 첫 번째 줄에 개인 매개변수를 저장하는 것은 드문 일이 아닙니다 .$?$status$?precmd

my-precmd-hook() {
  local -i code=$?
  printf 'exit code of the previous command: %d\n' code
}

autoload -Uz add-zsh-hook
add-zsh-hook precmd my-precmd-hook

현재 문서는 그다지 좋지 않지만 거기에 있습니다.

후크 기능

다음 함수의 경우 _functions첨부된 함수와 동일한 이름으로 배열을 정의할 수 있습니다. 이러한 배열의 모든 요소는 실행될 함수의 이름으로 처리되며 $?동일한 매개변수 및 동일한 초기 값을 사용하여 기본 함수와 동일한 컨텍스트에서 실행됩니다.

precmd각 프롬프트 전에 실행하십시오.

따라서 배열의 모든 함수는 precmd_functions메인 후크와 동일한 방식으로 실행됩니다. 문서에는 이것이 메인 후크에 있는 마지막 명령의 상태 코드라고 명시적으로 명시되어 있지 않지만 암시적입니다. 마지막 명령의 상태가 아닌 경우,$?precmd$?precmd$?저것문서화해야 합니다.

추가로 우리는 다음을 발견했습니다:

셸 함수는 add-zsh-hook배열에서 함수를 추가하거나 제거하는 간단한 방법을 제공합니다.

이는 precmd설치된 후크도 add-zsh-hook기본 후크와 동일한 방식으로 실행된다는 의미입니다.$?precmd

관련 정보