如何在KornShell中自定义显示提示来显示主机名和当前目录?

我在Solaris上使用KornShell(ksh),目前我的PS1 env var是:

PS1="${HOSTNAME}:\${PWD} \$ "

提示符显示: hostname:/full/path/to/current/directory $

不过,我希望它显示: hostname:directory $

换句话说,我怎样才能显示主机名和当前目录的名称,即tmp~public_html等等?

从阅读您想要的ksh手册页

 PS1 =“$ {HOSTNAME}:\ $ {PWD ## * /} \ $”

测试SunOS 5.8上的默认ksh

好吧,有点老,有点晚,但这是我在Kornshell中使用的:

 PS1='$(print -n "`logname`@`hostname`:";if [[ "${PWD#$HOME}" != "$PWD" ]] then; print -n "~${PWD#$HOME}"; else; print -n "$PWD";fi;print "\n$ ")' 

这会在BASH中提示相当于PS1="\u@\h:\w\n$ "

例如:

 qazwart@mybook:~ $ cd bin qazwart@mybook:~/bin $ cd /usr/local/bin qazwart@mybook:/usr/local/bin $ 

我喜欢两行提示,因为我有时候会有很长的目录名,而且会占用很多的命令行。 如果你想要一行提示,只要放弃最后一个打印语句中的“\ n”:

 PS1='$(print -n "`logname`@`hostname`:";if [[ "${PWD#$HOME}" != "$PWD" ]] then; print -n "~${PWD#$HOME}"; else; print -n "$PWD";fi;print "$ ")' 

这相当于BASH中的PS1="\u@\h:\w$ "

 qazwart@mybook:~$ cd bin qazwart@mybook:~/bin$ cd /usr/local/bin qazwart@mybook:/usr/local/bin$ 

这不像设置BASH提示那样简单,但是你明白了。 只需为PS1编写一个脚本,Kornshell将执行它。


对于Solaris和其他版本的Kornshell

我发现以上在Solaris上不起作用。 相反,你必须做到这一点真正的黑客方式…

  • .profile ,确保ENV="$HOME/.kshrc"; export ENV ENV="$HOME/.kshrc"; export ENV设置。 这可能是为你正确设置的。

  • 在你的.kshrc文件中,你会做两件事

    1. 您将定义一个名为_cd的函数。 这个函数会改变到指定的目录,然后根据你的pwd设置你的PS1变量。
    2. 您将设置一个别名cd来运行_cd功能。

这是.kshrc文件的相关部分:

 function _cd { logname=$(logname) #Or however you can set the login name machine=$(hostname) #Or however you set your host name $directory = $1 $pattern = $2 #For "cd foo bar" # # First cd to the directory # We can use "\cd" to evoke the non-alias original version of the cd command # if [ "$pattern" ] then \cd "$directory" "$pattern" elif [ "$directory" ] then \cd "$directory" else \cd fi # # Now that we're in the directory, let's set our prompt # $directory=$PWD shortname=${directory#$HOME} #Possible Subdir of $HOME if [ "$shortName" = "" ] #This is the HOME directory then prompt="~$logname" # Or maybe just "~". Your choice elif [ "$shortName" = "$directory" ] #Not a subdir of $HOME then prompt="$directory" else prompt="~$shortName" fi PS1="$logname@$hostname:$prompt$ " #You put it together the way you like } alias cd="_cd" 

这会将您的提示设置为等同的BASH PS1="\u@\h:\w$ " 。 这不是漂亮,但它的作品。

ENV =〜/ .kshrc,然后在你的.kshrc中:

 function _cd { \cd "$@" PS1=$( print -n "$LOGNAME@$HOSTNAME:" if [[ "${PWD#$HOME}" != "$PWD" ]]; then print -n "~${PWD#$HOME}" else print -n "$PWD" fi print "$ " ) } alias cd=_cd cd "$PWD" 

布拉德

 HOST=`hostname` PS1='$(print -n "[${USER}@${HOST%%.*} ";[[ "$HOME" == "$PWD" ]] && print -n "~" ||([[ "${PWD##*/}" == "" ]] && print -n "/" || print -n "${PWD##*/}");print "]$")' 
 PS1=`id -un`@`hostname -s`:'$PWD'$ 

和…

如果你在大部分工作[ksh和bourne sh]的两个shell之间工作,并希望在你的命令行上显示一个目录跟踪显示,那么PWD可以用ksh轻松替换,如果你使用/ usr / xpg4 / bin / sh外壳,它也会在那里工作

尝试这个:

 PS1="\H:\W" 

更多的信息: 如何:更改/安装bash自定义提示 ,我知道你说的ksh,但我很确定它会工作。