Bash

PS1中的彩色路徑

  • July 13, 2017

我正在嘗試以顏色顯示路徑,但我對此有疑問。

我有一些恆定的路徑 - 在變數 MyPath 中。我想在 PS1 中創建彩色路徑,但如果 pwd 顯示的路徑與我的路徑不同(但包括 MyPath),那麼其餘的我想以不同的顏色列印(斜線為不同的顏色)。

我寫了一些程式碼,但我不知道將其應用於 PS1。

它應該是這樣的:

[ root@192.168.1.199:/ -> /media/user/folder/ ]
# : cd /var/www/html
[ root@192.168.1.199:/ -> /var/www/html/ ] (blue slash and green dir names)
# : cd applications
[ root@192.168.1.199:/ -> /var/www/html/applications/ ] (blue slash and green dir names but last 2 slashes in green color and last dir "application" in red color)
# : cd tmp
[ root@192.168.1.199:/ -> /var/www/html/applications/tmp/ ] (blue slash and green dir names but last 3 slashes in green color and 2 last dirs "application" and "tmp" in red color)

我被卡住了——我不知道該怎麼做。

我的程式碼:

#!/bin/bash
MyPath="/var/www/html"
MyPathLength=$( echo ${MyPath} | wc -m)
CurrentPath="/var/www/html/functions/design"
slashColor="\[$(tput setaf 6)\]/\[$(tput sgr0)\]"
dirColor="\[$(tput setaf 2)\]"
path="";
FinalPath="";

for w in $(echo ${CurrentPath} | tr "/" " "); 
do 
 path="${path}/${w}";
 pathLength=$( echo ${path} | wc -m)

 if [ "${pathLength}" == "${MyPathLength}" ];
 then 
      FinalPath="${FinalPath}\[$(tput setaf 6)\]/\[$(tput sgr0)\]\[$(tput setaf 2)\]$w\[$(tput sgr0)\]\[$(tput setaf 6)\]/\[$(tput sgr0)\]";
 elif [ "${pathLength}" -lt "${MyPathLength}" ];
      then
           FinalPath="${FinalPath}\[$(tput setaf 6)\]/\[$(tput sgr0)\]\[$(tput setaf 2)\]$w\[$(tput sgr0)\]";
      elif [ "${pathLength}" -gt "${MyPathLength}" ];
           then
                FinalPath="${FinalPath}\[$(tput setaf 1)\]$w\[$(tput sgr0)\]\[$(tput setaf 2)\]/\[$(tput sgr0)\]";
           fi;
done

echo "PS1=\"${FinalPath}\"" > /home/bashrc_split
cd "/";
(
bash --rcfile /home/bashrc_split # I want to open new shell with new PS1
)

有什麼幫助嗎?

我會在 .bashrc 中放置類似於以下程式碼的內容,而無需在每次按下輸入鍵時打開和寫入其他文件

SEP=("/" "/")
SEP_COLOR=("\e[0;34m" "\e[0;32m")     #colors for: (FIXED - DEFAULT) SEPARATOR STRING
DIR_COLOR=("\e[0;32m" "\e[0;31m")     #colors for: (FIXED - DEFAULT) DIR NAMES
CLOSE_COLOR="\e[0m"

FIXED_DIR=" /var/www/html"
FIXED_DIR=$(realpath ${FIXED_DIR})
FIXED_DIR_ARRAY=()

DIR=${FIXED_DIR}
while [[ "$DIR" != "/" ]]; do
   B=$(basename  -z $DIR)
   DIR=$(dirname -z $DIR) 
   FIXED_DIR_ARRAY+=($B)
done

set_PS1 (){
   local DIR=$PWD
   local CUR_DIR_ARRAY=()

while : ; do
   local B=$(basename  -z $DIR)
   local DIR=$(dirname -z $DIR) 
   CUR_DIR_ARRAY+=($B)
   [[ "$DIR" == "/" ]] && break
done
local SELECTOR=0
local STR=""

local i=1 
while [[ "$i" -le "${#CUR_DIR_ARRAY[@]}" ]] ; do 
   if [ -n $SELECTOR ] &&
      [ $i -gt ${#FIXED_DIR_ARRAY[@]} ] ||
      [ "${CUR_DIR_ARRAY[-$i]}" != "${FIXED_DIR_ARRAY[-$i]}" ];
   then
       SELECTOR=1
   fi  
   local x=$(($SELECTOR%2));
   STR+="${SEP_COLOR[$x]}${SEP[$x]}"
   [[ "${CUR_DIR_ARRAY[-$i]}" != "${SEP[$x]}" ]] &&  STR+="${DIR_COLOR[$x]}${CUR_DIR_ARRAY[-$i]}"
   STR+="${CLOSE_COLOR}"
   ((i++))
done
   printf "${STR}"

}

PS1="[ \u@\h:/ -> \[\$(set_PS1)\] ] "

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