명령 프롬프트(PS1)에서 이 코드를 직접 사용하면 이전 명령이 올바르게 실행되었는지 여부를 알 수 있습니다.
PS1="\`if [ \$? = 0 ]; then echo -e \"\e[1;32m[⚡️ ]\"\e[0m; else echo -e \"\e[1;31m[
답변1
PS1="\`if [ \$? = 0 ]; then ... fi\`
업데이트: 그래서 간단한 "$()"를 시도했지만 작동하지 않습니다. 또한 이제 슬래시("\$()")를 추가하면 작동하기 때문에 더욱 혼란스럽습니다.
이것은 \
슬래시가 아니라 백슬래시입니다.
여기서 이스케이프해야 하는 이유 $
는 첫 번째 스니펫에서 백틱을 이스케이프한 이유와 같습니다. 그렇지 않으면 명령 대체가 확장되기 때문입니다.곧, 설정되면 프롬프트를 생성하는 데 사용되지 PS1
않습니다 PS1
.
할당 주위에 작은따옴표를 사용하는 것이 좋습니다. 이렇게 하면 변수 확장과 전체 문자열의 명령 대체가 방지됩니다.
PS1='$(if [ $? != 0 ]; then echo -e "\[\e[1;31m\][boom]\[\e[0m\] "; fi)\u@\h \w\$ '
\[ ... \]
bash에게 인쇄되지 않으며 프롬프트 너비를 계산할 때 고려해서는 안 된다는 점을 알리기 위해 이스케이프 코드를 래핑해야 합니다.수동). (Bash가 사용하는 그래픽 문자를 올바르게 처리하는지 모르므로 테스트할 수 없습니다.)
답변2
백틱 표기법이 마음에 들지 않습니다. ``를 사용하지 않고 이를 수행할 수 있는 방법이 있습니까?
- 예, 대체 구문명령 대체 양식을 사용하고 있습니다
$(...)
,에 따르면고급 Bash 스크립팅 가이드.
함수가 호출되고 결과가 표시되지만 조건이 실행되지 않는 것 같거나 오히려 반환된 상태 코드가 항상 0인 것 같습니다. 따라서 항상 조건의 첫 번째 부분을 표시합니다.
이것에 대한 생각이 있나요? 나는 이것이 명령 대체가 실행되는 순서와 관련이 있다고 생각합니다.
- 내 제안은 모두 전송하는 것입니다논리도착하다프롬프트 명령변수는 상황을 명확하게 해줍니다.
명시된 바와 같이Bash 프롬프트 방법 가이드 이 변수의 내용은 일반 Bash 명령으로 실행됩니다. 직전 배쉬 쇼 프롬프트, 이는$PS1
변수를 호출하기 전을 의미합니다.
예를 들어:
# Notice that we need to save the exit status to preserve it
# and avoid what you are reporting(always returning 0)
choose_icon() {
RET=$?; # Save the exit status
# Using short circuit evaluation to make statement shorter
[[ $RET != 0 ]] && ISTATUS=