명령으로 그놈 터미널 프롬프트 문자열의 형식을 토글합니까?


9

내 터미널에는 다음과 같은 기본 프롬프트 형식이 있습니다.

username @ boxname / path / to / current / directory $

그것을 생성하는 코드는 다음과 같습니다 : (색상 정의가 있습니다)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

현재 디렉토리에 대한 경로가 너무 길어지면 줄을 끊기 때문에 터미널에 대한 작업이 불쾌 해집니다. 이러한 경우 다음과 같은 짧은 문자열을 생성하는 형식을 선호합니다.

username @ boxname current_dir_name $

그것을 생성하는 코드는 다음과 같이 보일 것입니다 (색상).

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

누구나 다음과 같이 입력하여 현재 터미널 창의 형식을 한 스타일에서 다른 스타일로 쉽게 전환하는 방법을 알고 prompttoggle있습니까?


6
bash의 PROMPT_DIRTRIM 매개 변수 를 알고 있습니까?
steeldriver

@steeldriver는 지금까지 없습니다. 에 대한 서로 다른 값을 토글하는 것보다 간결 PROMPT_DIRTRIM=0하고 PROMPT_DIRTRIM=1간결한 것처럼 보이며 PS1결과는 거의 같습니다. 정보에 대해서 감사드립니다!
Rotareti

PROMPT_DIRTRIM하나를 사용 하면 명령에 인수를 추가 할 수도 있습니다. 더 인수를 전달하지 않으면 당신은 사이를 전환 PROMPT_DIRTRIM=0하고 PROMPT_DIRTRIM=1당신이 인수로 수를 전달하면 당신이 설정 PROMPT_DIRTRIM그것. promptlen그러면 명령에 더 적합한 이름이됩니다.
Rotareti

답변:


10

PS1변수 와 짧은 변수를 다른 이름으로 저장하십시오.

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

PS1처음에 다음 중 하나로 설정하십시오 .

PS1="$PS1long"

그런 다음 다음과 같이 별칭을 만들어 두 PS1 값 사이를 전환 할 수 있습니다.

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

~/.bashrc파일에 네 줄을 모두 추가하면 Bash 세션에서 사용할 수있는 명령이 시작됩니다.

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

7

작은 bash기능을 사용할 수 있습니다 :

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

위의 함수는 전류에 $PS1가 포함되어 있으면 일치 하고 basename, 맞으면 PS1without basename가 설정되고 그렇지 않으면 with basename가 설정됩니다.

~/.bashrc모든 대화식 세션에서 사용할 수 있도록 기능을 넣으십시오 .

예:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

5

아니면 .. 아주 작은 기능 두 개를 만들어서~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

단축 된 프롬프트의 경우을 입력 promptshort하여 전체 경로로 돌아가려면 다음을 입력하십시오.promptlong

\W쇼 현재 작업 디렉토리에만 너무 $(basename ${PWD})과잉 이럴입니다

하나의 함수로 결합 할 수 있지만 "long"과 "short"는 설명 적이며 둘 다 "toggle"보다 키 입력이 적습니다.

PS1을 재정의하기 위해 줄을 추가하는 대신 그것을 설정하는 코드를 조정하는 것을 선호합니다 (예 : 주석 처리를 취소 force_color_prompt=yes하고 뒤에 줄 편집 [ "$color_prompt" = yes ]; then)


3

다음은 ~/.bashrc개인적으로 프롬프트를 일반 프롬프트에서 just로 재설정 / 전환하는 데 사용 하는 함수 정의입니다 $. 필요에 따라 필요에 맞게 조정하십시오.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 

1

이것은 문제에 대한 답변이며 (긴 디렉토리가 명령 행을 중단 함) 특별히 질문하지는 않습니다 (명령 프롬프트를 즉시 변경하는 방법).

이 프롬프트로 몇 년 전에이 문제를 해결했습니다.

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

이것이하는 일 :

  1. 이전 명령의 종료 값을 출력하십시오 (매우 유용합니다)
  2. 현재 사용자와 호스트를 한 가지 색상으로 출력
  3. 작업 디렉토리를 다른 색상으로 출력하십시오 (색상을 취향에 맞게 조정하십시오)
  4. 줄 바꿈 전에 색상 순서를 끝내고 새 줄에 달러와 공백을 출력합니다.

이것은 당신에게 명령에 필요한 모든 공간을 제공하고, 깊은 디렉토리 구조에있을 때 바로 움직이지 않으며, 색상 코드로 타이핑 라인을 엉망으로 만들지 않고 (때로는 이상한 버그를 피함) 한 명령의 출력이 끝나고 다음 명령이 시작된 위치에 대한 힌트 :

여기에 이미지 설명을 입력하십시오

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