오류가 반환되면 Bash 프롬프트에 마지막 명령의 종료 코드를 표시합니다.

오류가 반환되면 Bash 프롬프트에 마지막 명령의 종료 코드를 표시합니다.

마지막 명령의 반환 값을 PS1.bashrc.

이제 값이 0이 아닌 경우에만 표시하고 싶습니다.

Android 셸은 다음과 같습니다.

${| local e=$? (( e )) && REPLY+="$e|" return $e }

질문:bash로 변환하는 방법은 무엇입니까?

답변1

PS1='${?#0}$ '

특별한 형태를 사용합니다.매개변수 확장, ${?#0}, 는 "문자 0이 ${?}이전 명령 종료 코드의 첫 번째 문자인 경우 해당 문자를 삭제합니다."를 의미합니다.

마지막 종료 코드가 0이 아닌 경우 프롬프트 색상을 변경할 수도 있습니다.

PS1='\[\e[0;$(($?==0?0:91))m\]$ \[\e[0m\]'

빠르게

이것은if-else 삼항 표현 $(($?==0?0:91))이렇게 하면 색상 코드 0;91m(빨간색, 참조) 가 됩니다.색상 코드) 마지막 명령이 0이 아닌 값으로 종료된 경우, 그렇지 않은 경우 0;0m(기본 색상)입니다.

답변2

이것은내가 무엇을 사용합니까?.bashrc:

PS1_PROMPT() {
  local e=$?
  (( e )) && printf "$e|"
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"
ibug@example:~ $ false
1|ibug@example:~ $ ^C
130|ibug@exame:~ $ true
ibug@example:~ $

$?return $e이는 값을 표시한 후 값을 유지한다는 JoL의 답변(passed ) 에 비해 이점이 있습니다 . 또한 기본적으로 /system/etc/mkshrc동일한 작업을 수행하는 Android Default를 재설계한 것입니다 .

$(PS1_PROMPT)변수 할당 표현식에 설정된 경우를 제외하고 인쇄될 때마다 평가되므로 작은따옴표로 묶여 있으므로 작은 $PS1따옴표로 인해 평가되지 않습니다.지금대신 인쇄 시간까지 연기됩니다.

또는 ilkkachu가 제안한 대로 Bash PROMPT_COMMAND특수 변수를 사용할 수 있습니다.

PS1_PROMPT() {
  local e=$?
  PROMPT_ECODE=
  (( e )) && PROMPT_ECODE="$e|"
  return $e
}
PROMPT_COMMAND=PS1_PROMPT
PS1='$PROMPT_ECODE'"$PS1"

이것의 한 가지 장점은 PS1이 인쇄될 때마다 하위 쉘이 생성되지 않는다는 것입니다.

답변3

전체 Android PS1는 다음과 같습니다.

${|
    local e=$?

    (( e )) && REPLY+="$e|"

    return $e
}$HOSTNAME:${PWD:-?} $ 

나는 그것을 인식하지 못하지만 ${|다음 bash는 다음과 같습니다.

PS1='$(e=$?; (( e )) && echo "$e|")$HOSTNAME:${PWD:-?} $ '

local$()서브쉘이기 때문에 필요하지 않습니다 .

답변4

모두들 감사합니다. 제 결정은 이렇습니다.

PS1_PROMPT() {
  local e=$?
  #(( e )) && printf "$e|" # BW
  (( e )) && printf "\033[01;31m$e\033[00m|"  # color
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"

errno(일명 $?)가 0이 아닌 경우 빨간색으로 표시됩니다.

"$color_prompt" = yesPS1_PROMPT() 함수는 .bashrc에서 평가되지 않고 매번 프롬프트에서 평가되기 때문에 .bashrc에 있는 조건은 위에서 사용할 수 없습니다. $color_prompt시스템 전체로 내보내고 싶지 않습니다 .

관련 정보