Bash 또는 ksh93에서 tcsh와 유사한 PS1 프롬프트를 생성하는 방법

Bash 또는 ksh93에서 tcsh와 유사한 PS1 프롬프트를 생성하는 방법

tcsh에는 기본값이 있습니다.

prompt  [%m:%c3] %n%# 

다음과 같은 프롬프트가 표시됩니다.

[woehler:hacking/c/hello] ajcarr% 

그리고

[woehler:~] ajcarr% 

즉, 현재 디렉터리와 그 위의 다음 두 디렉터리가 경로에 포함됩니다.

ksh93 또는 bash에서 $HOMEby로 바꾸는 것은 현재 디렉터리의 이름을 추출하는 것만큼 쉽지만 tcsh의 동작을 복제하는 방법을 ~찾지 못했습니다 . %c3현재 ksh93에는 다음이 있습니다.

[ajcarr@Woehler] hello $ 

그리고

[ajcarr@Woehler] ~ $ 

이 작업을 수행하는 방법에 대한 제안이 있는 사람이 있습니까?

답변1

존재하다ksh93:

PS1='${PWD#${PWD%?/*/*/*}?/} \$ '
share/doc/libnl-3-dev $ _

PS1='[${HOSTNAME%%.*}:${PWD#${PWD%?/*/*/*}?/}] $USER% '
[host:share/doc/libnl-3-dev] user% _

$HOME로 바꾸려면 ~더 나쁜 것이 필요합니다.

PS1='$(d=${PWD/#$HOME/"~"};printf %s "${d#${d%?/*/*/*}?/}") $ '
~/w/maemo $ cd sb2-pathmaps
w/maemo/sb2-pathmaps $ _

PS1='$(d=${PWD/#$HOME/"~"};printf %s "[${HOSTNAME%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '
[host:w/maemo/sb2-pathmaps] user% _

이 모든 것은 다음에도 적용되어야 합니다.bash, 비록 bash자체 프롬프트 이스케이프(예: \hfor ${HOSTNAME%%.*}) 및 경로 단축 메커니즘( PROMPT_DIRTRIM)이 있지만.

bash또한 더 나쁜 변형은 와 달리 내장 명령만 포함하더라도 ksh93각 명령 대체 fork()에 대해 별도의 프로세스가 있기 때문에 정말 짜증나는 일입니다 . $(...; printf ...)이는 pdksh파생 쉘 에도 적용됩니다 mksh.


zsh프롬프트 이스케이프는 다음과 매우 유사하지만 동일하지는 않습니다 tcsh.

zsh$ PS1='[%m:%3c] %n%# '
[host:share/doc/libnl-3-dev] user% _

노트:

기본적으로 이 $HOSTNAME변수는 설정되어 있지 않습니다 ksh93. 대신 내장 함수를 사용할 수 있습니다 uname(활성화한 후 PATH=/opt/ast/bin:$PATH경로 /opt/ast/bin가 존재할 필요가 없습니다).

PS1='$(d=${PWD/#$HOME/"~"};h=$(uname -n); printf %s "[${h%%.*}:${d#${d%?/*/*/*}?/}]") $USER% '

\hbash 또는 %mescape in zsh또는 tcshthis 에서 탈출하는 것과는 다릅니다.~ 할 것이다호스트 이름 변경 사항을 추적합니다.

답변2

Bash의 경우 구현할 수 있습니다비슷한결과는 다음에 의해 설정됩니다.PROMPT_DIRTRIM바꾸다:

$ PS1='[\u@\h] \w\$ '
[schaller@r2d2] ~$ pwd
/home/schaller
[schaller@r2d2] ~$ PROMPT_DIRTRIM=3
[schaller@r2d2] ~$ cd /home/schaller/tmp/513924/another/directory/here
[schaller@r2d2] ~/.../another/directory/here$

관련 정보