마지막 명령의 반환 값을 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" = yes
PS1_PROMPT() 함수는 .bashrc에서 평가되지 않고 매번 프롬프트에서 평가되기 때문에 .bashrc에 있는 조건은 위에서 사용할 수 없습니다. $color_prompt
시스템 전체로 내보내고 싶지 않습니다 .