bash 프롬프트에서 현재 및 상위 디렉토리 만 표시


16

나는 bash를 처음 접했고 tcsh에서 사소한 것을 보여 주라는 프롬프트를 원하지만 좋은 Google 검색 후에도 여전히 할 수 없습니다.

프롬프트에 다음과 같이 현재 디렉토리와 부모 디렉토리 만 포함 시키십시오.

/parent/currentdir $

tcsh에서는 다음을 수행합니다.

set prompt = "%C2 %"

그러나 bash에서는 지금까지만 동일한 출력을 얻기 위해 pwd를 구문 분석해야한다는 것을 알았습니다.

다음과 같은 간단한 방법이 없습니까?

export PS1="$(some_command) $" 

2
이론적으로 PS1='\w \$'; PROMPT_DIRTRIM=2bash와 동등한 것을 제공해야하지만 내 시스템에서는 제대로 작동하지 않습니다.
Mikel

GNU bash, 버전 3.2.57 (1)-릴리스 (x86_64-apple-darwin14)에서는 전혀 작동하지 않습니다.
twalbaum

PROMPT_DIRTRIMBash 4 에 도입되었습니다 . 방금 WSL에서 우분투 16.04를 테스트했으며 훌륭하게 작동했습니다!
Mike Branski

답변:


18

Bash의 프롬프트 제어 기능은 정적입니다. 더 많은 제어를 원하면 프롬프트에 변수를 포함시킬 수 있습니다. promptvars옵션을 해제하지 않았는지 확인하십시오 .

PS1='${PWD#"${PWD%/*/*}/"} \$ '

작은 따옴표를 참고하십시오. 변수 확장은 PS1변수가 정의 된 시간이 아니라 프롬프트가 표시 될 때 발생해야합니다 .

표시되는 내용을보다 세밀하게 제어하려면 명령 대체를 사용할 수 있습니다. 예를 들어, 위의 스 니펫 ~은 홈 디렉토리 의 약어를 잃습니다 .

PS1='$(case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac; printf %s "$HPWD") \$ '

이 코드는 다소 번거롭기 때문에 PS1변수에 넣는 대신 PROMPT_COMMAND변수 를 사용하여 코드를 설정 HPWD한 다음 프롬프트에서 해당 코드를 사용할 수 있습니다.

PROMPT_COMMAND='case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac'
PS1='$HPWD \$'

단축 된 프롬프트는 디렉토리 변경시에만 변경되었으므로 프롬프트가 표시 될 때마다 다시 계산할 필요가 없습니다. Bash는 현재 디렉토리 변경에서 실행되는 후크를 제공하지 않지만 재정의 및 사촌을 통해이를 시뮬레이션 할 수 있습니다 cd.

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  case $PWD in
    $HOME) HPWD="~";;
    $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    $HOME/*) HPWD="~/${PWD##*/}";;
    /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    *) HPWD="$PWD";;
  esac
}
PS1='$HPWD \$'

export PS1는 환경 변수가 아니라 쉘 설정이기 때문에 export 할 필요는 없으며, 그렇게해서는 안됩니다 . bash PS1설정은 다른 쉘에서 이해할 수 없습니다.

PS 대화식 셸 환경을 원한다면 zsh로 전환하십시오 . 여기에서 %tcsh chpwd등을 포함하는 프롬프트 확장 은 모두 기본 기능입니다.

PS1='%2~ %# '

2
이것이 인정되고 가장 많이 찬성 된 답변이었을 것입니다.
LarsH 2016 년

3

부모와 현재 디렉토리를 얻는 구문은 Munai의 답변 에서 가져옵니다 .

그러나 Gilles가 지적한 것처럼이 코드 .bashrc는로드 당시의 현재 디렉토리 만 표시 하지만 시스템을 다른 폴더로 탐색해도 변경되지 않습니다.

.bashrc파일 에 이것을 넣으면 프롬프트가 자동으로 현재 디렉토리로 업데이트됩니다.

prompt_command () {
    PS1='$(basename $(dirname "$PWD"))/$(basename "$PWD") $ '
}
PROMPT_COMMAND=prompt_command

1
정의 prompt_command()자체적으로 무언가를하기로되어 있습니까? 그것은 나를 위해하지 않습니다. Gilles처럼 &의 prompt_command()재정의 에도 사용한다는 의미 cd입니까? 아니면 의미 PROMPT_COMMAND='...'했습니까?
LarsH 2016 년

2
또한 $PWD공백 이 있으면이 명령이 실패 합니다.
LarsH 2016 년

1
다시 돌려 주셔서 감사합니다. 공백을 허용하기 위해 $ PWD를 인용하고 최종 명령을 포함했습니다. 현재 프롬프트는 이것보다 복잡하므로 prompt_command 정의가 필요합니다. 그렇지 않으면 PS1 = ...이 작동합니다.
twalbaum

탐색 할 때 출력 정리에 대한 아이디어 / 있습니까? 서면으로, 당신은 얻을/// $
ezrock

0

bash쉘 변수를 편집하여 프롬프트 문자열을 쉽게 변경할 수 있습니다 PS1. Prompt String 1의 약자입니다. 자세한 정보는 여기에 있습니다 .

지금은 bash껍질을 발사하십시오 .

vi ~/.bashrc

파일에 PS1 정의 추가

`export PS1="$(basename $(dirname $PWD))/$(basename $PWD)"`

여기여기에 더 많은 자습서가 있어 더 많은 내용을 조정할 수 있습니다.


1
프롬프트를 수정하는 방법을 이해합니다. 내 질문은 전체 경로가 아닌 현재 디렉토리와 부모 디렉토리 만 얻는 방법입니다.
twalbaum

@twalbaum 내 답변을 수정했습니다
Munai Das Udasin

@twalbaum :)
Munai Das Udasin

1
이렇게하면 .bashrc로드 할 때 프롬프트가 현재 디렉토리로 설정 cd되며 다른 디렉토리로 이동 하면 프롬프트가 변경되지 않습니다 ! @twalbaum
Gilles 'SO- 악마 중지'

@Gilles 그것은 나를 위해한다.
twalbaum

0

홈 디렉토리에 "~"를 사용하는 것이 더 간단 할 수 있습니다.

function PWDN {
  echo "${PWD/#$HOME/~}" | rev | cut -d "/" -f1 -f2 | rev
}

0
export PS1='[\u@\h $(basename $(dirname ${PWD}))/$(basename ${PWD})]\$ '
export PROMPT_COMMAND='echo -ne "\033]0;$(basename $(dirname $PWD))/$(basename ${PWD})\007"'

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