PS1에서 \w를 조건부로 수정하는 방법은 무엇입니까?

PS1에서 \w를 조건부로 수정하는 방법은 무엇입니까?

내가 하는 모든 작업은 icloud 디렉토리에 있으므로 bash프롬프트가 매우 길어집니다.

~/Library/Mobile Documents/com~apple~CloudDocs/Projects/foo/bar/baz @master $ 

내 팁은 다음과 같습니다.

PS1='\w\[\e[1;35m\]$(__git_ps1 " @%s") \[\e[1;32m\]\$\[\e[m\] '

/Library/Mobile Documents/com~apple~CloudDocs/\w in의 발생을 유사한 것으로 대체 icloud하여 아래와 같이 더 나은 프롬프트를 표시하는 것이 가능합니까 ?

~/icloud/Projects/foo/bar/baz @master $ 

답변1

Zsh에는 프롬프트에서도 거의 자동으로 디렉토리 이름을 축약하는 "이름이 지정된 디렉토리" 기능이 있습니다. Bash에 이에 상응하는 기능이 없다고 생각하지만 PROMPT_COMMAND변수를 설정한 다음 using 프롬프트 insetad에 인쇄하는 사용자 정의 함수를 실행하여 문제를 해결할 수 있습니다 \w.

/tmp/test예를 들어, 경로의 첫 번째 문자를 로 바꿔야 합니다 ~testdir.

set_promptpath() {
    promptpath=$PWD;
    # do whatever replacement you like here
    promptpath=${promptpath/#\/tmp\/test/\~testdir}
}
PROMPT_COMMAND=set_promptpath
PS1='$promptpath\$ '

답변2

cwd경로를 동적으로 업데이트하는 함수를 사용하여 @ilkkachu의 답변 중 일부를 사용하여 이 문제를 해결했습니다.

cwd() {
    cwd=${PWD/\/Users\/htor/\~}
    echo ${cwd/\Library\/Mobile Documents\/com~apple~CloudDocs/icloud}
}
PS1='$(cwd)\[\e[1;35m\]$(__git_ps1 " @%s") \[\e[1;32m\]\$\[\e[m\] '

예쁘지는 않지만 적어도 제 팁은 또 예쁘네요!

관련 정보