bash 프롬프트에서 현재 디렉토리 이름 만 표시 (전체 경로 아님)


71

내 bash 프롬프트가 현재 구성된 방식으로 현재 디렉토리의 전체 경로를 보여줍니다. 프롬프트가 너무 길어 모든 명령이 다음 줄로 줄어듦에 따라 디렉토리 트리 내부에있을 때 성가신 일입니다. 경로의 마지막 부분 만 표시하려면 어떻게합니까?

이것이 내가 가진 것입니다 .bashrc:

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

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac

답변:


98

\w(소문자)를 \W(대문자) 로 변경하십시오 .

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
                                                                                       ^^
           this one waaaaaay over here ------------------------------------------------+    

많은 재미있는 세부 사항 은 Bash Prompt HOWTO 를 살펴보십시오 . 예:

user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

PROMPT_COMMAND변수는 설정하면, 지정된 프롬프트를 표시하기 전에 실행됩니다 명령입니다 PS1. 귀하의 경우 Xterm의 제목 표시 줄조작하는 특정 ANSI 이스케이프 시퀀스PROMPT_COMMANDecho명령문을 실행 하십시오 .

프롬프트를 PROMPT_COMMAND무시하고 있다고 의심되면 다음을 수행하여 테스트 PS1할 수 있습니다 unset.

$ unset PROMPT_COMMAND

마지막으로 PS1실제로 사용되는 정의를 변경하고 있는지 확인하십시오 . 일반적인 위치는 /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. 시스템 파일은 일반적으로 사용자 파일보다 먼저 실행되지만 항상 그런 것은 아닙니다.


흠 ... 나는 이미 \ w 인 것을 두려워하지만 case, xterm에있을 때 그 문장이 그것을 무시하는 것처럼 보이며 문제 PWDPROMPT_COMMAND라인 에있는 것처럼 보입니다 . 내가 거기에 무엇을 넣어야하는지 아십니까?
hsribei

4
\w(소문자)를 전체 경로로 설정하고 \W(대문자) 최종 비트로 다듬습니다. PROMPT_COMMAND가 xterm에서 창 제목을 설정 중입니다. TERM 변수를 확인하십시오. "xterm"또는 "rxvt"로 시작 하지 않으면 PROMPT_COMMAND가 실행되지 않습니다.
quck quixote

아, 그래 죄송합니다. 대문자와 소문자를 섞었습니다. 효과가있었습니다. 감사! :)
hsribei 2016 년

좋은 대답입니다. 이를 적용하려면 재부팅해야합니다. 감사!
결합

14

간단한 bash replace 명령은

${VAR/pattern_to_find/pattern_to_replace}

마지막 디렉토리를 표시하려면 ${PWD/*\//}, 예를 들어 마지막 ' /'을 포함하여 이전의 모든 것을 찾아서 아무것도없는 것으로 바꾸십시오.

내 우분투 컴퓨터에서 다음을 사용합니다.

export PS1='$(whoami):${PWD/*\//}#'. 

1
이 답변은 $ PS1의 특수 구문 분석 논리 대신 모든 상황에 일반적이므로 허용되는 것보다 낫습니다. 기억하기 쉽고 작성하기 쉬운 도구가 적을수록 좋습니다. :)
David Ellis

4

내 솔루션은 5 개가 넘는 경우 상위 3 개 및 하위 2 개 디렉토리를 표시하는 것입니다

따라서 내 프롬프트 (다른 ​​정보도 있음)는 다음과 같습니다.

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote

내 암호가 실제로

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote

내 PS1 프롬프트는 다음과 같이 설정됩니다.

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

git_branch 현재 자식 분기를 보여주는 함수이며, 내 도트 파일에 유지합니다.

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }

대단해! 이 답변에 감사드립니다.
카를로스 F

4

내 솔루션은 내보내는 방법에 따라 약간 다르므로 여기에서 공유한다고 생각했습니다.

다른 프롬프트 문자열 변수를 작성하십시오. PS5 및 .profile/ .bash_profile파일 에서 다음 문자열을 내 보냅니다 .

\ u : 현재 사용자 이름을 표시합니다.

\ W : 현재 작업 디렉토리의 기본을 인쇄합니다.

# Display username and current directory only.
export PS5='export PS1="\u:\W$";';

이제 축약 형 PS를 사용해야 할 때마다 다음을 실행하십시오. eval $PS5


또는 더 나은 방법으로 .bash_aliases파일에 별명을 만드십시오 : ( @muru 덕분에 )

alias PS5='export PS1="\u:\W$";';

source다시 입력 PS5하면 이제 입력 하여 전환 할 수 있습니다 .


1
이것은 유능한 것 같습니다. 별명이나 함수를 사용하지 않는 이유는 무엇입니까?
muru

1

bash 프롬프트에서 현재 디렉토리 이름 만 표시 (전체 경로 아님)

다른 솔루션의 대부분은 내 도트 파일 (AIX, Windoze 및 Linux)을 공유하는 모든 OS에서 작동하지 않았습니다. 배쉬 포트는 특정 구조를 지원하지 않은 이전 버전이었고, 나는 다른 프로세스 (즉, 포크 싶지 않았다 sed, awkCygwin에서 아래에 띄게 비싸 등).

다음은 길지만 성능이 뛰어납니다.

# takes a number argument of the number of last dirs to show
function DIR_LAST {
    # read -a didn't seem to work under bash 3
    IFS='/' array=($PWD)
    len=${#array[@]}
    start=$((len - $1))
    # leading / if fewer dir args: /usr/flastname not usr/flastname
    if (( $start <= 1 )); then
        start=1
        echo -n /
    fi
    for (( i = $start; $i < $len; i++ )); do
        if (( $i > $start )); then
            echo -n /
        fi
        echo -n ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

나는 그것을 뱉어 내기를 원한다.

/
/usr
/usr/foo
foo/bin

마지막 줄에 슬래시가 없다는 것을 알 수 있습니다. 또한 arg를로 변경하여 마지막 3 개 디렉토리를 뱉어 낼 수 있습니다 DIR_LAST.

또한 정규 표현식 으로이 작업을 시도 BASH_REMATCH했지만 bash v3은 parens를 좋아하지 않는 것 같으며 올바르게 탈출하는 방법을 알 수 없었습니다. 한숨.


0

나는 단순히 다음을 수행 함으로써이 옵션이 훨씬 쉽다고 생각합니다.

echo $PWD | rev | cut -d '/' -f 1 | rev

따라서 이것을 .bashrc 파일의 PS1 변수에 할당하십시오.

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'

0
root:~/project#  -> root:~/project(dev)# 

~ / .bashrc 끝에 다음 코드를 추가하십시오.

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.