Ksh

使用長路徑為 Xterm 設置標題

  • June 16, 2016

我的 .profile 中有以下程式碼:

case $TERM in
   xterm*)
       HOST=`hostname`
       PS1='^[]0;${USER}@${HOST}: ${PWD}^Gksh$ '
       ;;
   *)
       PS1='ksh$ '
       ;;
esac

這很好用,除非路徑太長。是否有另一種方法可以做類似的事情,但是當路徑很長時,它會顯示.../<end of the path>以便它工作?

這裡有兩種選擇,具體取決於您的最終目標。

僅顯示尾隨目錄元素

PS1='^[]0;${USER}@${HOST}: ${PWD##*/}^Gksh$ '

這只是將##參數替換引入您現有的 PS1,以便貪婪地去除字元,直到最後的正斜杠。無論長度如何,這都會縮短PWDPS1 提示字元串的部分。

只縮短長 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使用字元串,而是使用其中的##參數替換來剝離目錄元素,如第一個範例所示。

引用自:https://unix.stackexchange.com/questions/216469