쉘 프롬프트에서 축약 된 현재 디렉토리?


23

vim 조금 길 때 경로에서 활용하는 정말 멋진 기능이 있습니다.

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

맨 위에있는 탭에서 문서의 경로를 줄여줍니다. 이것과 비슷한 것을 할 수있는 방법이 있습니까? 내 bash 프롬프트는 다음과 같이 보이지 않습니다 :

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
그래서 원하는 것은 rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ 무엇입니까? 최대 프롬프트 길이에 대한 임계 값을 사용하는 것이 이상적입니까?
nicerobot

정확히 내가 찾는 것입니다.
Naftuli Kay

좋아, 나는 대답을 제공했다.
nicerobot 2016

답변:


14

이것을 시도 하십시오 :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

또는 순수한 배쉬 :

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

그때

PS1='\u@\h ${PS1X} $ '

를 생성합니다 (에 ~대한 알림 ${HOME}) :

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

@enzotib의 덕분에 답변이 향상되었습니다.


1
후손에게 이것이 프롬프트처럼 보이는 예를 제공 할 수 있습니까?
Naftuli Kay

(0) github 링크가 끊어졌습니다. (1) $PWD~테스트를 자세히 살펴볼 수 있습니다 . 경우 현재 HOME이다 /home/ed하고 PWD있다 /home/edwina, 당신은 얻을 ~wina펄 버전과 ~/ina쉘 버전. (2) 현재 디렉토리에 와일드 카드 (예 : 경로 이름 확장) 문자가 포함되어 있으면 쉘 코드가 질식합니다. 예 : PWD= /abc/*/def. 당신은 추가하여이 문제를 해결할 수 있습니다 set -o noglob또는 set -f. … (계속)
G-Man, 'Reinstate

(계속) ... (3) 괄호가 거의 필요하지 않습니다. Perl 명령에서 $HOME(큰 따옴표 안에 있음) $PWD충분합니다. 쉘 명령에서 마지막 세 개의 쉘 변수 참조는 괜찮지 만 처음 세 개는 , 및 "${PWD#$HOME}"일 수 있습니다 . (4) mbentley의 답변 과 그에 대한 의견 도 참조하십시오 . "$PWD""$p"
G-Man, 'Reinstate

15

@nicerobot 답변과 비슷하지만 다소 짧습니다.

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

다음 예제 출력이 표시됩니다.

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

나는 PROMPT_DIRTRIMbash에서 좋아한다 ...

export PROMPT_DIRTRIM=2

예제 프롬프트를 다음으로 변경합니다 ...

rfkrocktk@work-laptop ../com/tkassembled/ $

그것은 나를 위해 작동합니다.


그가 요구 한 것을하지는 않지만 기능에 대해 알려 주셔서 감사합니다.
nicerobot 2014

3
@nicerobot 그래, 당신은 진짜 대답을했다. :) 나는 그것이 요구하는 약어를 제공하지는 않지만 종종 간단한 옵션을 볼 때 우리의 기대치가 변한다는 것을 알고 있습니다. 또한 표준이며 따라서 언급 할 가치가 있다고 느꼈습니다.
BentFX

1
SE의 기능 중 하나는 질문에 대한 완벽한 답변을 제공 할뿐만 아니라 OP를 통해 검색을 통해 질문을 찾는 다른 옵션을 제공하는 것입니다. 내가 제공 한 답변 문맥에 주목하십시오. 여전히 일부는 그것이 투표권이 있다고 생각합니다.
BentFX

나는 질문에 직접 대답하지 않는 투표에 대한 답변을 얻는 경향이 있지만 대안을 제공하는 것이 유효한 응답 또는 답변 일 수 있음에 동의합니다 .
nicerobot 2018

BentFX의 답변은 OP의 질문에 전체적으로 답변하지는 않지만 셸 프롬프트 의 제목으로 현재 디렉토리를 약식합니까? 이 주제의 방문자 대부분이 원하는 것을 정확하게 찾을 수 있습니다.
TNT

4

에 추가 enzotib , 다음 코드는 것이다 대답의 '

  1. 변환 /Path/To/Your/Home/~/(경로가 될 수 있도록 ~/a/b/c대신 /P/T/Y/H/a/b/c)
  2. 점만 표시하는 대신 '점 파일'의 첫 글자를 사용하십시오 ( /a/./c/d가됩니다 /a/.b/c/d) :

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

작은 따옴표를 사용하십시오. 그렇지 않으면 bash가 조기에 확장합니다.


3

귀하의 형식 PS1\W( man 페이지 의 PROMPTING섹션을 bash참조하십시오).

PS1="\u@\h \W\$ "

그리고 다른 옵션을 읽고 싶을 수도 있습니다. 명령 행으로 멋진 일을 할 수 있습니다.


2
\ W 그가 요구하는 것을 전혀하지 않는 것 같아요.
nicerobot

1
@nicerobot 경로의 모든 구성 요소의 첫 번째 이니셜을 제공하지는 않지만 현재 작업 디렉토리를 더 짧은 방식으로 제공합니다. 각 프롬프트에서 실행되는 약간의 추악한 스크립트를 사용하지 않고 그런 식으로 디렉토리를 축약하는 것은 불가능하다고 확신합니다. 우리는 그가 이것에 대해 무엇을 말해야하는지 볼 것입니다.
Kevin

1

nicerobot의 예제 출력을 좋아하지만 한 가지 문제가 있습니다. 나는 거기에 하이픈이있는 디렉토리가 A-E, 그리고 그것을보고 있었다 -E인수로 printf내 현재 작업 디렉토리 때. 이 문제를 해결하기 위해 출력 할 것이없는 경우 --마지막 printf에 따옴표를 추가하고 출력 주위에 따옴표를 추가했습니다.

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1) -두 번째 문자로 포함 된 디렉토리 이름 문제를 잘 파악 합니다. 으로 --시작하는 인수 문제에 대한 일반적인 해결책은 사실이지만 -, 더 나은 방법 printf은을 printf "%s" "${q:1}"포함하는 인수로부터 보호하기 때문입니다 %. (예를 들어, 시도 PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) nicerobot의 답변에 대한 내 의견 참조
G-Man은 '복귀 모니카'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.