在 tcsh 中,我有默认值:
prompt [%m:%c3] %n%#
它给出如下提示:
[woehler:hacking/c/hello] ajcarr%
和
[woehler:~] ajcarr%
换句话说,当前目录以及路径中其上方的下两个目录。
在 ksh93 或 bash 中,替换$HOME
by~
很容易,就像提取当前目录的名称一样,但我还没有找到复制%c3
tcsh 行为的方法。目前在 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
有自己的提示转义(例如\h
for ${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 中的转义或%m
escape inzsh
或tcsh
this不同将要跟踪主机名更改。
答案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$