쉘 프롬프트에 현재 디렉토리 위치를 넣을 경우,
디렉토리 깊이가 깊어질수록 터미널이 지저분해지게 된다.
Ubuntu 등의 배포판에서는
PROMPT_DIRTRIM 변수에 숫자를 지정해주면
그 숫자만큼만 프롬프트상에 표시되는 현재 디렉토리 경로를 줄여준다.
그렇지만 MacOS 기본 Bash 쉘(3.2.57)에는
PROMPT_DIRTRIM
이 구현되어 있지 않다.
Bash 자체 버전을 올려도 되지만, 순정 상태를 건드리고 싶지는 않다(...).
그런데 손으로 구현하는 방법이 있어 정리해둔다.
참고:
https://stackoverflow.com/questions/26554713/how-to-truncate-working-directory-in-prompt-to-show-first-and-last-folder
PS1='$(pwd | sed -E -e "s|^$HOME|~|" -e '\''s|^([^/]*/[^/]*/).*(/[^/]*)|\1..\2|'\'') \$ '
위 스택오버플로 페이지의 솔루션은 좋긴 하지만
처음 두 개 디렉토리 .. 마지막 하나의 디렉토리
로 구성된다.
이것을 조금 바꾸어
처음 1개의 디렉토리 .. 마지막 두개의 디렉토리
으로 만들고 싶다.
아무래도 뒤에 있는 경로가 좀 더 중요하니까.
따라서 스택오버플로 솔루션에서 순서를 바꾸어야 한다.
PROMPT_PRE='\[\033[38;5;11m\]\u\[\033[38;5;15m\]@\h:\[\033[38;5;6m\]'
PROMPT_POST='\[\033[38;5;15m\] '
PWDTRIM1='$(pwd | sed -E -e "s|^$HOME|~|" -e '\''s|^([^/]*/[^/]*/).*(/[^/]*)|\1..\2|'\'')'
PWDTRIM2='$(pwd | sed -E -e "s|^$HOME|~|" -e '\''s|^([^/]*/).*([^/]*/[^/]*/)|\1..\2|'\'')'
PS1="${PROMPT_PRE}${PWDTRIM2}${PROMPT_POST}"
PWDTRIM1
이 스택오버플로 버전이고
PWDTRIM2
가 수정된 버전이다.
스크립트의 전체 구조를 보면,
① 먼저 pwd 명령으로 현재 작업 디렉토리 경로를 받아온 다음,
② sed로 $HOME 디렉토리 패턴을 물결(~)로 바꾸고,
③ 이어서 sed로 처음 하나의 디렉토리와
마지막 두개의 디렉토리 경로를 제외한 부분을
쩜쩜(..) 으로 바꾸어준다.
③ 단계가 복잡하니 이것만 자세히 분석해본다.
PWDTRIM2='$(pwd | sed -E -e "s|^$HOME|~|" -e '\''s|^([^/]*/).*([^/]*/[^/]*/)|\1..\2|'\'')'
빨갛게 표시한 부분 좌우에 '\' 등 외따옴표로 묶인 것들은 escape를 위해 넣은 것들이다.
위의 sed 명령어에 쓰인 패턴매칭 크게 네 부분으로 나눌 수 있다.
-
①
^([^/]*/)
-
슬래시(/) 문자를 제외한 모든 문자 0개 이상으로 이루어진 문자열로
시작하는 패턴을 Back Reference로 구성하여 \1 로 저장.
이 패턴은 처음에 슬래시 문자가 나왔다가 다시 등장하거나,
슬래시 문자가 없다가 등장할 경우 패턴매칭이 끝나기 때문에
첫 번째 디렉토리 경로로 볼 수 있다.
-
②
.*
-
첫 번째 매칭 이후에 나오는 모든 문자들의 패턴.
뒤에 나올 마지막 2개 디렉토리 패턴은 해당 패턴이 가져가므로,
처음 하나 ~ 나중 두개 디렉토리 경로에서 중간 부분이라고 볼 수 있다.
-
③
([^/]*/[^/]*/)
-
[^/]* |
'슬래시(/)문자를 제외한 모든문자 0개 이상으로 이루어진 문자열' 이후에
|
/ |
'슬래시(/)문자'가 나오고
|
[^/]* |
그리고 이어서 '슬래시(/)문자를 제외한
모든 문자 0개 이상으로 이루어진 문자열'이 등장.
|
/ |
이어서 마지막으로 '슬래시(/)문자'가 나온다.
|
종합해 보면 마지막 2개의 디렉토리를 의미한다.
그리고 이 패턴은 Back Reference로서 /2 에 저장된다.
-
④
\1..\2
-
Back Reference 1번은 작업 디렉토리 경로에서 첫 번째 디렉토리이고,
Back Reference 2번은 작업 디렉토리에서 마지막 두 개의 디렉토리이다.
이들 가운데 쩜쩜(..)을 넣도록 하여 문자열을 대치한다.