我在 Solaris 上使用 KornShell (ksh),目前我的 PS1 环境变量是:
PS1="${HOSTNAME}:\${PWD} \$ "
并显示提示:
hostname:/full/path/to/current/directory $
但是,我希望它显示:
hostname:directory $
换句话说,如何只显示主机名和当前目录的名称,即
tmp
或 ~
或 public_html
等?
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
$
我喜欢两行提示符,因为有时我的目录名很长,它们会占用很多命令行。如果您想要一行提示,只需省略“ “在最后一个打印语句上:
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 就会执行它。
.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$ "
。虽然不漂亮,但是很管用。
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'$
PS1=`id -un`@`hostname -s`:`print $PWD | sed "s,$(print $HOME),~,"`$' '
in ~/.profile 应该适用于所有版本的 Korn shell,但有一个问题:PS1 变量是在 ksh 上登录时设置的,并且不会使用更改目录 (cd) 命令进行更新。您需要按照以下方式向 ~/.profile 添加一个条目
chdir ()
{
\cd ${*:-$HOME} && PS1=`id -un`@`hostname -s`:`print $PWD | sed "s,$(print $HOME),~,"`$' '
}
alias cd=chdir
cd
要使用 cd 命令更新 PS1(显然,如果通过其他方式更改目录,PS1 将不会更新,并且需要 YA kluge)。
如果您的大部分精力都在两个 shell 之间工作 [ksh 和 bourne sh] 并希望在命令行上显示目录跟踪 那么 PWD 可以很容易地在 ksh 中替换 如果您使用 /usr/xpg4/bin/sh 作为 sh SHELL,它也可以在那里工作