我已更改.kshrc
为显示提示符,如下所示:
511 /export/home/students/cninja $
其中511
是命令号,../students/cninja
是当前工作目录。
是否可以显示工作目录的缩短版本,然后提示符显示类似以下内容:511 ~/cninja $
或者511 ../students/cninja $
或者您有什么?
这就是我的行的样子.kshrc
:
PS1=' ! $PWD $'; export PS1
更新:我无法确定我的 shell 是 ksh88 还是 ksh93。大多数echo *what have you*
命令都会从 shell 中返回空白的目光和提示,并echo ${.sh.version}
返回/bin/ksh: ${.sh.version}: bad substitution
。
答案1
ksh 存在几种实现:
- David Korn 的原始版本(或 AT&T)有两个主要变体(ksh88 和 ksh93),每个变体都有不同的版本和不同的功能集
pdksh
(公共领域的 Korn shell)以及一些衍生品。zsh
。 Zsh 有一个 ksh 模拟模式,当调用为 时会激活该模式ksh
。
您可能想使用 zsh 作为 ksh,甚至完全切换到 zsh,这是一个作为交互式 shell 更强大的工具。
如果您将 zsh 称为ksh
.您可以通过执行以下操作来获得所需的提示扩展(将其添加到您的$ENV
文件中):
setopt PROMPT_PERCENT # restore zsh prompt expansion disabled by the ksh mode
PS1='%! %~$ '
否则,如果您确实需要坚持使用 AT&T 或 PD 的,您可以将其近似为:
PS1='! $(pwd | sed "s,^$HOME,~,")$ '
这适用于~
但不适用于~other-user
.
例子:
$ echo ${.sh.version}
Version JM 93u+ 2012-02-29
$ PS1='! $(pwd | sed "s,^$HOME,~,")$ '
85 ~$ cd /tmp
86 /tmp$ cd
87 ~$
根据几十年前的模糊记忆,ksh88 可能不会在$PS1
.在这种情况下,你仍然可以使用一些技巧,例如:
one=1
tilde='~'
PS1='! ${tilde[0${one#${PWD##"$HOME"*}1}]}${PWD#"$HOME"}$ '
(我现在已经验证它适用于 Debian 上的 ksh93u+、Solaris 上的 ksh88i、Debian 上的 MirBSD ksh 40.9.20120630(pdksh 衍生品)和 Debian 上的 zsh 4.3.17(当称为 时ksh
),所以我会感到惊讶如果有任何 ksh 不起作用)
这个想法是,如果$PWD
以 开头$HOME
,那么${PWD##"$HOME"*}
是空的,所以${one#1}
是空的,所以我们得到${tilde[0]}
的是$tilde
。但如果不是,那么${PWD##"$HOME"*}
is $PWD
,那么${one#${PWD}1}
is $one
,所以我们得到的${tilde[1]}
是 空数组,因为$tilde
数组只有一个元素。
答案2
我认为以下内容可行,但事实证明这是一个特定于 bash 的解决方案。留下这个答案仅供参考。
export PS1=' ! $( basename $PWD )'
也许它需要后台而不是$( )
构造。
答案3
使用 Korn Shell“纪律函数”(基本上是 getter/setter)将路径转换为您想要的形式:
function RELATIVE_PWD.get {
if [ "${PWD:0:${#HOME}}" = "$HOME" ]
then
.sh.value="~${PWD:${#HOME}}"
else
.sh.value="$PWD"
fi
}
PS1='! ${RELATIVE_PWD} \$ '
在 ksh93 上测试。不确定它是否适用于 ksh88。
答案4
UserLoc=$(for user_loc in $(egrep -v "root|shutdown|halt|nologin" /etc/passwd | awk -F: '{print $1}' ); do echo -e "$user_loc"; done | grep $USER)
# User shell
MYSHELL=$(echo $SHELL | awk -F/ '{print $NF}')
if [ "$MYSHELL" == "bash" ] ; then
Default=$(echo -e "\e[00m")
Black=$(echo -e "\e[30m")
Red=$(echo -e "\e[31m")
Green=$(echo -e "\e[32m")
Orange=$(echo -e "\e[33m")
Blue=$(echo -e "\e[34m")
Magenta=$(echo -e "\e[35m")
Cyan=$(echo -e "\e[36m")
White=$(echo -e "\e[37m")
Def=$(echo -e "\e[0;0m")
Bold=$(echo -e "\e[1m")
Under=$(echo -e "\e[4m")
Normal=$(tput sgr0)
PrtF="$"
PS1='[${Color}${USER}${Default}@${Hostname}] \W ${PrtF} '
elif [ "$MYSHELL" == "ksh" ] ; then
esc="\033["
Default=$(echo -e "${esc}00m")
Black=$(echo -e "${esc}30m")
Red=$(echo -e "${esc}31m")
Green=$(echo -e "${esc}32m")
Orange=$(echo -e "${esc}33m")
Blue=$(echo -e "${esc}34m")
Magenta=$(echo -e "${esc}35m")
Cyan=$(echo -e "${esc}36m")
White=$(echo -e "${esc}37m")
Def=$(echo -e "${esc}0m")
Bold=$(echo -e "${esc}1m")
Under=$(echo -e "${esc}4m")
PrtF="$"
PS1='[${Color}${USER}${Default}@${Hostname}] $(if [ "${PWD#$HOME}" != "$PWD" ];then print "~${PWD#$HOME}"; else print "$(basename $PWD)"; fi) ${PrtF} '
else
PS1="[\u@\h] \w \\$ "
fi
# Color for login's user
# if root or admin user => Red
if [ "$EUID" -eq 0 ] ; then
Color=${Red}${bold}
PrtF="#"
# if user local => Cyan
elif [ "$UserLoc" == "$USER" ] ; then
Color=${Cyan}${bold}
# if standard user (AD or LDAP) => green
else
Color=${Green}${bold}
fi
export PS1