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 中,$HOME
by的替换~
很容易,就像提取当前目录的名称一样,但我还没有找到一种方法来复制%c3
tcsh的行为。目前在 ksh93 我有:
[ajcarr@Woehler] hello $
Run Code Online (Sandbox Code Playgroud)
和
[ajcarr@Woehler] ~ $
Run Code Online (Sandbox Code Playgroud)
有没有人对如何做到这一点有任何建议?
在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
有自己的提示转义(例如\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% _
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
的逃生zsh
或tcsh
本会跟踪主机名变化。
对于 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)