내 .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 문자열만 단축하세요.
전체 공개, 나는 이 스택 오버플로 질문에 대한 답변 중 하나에서 이 "본"을 얻었습니다.
호스트 이름과 현재 디렉터리를 표시하도록 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}$ "
}