KornShell의 컬러 프롬프트 수 없었다.

이 StackOverflow post 에 따르면 KornShell에 컬러 프롬프트가있을 수 있습니다. 나는 이것을하는 방법을 알아낼 수 없었다. 나는 색상을 사용할 수 있습니다 :

echo -e "\033[34mLinux\033[00m"

다음과 같이 파란색 “Linux”출력을 제공합니다.

printf "\033[34mLinux\033[00m"

그러나 이스케이프 코드를 PS1프롬프트 변수에 통합하면 이스케이프 되지 않습니다. 컬러 프롬프트를 표시하려면 어떻게해야합니까? eyecandy의 빠는 것 외에도 출력을 시각적으로 파싱 할 때 컬러 프롬프트가 유용하다는 것을 알았습니다.



답변

그냥으로 입력 한 문자 Esc 키를 문자를 사용 Ctrlv, Esc(로 표시됩니다 ^[: 화면)

PS1="^[[34mLinux^[[00m"

또는 echo찾은 명령 의 출력을 사용하십시오 .

PS1="$(echo -e "\033[35mLinux\033[00m")"

답변

PS1변수 에 리터럴 이스케이프 문자를 넣어야 합니다. pshsh 및 mksh (이전 버전)와 같은 Ksh88 및 클론에는 print내장을 통한 제어 문자에 대한 리터럴 구문이 없습니다 . Mksh \e는 이스케이프를 이해 하지만 pdksh에는 8 진 코드가 필요합니다 \033.

PS1=$(print '\033[34mLinux\033[00m')

ATT ksh93은 백래시 이스케이프 처리 된 리터럴 구문을 소개합니다 $'…'(R39b 이후 mksh에서도 사용 가능). 백 슬래시 이스케이프를 사용하여 이러한 리터럴에 제어 문자를 넣을 수 있습니다.

PS1=$'\e[34mLinux\e[00m'

답변

나는 mksh이것을 사용자에게 사용합니다 shell:

# custom prompt see http://comments.gmane.org/gmane.os.miros.mksh/126
PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^ | \a\e[36m\a${USER:=$(ulimit -c 0; id -un 2>/dev/null || echo
\?)}@${HOSTNAME%%.*}\a\e[34m\a | ^ ^  ^ ^ | \a\e[0;33m\a$(local d=${PWD:-?} p=~; [[ $p = ?(*/) ]] || d=${d/#$p/~};
print -nr -- "$d")\a\e[1;34m\a |\n ^ ^  ^ ^ | \a\e[32m\a$(date +%H:%M)\a\e[34m\a | ^ ^ >>\a\e[0m\a '

& 약간 다른 shell위해 root:

PS1=$'\a\r\a\e[1;34m\a ^ ^  ^ ^  ^   \a\e[31m\a${USER:=$(ulimit -c 0; \
    id -un 2>/dev/null || echo \?)}@${HOSTNAME%%.*}\a\e[34m\a  ^ ^  ^ ^  ^ ^  ^   \a\e[0;33m\a$(
        local d=${PWD:-?} p=~
        [[ $p = ?(*/) ]] || d=${d/#$p/~}
        print -nr -- "$d"
)\a\e[1;34m\a  ^ ^ \n ^ ^  ^ ^  ^   \a\e[32m\a$(date +%H:%M)\a\e[34m\a  ^ ^  ^ ^   \a\e[0m\a '

특수 문자는 복사하지 않았으므로 일반 사용자와 루트 모두를위한 pastebin paste 가 있습니다.


답변

사람들의 대답에는 여러 가지 일이 있으며, 각각 다른 구문을 사용합니다.

  1. 문서에 제공된 터미널 프로그램의 이스케이프 시퀀스

  2. PS1 변수에서 터미널 이스케이프 시퀀스를 인코딩하는 방법 (예 : \ e 또는 리터럴 이스케이프) 이것은 껍질에 달려 있습니다.

  3. 프롬프트에 변경 정보를 추가하는 방법 (예 : 호스트 이름, 현재 디렉토리 등) 셸에 따라 다릅니다. 작업 디렉토리에 \ w와 같은 특수 백 슬래시 시퀀스를 사용하거나 환경 변수의 이름을 지정하거나 명령 행을 문자열에 임베드해야 할 수 있습니다.

  4. 쉘에 어떤 문자가 인쇄되고 어떤 문자가 인쇄되지 않는지를 알려주는 방법. 쉘은 터미널 이스케이프 시퀀스가 ​​시작하고 끝나는 곳을 알지 못합니다. 쉘에 명령 행 편집기 또는 이와 유사한 것이 있으면, 커서가 어디에 있는지 알 수 있도록 인쇄 할 문자를 알아야합니다. 이 세부 정보가 없으면 프롬프트가 제대로 보이지만 편집이 이상하게 작동 할 수 있습니다.

    • bash에서는 각 이스케이프 시퀀스 앞에 \ [를 넣고 그 뒤에 \]를 넣습니다.

    • ksh에서는 문자열의 다른 곳에서는 발생할 수없는 단일 비 인쇄 ASCII 문자를 선택합니다. 문자열의 시작 부분에 해당 문자를 쓰고 ASCII 캐리지 리턴이옵니다. 그런 다음 각 이스케이프 시퀀스 전후에 동일한 문자를 씁니다. z3ntu는 \ a를 마커 문자로 선택했습니다.


답변

이전 답변과 다른 출처 덕분에 다음을 수행 할 수있었습니다.

Korn 쉘 프롬프트 :

PS1="$(echo "\033[32m`logname`\033[35m@\033[32m`hostname` \033[33m`pwd`\033[36m\n\$\033[0m")"

배쉬 프롬프트 :

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

이것들은 같은 형식의 프롬프트를 제공합니다 (예, 여왕의 영어를 구사합니다;)) :

username@computername /current/working/directory
$

DOS에 해당하는 색상 옵션은 없지만 다음과 같습니다.

prompt %username%@%computername% $P$_$G

이것은 다음을 제공합니다.

username@computername /current/working/directory
>

“>”는 “$”를 사용하여 ‘nixy’가 아닌 ‘DOSsy’를 유지하지만, 대신시길 ( “$”)을 원하면 다음과 같습니다.

prompt %username%@%computername% $P$_$$

로그인 계정에 필요한 권한이 있으면 ‘수출’으로 ‘nixies’를 영구적으로 추가 할 수 있습니다.

export PS1="..."

DOSsy를 다음과 같이 변경하십시오.

setx PROMPT "%username%@%computername% $P$_$G"

또는

setx PROMPT "%username%@%computername% $P$_$$"