私の.profileには次のコードがあります。
case $TERM in
xterm*)
HOST=`hostname`
PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
;;
*)
PS1='ksh$ '
;;
esac
この方法は、パスが長すぎない限りうまく機能します。同様の操作を実行しますが、.../<end of the path>
パスが長いときに機能するようにマークする他の方法はありますか?
答え1
これには、最終目標に応じて2つのオプションがあります。
末尾のディレクトリ要素のみを表示
PS1='^[]0;${USER}@${HOST}: ${PWD##*/}^Gksh$ '
これは単純に##
既存のPS1にパラメータ置換を導入し、最後のスラッシュまで文字を貪欲に削除します。PWD
これにより、長さに関係なくPS1プロンプト文字列の一部が短縮されます。
長いPWD文字列のみを短くしてください。
完全に公開された、私はこのスタックオーバーフローの質問に対する答えの1つからこの「本」を得ました。
ホスト名と現在のディレクトリを表示するように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"
もちろん、この記事を書くとき、私は3番目のオプションを念頭に置いていました。つまり、エイリアス/組み込み関数コードを使用しますが、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}$ "
}