Bash
PS1中的彩色路徑
我正在嘗試以顏色顯示路徑,但我對此有疑問。
我有一些恆定的路徑 - 在變數 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)\] ] "