PS1에서 왜 내 기능이 재평가되지 않습니까?


15

함수에 의해 프롬프트의 일부를 동적으로 설정하려고합니다 .bashrc.

asdf ()
{
    echo -n $(pwd)
}
PS1="\u@\h:\w $(asdf)\$ "

쉘을 열면 처음에 기대하는 것을 얻을 수 있습니다.

$ bash
darthbith@server:~/test /home/darthbith/test$

그러나 디렉토리를 변경할 때 함수로 정의 된 부분은 변경되지 않습니다.

darthbith@server:~/test /home/darthbith/test$ cd ~/test2
darthbith@server:~/test2 /home/darthbith/test$

내 실제 목표는 git-prompt.sh스크립트 를 사용하여 예쁜 색상과 모든 것이있는 git 저장소의 분기를 표시하는 것이지만 문제는 저장소를 변경할 때 분기 이름을 업데이트하지 않는다는 것입니다. 위의 간단한 예는 내 질문에 대해 생각해 볼 수있는 가장 간단한 재현입니다.

.bashrc나는 자식 프롬프트 스크립트를 통합해야한다는 라인 :

source ~/.git-prompt.sh
PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ "

답변:


22

Bash 프롬프트 Howto 에 따르면 :

[21:58:33][giles@nikola:~]$ PS1="[\$(date +%H%M)][\u@\h:\w]\$ "
[2159][giles@nikola:~]$ ls
bin   mail
[2200][giles@nikola:~]$

명령 대체의 달러 기호 앞에 백 슬래시를 주목하는 것이 중요합니다. 이것이 없으면 외부 명령이 정확히 한 번 실행됩니다. PS1 문자열을 환경으로 읽을 때.


감사합니다! 이제 함수에서 반환 된 이스케이프 시퀀스 대신 색상을 인쇄 할 수만 있다면 ...
darthbith

6

당신이 사용하는 경우 $(..)큰 따옴표로, 쉘에 할당하기 전에 명령 치환을 평가 PS1. 따라서 PS1명령 대체 자체가 아니라 출력 만 포함했습니다. 대신 작은 따옴표를 사용하거나을 이스케이프하여 $문자열이있는 그대로 전달 된 PS1다음 프롬프트가 설정 될 때 평가되도록합니다.

$ PS1='$(pwd) $ '
/tmp $ cd /var
/var $ echo "$PS1"
$(pwd) $ 

비교:

/var $ PS1="$(pwd) $ "
/var $ echo "$PS1"
a /var $  a
/var $ 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.