在ksh中着色目录名称

时间:2009-04-27 19:31:02

标签: ksh prompt

在我目前的情况下,我连接几台UNIX计算机,根据具体情况选择几个不同的用户,并遍历机器上的各种目录,这并不罕见。我通过整个事情使用ksh。

我最近摆弄了我的提示,我能够根据我当前的用户名和当前服务器来改变一些颜色。但是,我还想要它根据我当前的目录更改颜色。例如,如果我在目录“foo”中,则提示符应为黄色,但如果我在目录“bar”中,则提示符为洋红色。在这两种情况下,子目录也应该计数,因此一个简单的子字符串检查就足够了。

然而,我遇到的问题是,当我运行我的.profile脚本时,它正确地为目录着色 - 但每当我切换到另一个目录时它就不再动态更新 - 而且我不确定之前是怎样的我完成了所有的分支,即使在我切换目录之后,我也可以正确地打印我当前的工作目录。

我做了一些谷歌搜索,并找到了bash的信息,但ksh似乎在很大程度上被忽略了。由于我无法弄清楚如何独立完成,我必须将它带到Stack Overflow社区,将其添加到未来的知识中。因此,根据我冗长的解释,我的问题的“快速版本”如下:

在ksh中,如何设置我的提示以显示当前工作目录并根据当前工作目录的位置为文本着色?它甚至可能吗?

5 个答案:

答案 0 :(得分:1)

为什么不使用zsh?它基于ksh,而且功能更强大。在zsh中,您可以编写每次更改目录时隐式调用的chpwd函数。在此功能中,您可以检查当前目录并将PS1设置为您想要的任何内容。

或者(即使在ksh中),您可以为cd命令创建别名:

change_my_ps() {
  PS1=...
}
better_cd() {
  builtin cd "$@"
  change_my_ps
}
alias cd=better_cd

像这样的东西。我不确定它是否正确,我不记得ksh语法。

答案 1 :(得分:1)

答案 2 :(得分:1)

要在ksh中显示当前目录,请将其放在.profile文件中: 导出PS1 =“\ $ PWD” 当您更改目录时,它将动态更新,而不会乱用函数。

答案 3 :(得分:0)

由于没有人真正回答有关颜色的部分,所以我可以这样做。我无法为文字上色,所以我还附上了终端的屏幕截图。

有关颜色代码的完整列表,请参阅Wikipedia's page on ANSI escape codes,有关在ksh中打印转义序列的详细信息,请参阅print --manprintf --man

(请注意,目前处于测试阶段的ksh93v将包含一个基于(我认为)bash的快速语言,这将使这种事情变得更容易,但我认为你可能仍然需要使用类似这个函数的东西来做这样的复杂条件提示。)

> cat ~/scripts/prompt    
function prompt
{
    set -eu
    typeset c=
    case $PWD in
        */foo) c=3;; # yellow
        */bar) c=5;; # magenta
    esac
    print "\E[3${c}m$PWD\E[m > "
}
PS1='`prompt`'
> . ~/scripts/prompt
/Users/adavies > cd foo  
/Users/adavies/foo > cd ../bar
/Users/adavies/bar > 

enter image description here

答案 4 :(得分:-1)

我用这个:

function chdir
{
   cd "$@"
   CWDH=${PWD%/*}
   PS1="($_time)$hname:${CWDH##*/}/${PWD##*/} ->"
   export PS1
}
alias cd=chdir
chdir .

忽略时间和hname,但其余的应该适合你。改变颜色将取决于终端。您需要知道将要使用的终端的每种颜色的转义码。如果你知道你只使用过xterm,那就更容易了。