如何在 bash 或 ksh93 中生成类似于 tcsh 的 PS1 提示符

如何在 bash 或 ksh93 中生成类似于 tcsh 的 PS1 提示符

在 tcsh 中,我有默认值:

prompt  [%m:%c3] %n%# 

它给出如下提示:

[woehler:hacking/c/hello] ajcarr% 

[woehler:~] ajcarr% 

换句话说,当前目录以及路径中其上方的下两个目录。

在 ksh93 或 bash 中,替换$HOMEby~很容易,就像提取当前目录的名称一样,但我还没有找到复制%c3tcsh 行为的方法。目前在 ksh93 中我有:

[ajcarr@Woehler] hello $ 

[ajcarr@Woehler] ~ $ 

有人对如何执行此操作有任何建议吗?

答案1

ksh93:

PS1='${PWD#${PWD%?/*/*/*}?/} \$ '
share/doc/libnl-3-dev $ _

PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _

如果你希望它也替换$HOME~,则需要一些更糟糕的东西:

PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _

PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[host:w/maemo/sb2-pathmaps] user% _

所有这一切也应该适用于bash,尽管bash有自己的提示转义(例如\hfor ${HOSTNAME%%.*})和路径缩短机制(with PROMPT_DIRTRIM)。

另外,更糟糕的变体将非常令人讨厌,因为bash与 不同的是ksh93,每个命令替换都会有fork()一个单独的过程$(...; printf ...),即使它只包含内置命令。这也适用于pdksh派生 shell,例如mksh.


zsh提示转义与以下非常相似但不完全相同tcsh

zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _

笔记:

默认情况下,该$HOSTNAME变量未设置ksh93;您可以使用内置函数来代替它uname(使用 启用它后PATH=/opt/ast/bin:$PATH/opt/ast/bin路径不需要存在):

PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '

\h与 bash 中的转义或%mescape inzshtcshthis不同将要跟踪主机名更改。

答案2

对于bash,你可以实现相似的结果通过设置PROMPT_DIRTRIM多变的:

$ PS1='[\u@\h] \w\$ '
[schaller@r2d2] ~$ pwd
/home/schaller
[schaller@r2d2] ~$ PROMPT_DIRTRIM=3
[schaller@r2d2] ~$ cd /home/schaller/tmp/513924/another/directory/here
[schaller@r2d2] ~/.../another/directory/here$

相关内容