我正在Solaris上使用KornShell(ksh),目前我的PS1环境变量是:
PS1="${HOSTNAME}:\\\${PWD##*/} \$ "
这样提示符将显示:hostname:directory $
换句话说,我想要显示主机名和当前目录的名称,例如tmp
或~
或public_html
等等。以上代码中使用了一些特殊字符来达到此效果。
我正在Solaris上使用KornShell(ksh),目前我的PS1环境变量是:
PS1="${HOSTNAME}:\\\${PWD##*/} \$ "
这样提示符将显示:hostname:directory $
换句话说,我想要显示主机名和当前目录的名称,例如tmp
或~
或public_html
等等。以上代码中使用了一些特殊字符来达到此效果。
好的,虽然有点老,而且有点晚了,但这是我在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
$
我喜欢使用两行提示符,因为有时我的目录名非常长,它们会占用很多命令行空间。如果你想要一个单行提示符,只需在最后一个print语句中省略"\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$
设置Kornshell提示符不像设置BASH提示符那样简单,但你可以从中得到灵感。只需编写一个 PS1
脚本,Kornshell 就会执行它。
我发现上述方法在 Solaris 上不起作用。相反,您将不得不使用真正的 hackish 方法...
在您的.profile
文件中,请确保设置了ENV="$HOME/.kshrc"; export ENV
。这个很可能已经为您设置好了。
在您的.kshrc
文件中,您需要做两件事:
_cd
的函数。此函数将切换到指定的目录,然后根据当前工作目录设置您的 PS1 变量。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$ "
。它并不漂亮,但它能用。
logname
@hostname
:"; [[ "${PWD#$HOME}" != "$PWD" ]] && print -n "~${PWD#$HOME}" || print -n "$PWD";print "\n$ ")' - user1708042在你的 .kshrc 文件中,将环境变量设置为 ENV=~/.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'$
如果你在两个shell之间工作,主要使用ksh和bourne sh,并且希望在命令行上显示目录跟踪,则可以在ksh中轻松替换PWD,如果你使用/usr/xpg4/bin/sh作为你的sh SHELL,那么它也可以在那里使用。