作業ディレクトリへの短いパスを表示するようにKornプロンプトを変更します。

作業ディレクトリへの短いパスを表示するようにKornプロンプトを変更します。

.kshrc次のプロンプトを表示するように変更しました。コマンド番号は511 /export/home/students/cninja $どこにあり、現在の作業ディレクトリはどこにありますか?511../students/cninja

作業ディレクトリの短縮バージョンを表示してから、プロンプトに次の内容が表示されることは可能ですか?511 ~/cninja $それとも511 ../students/cninja $何がありますか?

私の行は次のとおりです.kshrc

PS1=' ! $PWD $'; export PS1


修正する:私のシェルがksh88なのかksh93なのかわかりません。ほとんどのecho *what have you*コマンドは空の候補を返し、シェルとecho ${.sh.version}バックからプロンプトを表示します/bin/ksh: ${.sh.version}: bad substitution

答え1

kshのいくつかの実装があります:

  • David Kornの元のバージョン(またはAT&T)には2つの主要なバリエーション(ksh88とksh93)があり、それぞれ異なるビルドと機能セットがあります。
  • pdksh(パブリックドメインKornシェル)といくつかの派生物。
  • zsh。 Zshには、呼び出されたときに有効になるkshエミュレーションモードがありますksh

zshをkshとして使用することも、インタラクティブシェルとしてより強力なツールであるzshに完全に切り替えることもできます。

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"}$ '

ksh(これはDebianのksh93u +、Solarisのksh88i、DebianのMirBSD ksh 40.9.20120630(pdksh派生)、およびDebianのzsh 4.3.17(呼び出し時)で動作することを確認しました。kshは機能しません)

アイデアは、$PWDそれが始まると空であるので空であるので、$HOME私たちが得るものです。しかし、そうでない場合はis、isなので、配列に要素が1つしかないので、私たちが得るのは空の配列です。${PWD##"$HOME"*}${one#1}${tilde[0]}$tilde${PWD##"$HOME"*}$PWD${one#${PWD}1}$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

関連情報