我的 .profile 中有以下代码:
case $TERM in
xterm*)
HOST=`hostname`
PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
;;
*)
PS1='ksh$ '
;;
esac
除非路径太长,否则这种方法效果很好。是否有其他方法可以做类似的事情,但是当路径很长时,它会显示.../<end of the path>
以便它可以工作?
答案1
这里有两种选择,具体取决于您的最终目标。
只显示尾随目录元素
PS1='^[]0;${USER}@${HOST}: ${PWD##*/}^Gksh$ '
这只是将##
参数替换引入到现有的 PS1 中,以便贪婪地删除字符直到最后的正斜杠。PWD
无论长度如何,这都会缩短PS1 提示字符串的部分。
仅缩短长 PWD 字符串
完全公开,我从这个 Stack Overflow 问题的答案之一中得到了这个“骨头”:
如何在 KornShell 中自定义显示提示以显示主机名和当前目录?
...然后进行相应修改。简而言之,它是cd
内部函数的别名。该函数模拟原始cd
行为,但随后进行一些字符串“数学”以确定新的 PS1 提示符。我从字面上理解了你的问题,所以如果你不想在长目录名称前添加“...”前缀,请从该P=...
行中删除该字符串,并删除+3
它上面的数学行中的 。
function _cd {
directory=$1
pattern=$2
# First cd to the directory
if [ "$pattern" ]
then
\cd "$directory" "$pattern"
elif [ "$directory" ]
then
\cd "$directory"
else
\cd
fi
# set this value to taste
MAXLEN=20
LEN=${#PWD}
P=$PWD
# if PWD is "too" long, trim it
if [ $LEN -gt $MAXLEN ]
then
# the 3 is for the literal "..."
START=$(( LEN - MAXLEN + 3 ))
P="..."$(echo $PWD | cut -c ${START}-)
fi
PS1="^[]0;${USER}@${HOST}: $P^Gksh\$ "
}
alias cd="_cd"
当然,当我写这篇文章时,我想到了第三个选项——使用别名/内部函数代码,但不是cut
使用字符串,而是使用##
其中的参数替换来剥离目录元素,如第一个示例中所示。
答案2
我发现的最好方法是在 PS1 环境变量上使用 ksh93 规则函数:
# set ksh prompt and xterm title
_PSX='$( p="${PWD/~(El)${HOME}/\~}"
printf "%s@%s:%s" "${LOGNAME}" "$(hostname -s)" "${p}"
)'
function PS1.get
{
.sh.value="ESC]0;${_PSX}^G${_PSX}$ "
}