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

Alu*_*arr 7 bash prompt ksh tcsh

在 tcsh 中,我有默认值:

prompt  [%m:%c3] %n%# 
Run Code Online (Sandbox Code Playgroud)

这给出了如下提示:

[woehler:hacking/c/hello] ajcarr% 
Run Code Online (Sandbox Code Playgroud)

[woehler:~] ajcarr% 
Run Code Online (Sandbox Code Playgroud)

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

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

[ajcarr@Woehler] hello $ 
Run Code Online (Sandbox Code Playgroud)

[ajcarr@Woehler] ~ $ 
Run Code Online (Sandbox Code Playgroud)

有没有人对如何做到这一点有任何建议?

mos*_*svy 8

ksh93

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

PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _
Run Code Online (Sandbox Code Playgroud)

如果您希望它也替换$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% _
Run Code Online (Sandbox Code Playgroud)

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

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


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

zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _
Run Code Online (Sandbox Code Playgroud)

笔记:

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

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

不像\h在bash或逃生%m的逃生zshtcsh跟踪主机名变化。


Jef*_*ler 6

对于 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$
Run Code Online (Sandbox Code Playgroud)