2

在我目前的情况下,我连接到几台 UNIX 计算机,根据情况作为几个不同的用户,并遍历机器上的各种目录,这并不罕见。我在整个过程中都使用了 ksh。

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

然而,我遇到的问题是,当我运行我的 .profile 脚本时,它会正确地为目录着色——但每当我切换到另一个目录时它不再动态更新——而且我不知道在我完成所有操作之前是怎么做的分支,即使在切换目录之后,我也能够让它正确打印我当前的工作目录。

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

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

4

5 回答 5

1

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

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

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

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

于 2009-04-27T19:51:23.107 回答
1

我能够在这里挖掘出一个半解决方案:

http://books.google.com/books?id=QYu_v2R6fIQC&pg=PA71&lpg=PA71&dq=korn+dynamic+prompt&source=bl&ots=yMEZiWrGyU&sig=8KBbs12Mtk3eGNSZQiLVmFYZVFY&hl=en&ei=2HX4Sej0K6LWMP2NxresPP72,result1&oi=book#

尽管制定它仍然很困难。

于 2009-04-30T14:41:02.547 回答
1

要在 ksh 中显示当前目录,请将其放入您的 .profile 文件中: export PS1="\$PWD " 当您更改目录时,它将动态更新,而无需使用函数。

于 2010-02-28T03:53:26.667 回答
0

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

有关颜色代码的完整列表以及在ksh 中打印转义序列的详细信息,请参阅Wikipedia 上有关 ANSI 转义码的页面。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 > 

在此处输入图像描述

于 2015-09-18T05:23:48.487 回答
-1

我用这个:

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

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

于 2009-05-01T21:01:41.513 回答