KornShell中的彩色提示


11

根据StackOverflow的这篇文章,在KornShell中可能有一个彩色的提示。我还无法弄清楚该怎么做。我可以使用颜色:

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

给出蓝色的“ Linux”输出,如下所示:

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

但是,当我将转义代码合并到PS1提示变量中时,它们不会被转义。我需要怎么做才能获得彩色提示?除了成为让人眼花something乱的东西之外,我发现在视觉上解析输出时,彩色提示很有用。

Answers:


10

只需使用一个字面的ESC字符,用输入Ctrl- ,vEsc将显示为^[在屏幕上):

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

或使用echo发现有效的命令输出:

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

有时是这样,我才意识到自己还是命令行菜鸟。与朋友相比,我通常感觉很好。:)第一个版本运行良好;真是个绝妙的把戏!我第二版没有成功。+1
Kazark

5

您需要在PS1变量中放入文字转义符。Ksh88以及诸如pdksh和mksh(较旧版本)之类的克隆,除非通过print内置,否则没有控制字符的文字语法。Mksh可以\e进行转义,但是pdksh需要八进制代码\033

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

ATT ksh93引入了转义转义的文字语法$'…'(自R39b起在mksh中也可用)。您可以使用反斜杠转义符将控制字符放入这些文字中。

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

2
实际上,它mksh也支持$'…'–诚然,因为Dave Korn(Korn Shell中的Korn)坚持要我添加它。
mirabilos 2014年

@mirabilos啊,谢谢。我可能在装有mksh R39的计算机上键入了该答案,但未检查较新的版本。
吉尔(Gilles)'所以

2

我将这些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 '

&略有不同shellroot

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 '

在此处输入图片说明

由于特殊字符未复制,因此这是普通用户和root用户的pastebin粘贴


1

人们的答案中发生了几件事,每件事都涉及不同的语法。

  1. 文档中给出了终端程序的转义序列。

  2. 如何在PS1变量中编码终端转义序列,例如\ e或文字转义。这取决于外壳。

  3. 如何在提示中添加更改信息,例如主机名,当前目录等。这也取决于shell。您可以在工作目录中使用特殊的反斜杠序列(例如\ w),或者必须命名环境变量或将命令行嵌入到字符串中。

  4. 如何告诉外壳哪些字符打印而哪些字符不打印。Shell不知道您的终端转义序列在哪里开始和结束。如果外壳程序具有命令行编辑器或类似的程序,则它需要知道打印哪些字符,以便知道光标在哪里。没有此详细信息,您的提示可能看起来正确,但是编辑的行为可能会很奇怪。

    • 在bash中,您将\ [放在每个转义序列之前,并将\]放在之后。

    • 在ksh中,您选择一个非打印ASCII字符,该字符不能出现在字符串的任何其他位置。在字符串的开头,您写了该字符,然后是ASCII回车。然后,您在每个转义序列前后都写相同的字符。z3ntu选择\ a作为标记字符。


0

由于先前的答案和其他来源,我得以提出以下建议:

Korn Shell提示:

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
>

“>”将其保留为“ DOSsy”而不是“ $”的“ nixy”,但是如果您想要标记(“ $”),则为:

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

如果您的登录帐户具有必要的权限,以使“ nixies”永久带有“ export”前缀:

export PS1="..."

并将DOSsy更改为:

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

要么

setx PROMPT "%username%@%computername% $P$_$$"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.