긴 경로로 Xterm의 제목 설정

긴 경로로 Xterm의 제목 설정

내 .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}$ " 
}

관련 정보