내 .bash_profile에는 다음 기능이 있습니다.
function GIT_BRANCH() {
STATUS="\$(git status 2> /dev/null)";
if [[ ! ${STATUS} ]]; then
if [[ ! ${STATUS} = *"working tree clean"* ]]; then
echo "not clean repo";
else
echo "clean repo";
fi
else
echo "not a repo";
fi
}
다음과 같이 명령을 실행하면:
echo $(git status 2> /dev/null);
echo $(pwd);
불행하게도 현재 쉘에 있는 디렉토리에서는 명령이 실행되지 않습니다.
아래 예시를 따라 문제를 해결해 보려고 합니다.
STATUS="\$(git status 2> /dev/null)";
변수를 출력하기 위해 echo를 사용하는 한 이것은 잘 작동합니다. 올바르게 이해하면 문자열만 변수에 저장되고 비교할 때 명령이 실행되지 않습니다. STATUS에 저장된 명령의 반환 값을 얻고 동일한 셸에서 명령을 실행하려면 어떻게 해야 합니까?
편집하다:
저는 PS1에서 이 기능을 사용하고 있습니다. 내가 시도하면 :
function GIT_BRANCH() {
STATUS="\$(git status 2> /dev/null)";
echo ${STATUS};
TEST="\$(pwd)";
echo ${TEST};
}
export PS1="$(COLOR "199")\u$RESET_ALL$(COLOR "45") \h \w$RESET_ALL $(COLOR "199")$(GIT_BRANCH $DIRE)$RESET_ALL\n$(COLOR "199")$ >$RESET_ALL "
그러면 모든 것이 잘 작동하고 현재 디렉토리를 얻습니다. 하지만 이 정보를 함수 자체에서 사용하려고 하면 이전에 게시한 예제처럼 작동하지 않습니다.
도움을 주셔서 감사합니다.
답변1
문제는 따옴표에 있습니다.
기본적으로 PS1
변수를 다음과 같이 설정합니다.
PS1="$(myfunction)"
( PS1
현재 쉘에서만 사용하고 있으므로 내보내기가 필요하지 않습니다.)
이 함수 myfunction
는 에 할당될 때 호출되며 PS1
함수는 다시 호출되지 않습니다.
대신에 다음을 사용해야 합니다.
PS1='$(myfunction)'
myfunction
이렇게 하면 프롬프트가 표시될 때마다 호출 됩니다 .
함수 자체에는 특별한 참조가 필요하지 않습니다.
귀하의 기능:
function GIT_BRANCH() {
STATUS="\$(git status 2> /dev/null)";
if [[ ! ${STATUS} ]]; then
if [[ ! ${STATUS} = *"working tree clean"* ]]; then
echo "not clean repo";
else
echo "clean repo";
fi
else
echo "not a repo";
fi
}
이는 다음과 같이 다시 작성할 수 있습니다.
GIT_BRANCH () {
local status="$( git status --porcelain 2>&1 )"
case "$status" in
*"fatal: not a git repository"*)
echo 'Not a repo' ;;
"")
echo 'Clean repo' ;;
*)
echo 'Not clean repo' ;;
esac
}
또는 if
다음 명령문을 사용하십시오.
GIT_BRANCH () {
local status="$( git status --porcelain 2>&1 )"
if [[ "$status" == *"fatal: not a git repository"* ]]; then
echo 'Not a repo'
elif [[ -z "$status" ]]; then
echo 'Clean repo'
else
echo 'Not clean repo'
fi
}
답변2
PROMPT_COMMAND 매개변수 사용
alux@deb904:~$ PROMPT_COMMAND=pwd
/home/alux
alux@deb904:~$ cd /tmp
/tmp
alux@deb904:/tmp$
귀하의 기능으로 :
$ PROMPT_COMMAND=GIT_BRANCH
답변3
매개변수 PS1은 백슬래시로 이스케이프된 여러 특수 문자(\u, \d, \$, ...)를 삽입하여 사용자 정의할 수 있는 정적 문자열입니다. 이러한 라벨만 동적입니다.
alux@deb904:~$ echo $PS1
\u@\h:\w\$
alux@deb904:~$ ps1="$PS1"
PS1이 명령(PS1=$(pwd) 또는 PS1=`pwd`)을 사용하여 평가되면 PS1은 명령 반환으로 평가됩니다.
alux@deb904:~$ PS1="$(pwd) > "
/home/alux > echo $PS1
/home/alux >
/home/alux > cd /tmp
/home/alux > echo $PS1
/home/alux >
/home/alux > pwd
/tmp
PROMPT_COMMAND 매개변수에 PS1의 값을 표시하기 전에 실행된 명령줄이 포함되어 있는지 확인할 수 있습니다. 함수를 사용하는 것이 더 적절합니다.
/home/alux > PS1=$ps1
alux@deb904:~$ myprompt(){ pwd; echo " > "; }
alux@deb904:~$ COMMAND_PROMPT=myprompt
/home/alux
>
alux@deb904:~$
이 줄로 돌아가지 않으려면 echo -n을 사용하세요.
/home/alux
>
alux@deb904:~$ myprompt(){ echo -n "$(pwd) > "; }
/home/alux > alux@deb904:~$ cd /tmp
/tmp > alux@deb904:/tmp$
PS1의 가치를 삭제할 수 있습니다.
/tmp > alux@deb904:/tmp$PS1=
/tmp >
그러나 백슬래시에서 이스케이프된 특수 문자는 없습니다.
/tmp > myprompt(){ echo -n "$(pwd) \u \h > "; }
/tmp \u \h >
그런 다음 다른 매개변수($USER, $HOSTNAME, ...)를 사용할 수 있습니다.
/tmp \u \h > myprompt(){ echo -n "$(pwd) $USER $HOSTNAME > "; }
/tmp alux deb906 >
PS1 값이 표시되기 전에 PROMPT_COMMAND 값이 실행됩니다. 따라서 PROMPT_COMMAND를 사용하여 PS1을 수정할 수 있습니다.
/tmp alux deb906 > myprompt(){ PS1=$(echo -n "$(pwd) (\h) > "); }
/tmp (deb904) > echo $PS1
/tmp (deb904) >
/tmp (deb904) > cd ~
/home/alux (deb904) > echo $PS1
/home/alux (deb904) >
/home/alux (deb904) > PROMPT_COMMAND=
/home/alux (deb904) > PS1=$ps1
alux@deb904:~$
이제 .bash_profile에서:
function GIT_BRANCH() {
local status="$(git status 2> /dev/null)"
local msg
if [ "${status}" ]; then
if [ ! "${status}" = *"working tree clean"* ]; then
msg="not clean repo"
else
msg="clean repo"
fi
else
msg="not a repo"
fi
PS1="\u \h \w ${msg}\n\$ "
}
PROMPT_COMMAND=GIT_BRANCH
답변4
사용 평가:
function GIT_BRANCH() {
STATUS="\$(git status 2> /dev/null)";
if [ "$(eval echo ${STATUS})" ]; then
if [ ! $(eval echo ${STATUS}) = *"working tree clean"* ]; then
echo "not clean repo";
else
echo "clean repo";
fi
else
echo "not a repo";
fi
}
또는 또 다른 추가 기능:
function STATUS(){
git status 2> /dev/null
}
function GIT_BRANCH() {
if [ "$(STATUS)" ]; then
…
fi
}