.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