Bashscript의 문자열 내 조건

Bashscript의 문자열 내 조건

실패하면 셸에서 이전 명령의 종료 코드를 인쇄하고 싶습니다. 그래서 PS1변수를 다음과 같이 변경했습니다 ./etc/bash.bashrc

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w [$?] \$ '
#_______________________________________________^^^^_____

그러나 항상 이전 명령의 종료 코드를 인쇄합니다. $?같음 인 경우 0인쇄되지 않도록 템플릿에 조건을 추가하는 방법이 있습니까?$?

답변1

다음과 같이 내부적으로 조건과 표현식을 만들 수 있습니다 $().

echo "$( var=2; echo $var)"

귀하의 예에서는 PS1다음과 같이 변수를 변경할 수 있습니다.

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $(
    status=$?; (( status != 0 )) && echo "[$status] "
)\$ '

좋다:

jackman@b7q9bw1:~ $ echo hello
hello
jackman@b7q9bw1:~ $ sh -c 'exit 42'
jackman@b7q9bw1:~ [42] $ 

답변2

Bash는 변수에서 코드를 실행합니다.PROMPT_COMMAND프롬프트를 인쇄하기 전에. 수행할 수 있는 작업 중 하나는 프롬프트의 구성 요소를 계산한 다음 설정을 통해 해당 구성 요소를 조합하는 것입니다 PS1.

PROMPT_COMMAND_set_status () {
  if ((last_status == 0)); then
    PS1_status=
  else
    PS1_status="[$last_status] "
  fi
}
PS1=PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $PS1_status\$ '
PROMPT_COMMAND='last_status=$?; PROMPT_COMMAND_set_status'

관련 정보