경로를 컬러로 표시하려고 하는데 문제가 발생했습니다.
MyPath 변수에 변경되지 않는 일부 경로가 있습니다. PS1에서 컬러 경로를 만들고 싶지만 pwd가 내 경로(MyPath 포함)와 다른 경로를 표시하면 나머지 경로를 다른 색상(다른 색상의 슬래시 사용)으로 인쇄하려고 합니다.
코드를 좀 작성했는데 PS1에 적용할 수 있을지 모르겠네요.
다음과 같아야 합니다.
[ [email protected]:/ -> /media/user/folder/ ]
# : cd /var/www/html
[ [email protected]:/ -> /var/www/html/ ] (blue slash and green dir names)
# : cd applications
[ [email protected]:/ -> /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
[ [email protected]:/ -> /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
)
도움이 필요하세요?
답변1
Enter 키를 누를 때마다 다른 파일을 열고 작성하는 대신 .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)\] ] "
답변2
현재는 잘 작동하지만 다시 작성해야 합니다. 누군가 /var/www/html/next_dir/로 이동하면 next_dir은 녹색이고 var www와 html은 빨간색입니다. :)
서브쉘.sh:
cd "/var/www/html";
(
bash --rcfile /home/username/bashrc_mount;
)
bashrc_mount:
#!/bin/bash
function UpdatePath()
{
MyPath="$1";
MyPathLength=$( echo ${MyPath} | wc -m);
CurrentPath="`pwd`";
if [ $( echo ${CurrentPath} | grep "${MyPath}" | wc -l) == "0" ];
then
$(cd ${MyPath}"/"); # this doesn't work in subshell - I don't know why... :(
fi;
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 3)/$(tput sgr0)$(tput setaf 1)$w$(tput sgr0)$(tput setaf 4)/$(tput sgr0)";
elif [ "${pathLength}" -lt "${MyPathLength}" ];
then
FinalPath="${FinalPath}$(tput setaf 3)/$(tput sgr0)$(tput setaf 1)$w$(tput sgr0)";
elif [ "${pathLength}" -gt "${MyPathLength}" ];
then
FinalPath="${FinalPath}$(tput setaf 2)$w$(tput sgr0)$(tput setaf 4)/$(tput sgr0)";
fi;
done
if [ "${CurrentPath}" == "/" ];
then
FinalPath="$(tput setaf 3)/$(tput sgr0)";
fi;
echo "${FinalPath}";
}
DIR="$(pwd)";
PS1="$(tput setaf 4)$(tput bold)[ $(tput setaf 6)\u$(tput setaf 4)@$(tput setaf 1)${address}$(tput setaf 4):$(tput setaf 6)${mountFrom} $(tput setaf 4)]\n\[\$(UpdatePath \$(echo -en \$DIR) \${montTo} )\] \n$(tput setaf 6)\\$ $(tput setaf 7): $(tput sgr0)$(tput sgr0)";
이제 디렉토리를 변경하는 데 문제가 있습니다.
서브쉘이 /var/www/html에서 시작하고 누군가 올라가면(예: /var/www) 해당 사람을 /var/www/html로 이동해야 합니다. "cd /"를 실행할 때도 마찬가지입니다. 현재는 작동하지 않지만 나중에 코드를 다시 작성하겠습니다 :)