更改 Korn 提示以显示工作目录的较短路径

更改 Korn 提示以显示工作目录的较短路径

我已更改.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

相关内容