2개의 프롬프트를 하나로 병합하고 오류 상태를 빨간색/주황색으로 표시합니다.

2개의 프롬프트를 하나로 병합하고 오류 상태를 빨간색/주황색으로 표시합니다.

모든 사람처럼 나에게도 맞춤 팁이 있습니다. 내 루트 사용자는 빨간색으로 바뀌고, 일반 사용자는 녹색으로 바뀌며, 기타 몇 가지 사항은 다음과 같습니다.

존재하다 bash.bashrc:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '

존재하다 .bashrc:

PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

다음으로 이어진다:

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$

일반 사용자의 경우..

이것이 제가 팁으로 할 수 있는 최선의 방법이지만 실제 고위 관리자가 자신의 팁을 저에게 공유했습니다.

PS1_Error="\[\033[31;1m\]"
PS1_Normal="\[\033[0m\]"
PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ '
PS1="\`
        retcode=\$? ;
        if [ 0 -ne \$retcode ]; then
                bad=\" [\\\\\\\$?=\$retcode]\"
                echo \"$PS1_Error$PS1_Inside$PS1_Normal\"
        else
                bad='';
                echo \"$PS1_Inside\";
        fi;
\`"
unset PS1_Error PS1_Normal PS1_Inside

오류가 있으면 빨간색으로 변하는 놀라운 능력이 있습니다.오류 번호 표시!

난 너무 멍청해서 이해조차 못 해어떻게 작동하나요?(필수 변수가 설정되지 않았습니까???), 변수에 포함시키기에는 확실히 너무 멍청합니다. (그리고 오류 조건에 주황색을 원합니다...)

고위 관리자는 매우 바쁜 남자/여자/중립적인 사람이기 때문에 누군가 위의 내용을 이해하고 나에게 물고기를 가르치는 것보다 나에게 낚시하는 방법을 가르쳐주고 싶은 사람이 있는지 U&L에 묻습니다 . 좋은 점 PS1과 어리석은 점을 혼합하고 여기서 무슨 일이 일어나고 있는지 설명할 수 있도록 도와주세요 .

답변1

다음 변수는 프롬프트 자체를 설명합니다.

PS1_Error="\[\033[31;1m\]"
PS1_Normal="\[\033[0m\]"
PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ '

색상은 다음을 사용하여 수행됩니다.ANSI 이스케이프 코드. \033이스케이프 문자(8진수 33 = 27)인 경우 [31;1m텍스트 색상을 31로 설정하고 효과를 1로 설정합니다. [0m효과를 모두 기본값인 0으로 설정합니다. 어떻게 PS1_Inside들어왔는지 주목하세요하나의따옴표( '')는 이 단계에서 변수 대체를 수행하지 않음을 나타냅니다. (나중에 이런 일이 일어날 것입니다.)

진짜 마법은 여기에서 일어납니다.

PS1="\`
         ...
\`"

이는 실행 코드 내에서 PS1을 출력으로 설정합니다 ``.변수 확장은 결과에 관계없이 발생합니다.코드가 실행됩니다프롬프트가 나타날 때마다. 코드 자체는 다음과 같이 실행됩니다.

        retcode=\$? ;

$?이전 명령의 결과를 포함합니다. 0은 정상을 의미하고, 그 밖의 모든 것은 실패 조건을 의미합니다. retcode현재는 내부에 보관되어 있습니다 . 코드가 실행되는 동안 변수에 액세스하고 정의할 때 대체되지 않기를 원하기 때문에 모든 것을 이스케이프해야 합니다.

        if [ 0 -ne \$retcode ]; then

0이 아니면 뭔가 잘못된 것입니다. 따라서 오류에 사용되는 프롬프트 스타일을 반영합니다. 위에서 bad사용한 것은 PS1_Inside색상 PS1_Error을 변경하는 데 사용되며 PS1_Normal색상을 다시 정상으로 변경하는 데 사용됩니다.

                bad=\" [\\\\\\\$?=\$retcode]\"
                echo \"$PS1_Error$PS1_Inside$PS1_Normal\"
        else

이 경우에는 오류가 발생하지 않았으므로 색상을 지정하지 않고 출력만 합니다 PS1_Inside. bad프롬프트에 아무것도 표시되지 않도록 비워 두십시오.

                bad='';
                echo \"$PS1_Inside\";
        fi;

마지막으로 환경이 복잡해지지 않도록 보조 변수의 설정을 해제합니다.

unset PS1_Error PS1_Normal PS1_Inside

관련 정보