터미널 명령 프롬프트 작업 디렉토리를 자릅니다


39

깊은 폴더 구조에서 터미널을 사용할 때 프롬프트가 대부분의 회선을 차지할 수 있습니다. 작업 디렉토리를 정리할 수있는 방법이 있습니까? 내가 할 수 있다는 걸 알아

PS1="\W >"

전체 경로가 아닌 현재 디렉토리 만 인쇄하지만 다음과 같은 방법이 있습니다.

/home/smauel/de...ther/folder >

답변:


30

원하는 트리밍 로직을 구현하는 작은 파이썬 스크립트를 만듭니다.

예: ~/.short.pwd.py

import os
from socket import gethostname
hostname = gethostname()
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)
if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '[%s@%s:%s] ' % (username, hostname, pwd)

이제 터미널에서 테스트하십시오.

export PROMPT_COMMAND='PS1="$(python ~/.short.pwd.py)"'

결과가 정상이면 명령을에 추가하십시오 ~/.bashrc.


명백한 것은 아니지만, 명령을 정확히 어떻게 ~/.bashrc? 파일 맨 아래에 마지막 줄을 붙여 넣을 것입니까?
FloatingRock

1
@FloatingRock이 정확합니다. 간단히 .bashrc 파일에 추가하십시오.
Prefix

대단해! 파이썬 프로그램을 편집하면 자동으로 업데이트됩니다 : sweet!
N3sh December

시원한! 즉시 이것을 훔쳤다.
ferdy

마지막 인쇄 ...를 print (...)로 업데이트 하여이 작업을 거의 그대로 파이썬 3에서도 마찬가지입니다. 공유하여 주셔서 감사합니다!
Sean

69

bash4 (Ubuntu 9.10 이상에는 bash4가 있음)를 사용하는 경우 가장 쉬운 옵션은 PROMPT_DIRTRIM 변수를 설정하는 것입니다. 예 :

PROMPT_DIRTRIM=2

João Pinto의 예와 비슷한 것 (이전 bash 버전에서 작동하고 경로 구성 요소가 30자를 넘지 않도록합니다)의 경우 다음과 같이 할 수 있습니다.

PS1='[\u@\h:$(p=${PWD/#"$HOME"/~};((${#p}>30))&&echo "${p::10}…${p:(-19)}"||echo "\w")]\$ '

4
PROMPT_DIRTRIM에 대한 설명서는 여기에서 찾을 수 있습니다. gnu.org/software/bash/manual/html_node/Bash-Variables.html
Ben Amos

11

이 문제를 해결하는 또 다른 방법은 PS1에 줄 바꿈을 포함시켜 작업 디렉토리와 실제 프롬프트를 별도의 줄에 표시하는 것입니다.

PS1="\w\n>"

thiis 마찬가지로, 신속한 당신의 PS1을 변경하지 않는 것입니다,하지만 단지로 명령을 시작 \ 키를 누르십시오 입력합니다 . 명령이 일반적이다 PS2 프롬프트에 다음 줄에 시작하는이 힘 > (난 당신의 제안 :) 볼 때까지 나는 그것을 생각하지 않았다
Peter.O을

4

이것을 바닥에 추가하십시오 ~/.bashrc

split_pwd() {
        # Only show ellipses for directory trees -gt 3
        # Otherwise use the default pwd as the current \w replacement
        if [ $(pwd | grep -o '/' | wc -l) -gt 3 ]; then
                pwd | cut -d'/' -f1-3 | xargs -I{} echo {}"/../${PWD##*/}"
        else
                pwd
        fi
}


export PS1="\$(split_pwd) > "

분명히 이것은 아마도 더 깨끗할 수는 있지만 균열을 원했습니다.

3 층 이상의 디렉토리에 대한 예상 출력입니다.

/home/chris/../Node Projects >

데스크탑 및 디렉토리에서 디렉토리에 대한 예상 출력입니다.

/home/chris/Desktop > 
/home/chris >  
/home

아름다운! $ HOME을 "~ /"로 변환하고 $ PWD가 홈 디렉토리에있는 경우 '길이'의 일부로 계산하지 않는 것에 대한 몇 가지 현명한 정보를 추가해야합니다.
Michael Burr

1

@ joão-pinto의 훌륭한 답변에 대한 이 작은 추가 사항 은 workon명령 을 실행할 때 가상 환경 이름을 추가합니다 .

import os
from platform import node
hostname = node().split('.')[0]
username = os.environ['USER']
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

# check for the virtualenv
ve = os.getenv('VIRTUAL_ENV')

if ve:
    venv = '(`basename \"$VIRTUAL_ENV\"`)'
else:
    venv = ''

if len(pwd) > 33:
    pwd = pwd[:10]+'...'+pwd[-20:] # first 10 chars+last 20 chars
print '%s[%s@%s:%s] ' % (venv, username, hostname, pwd)

아, 좋은 생각입니다. 아마도 내 착색 코드와 결합할까요?
마이크 설치류

1

Cris Sullivan 의 답변을 기반으로 하지만 ~홈 폴더를 유지하십시오.

get_bash_w() {
  # Returns the same working directory that the \W bash prompt command
  echo $(pwd | sed 's@'"$HOME"'@~@')
}

split_pwd() {
  # Split pwd into the first element, elipsis (...) and the last subfolder
  # /usr/local/share/doc --> /usr/.../doc
  # ~/project/folder/subfolder --> ~/project/../subfolder
  split=2
  W=$(get_bash_w)
  if [ $(echo $W | grep -o '/' | wc -l) -gt $split ]; then
    echo $W | cut -d'/' -f1-$split | xargs -I{} echo {}"/../${W##*/}"
  else
    echo $W
  fi
}

export PS1="\$(split_pwd) > "

여전히 PS1을 내보낼 필요는 없습니까 ?? 좋아 보인다.
크리스 설리반

예, 답변에 자세히 설명 된대로 PS1을 내 보내야합니다. 작업 디렉토리를 추가합니다 :-)
Manuel

0

나는 이것을 가장 좋아합니다. PS1="[\W]\\$ "


OP는 그들이 그것에 개입하지 않았다고 언급했다.
wjandrea

0

이 프롬프트는 현재 줄을 제외한 모든 이름을 다음과 같이 줄입니다.

user:/h/t/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}

PS1='\u:$$(eval "sps")/\W\$ '

0

약간 (Python3의 경우) 업데이트 하고 BASH 프롬프트 (Linux Mint 18.3의 경우) 에 따라 프롬프트에 색상을 추가 하도록 선택한 답변 향상 시키십시오 .

#! /usr/bin/python3

import os, getpass
from socket import gethostname

username = getpass.getuser()
hostname = gethostname()
pwd = os.getcwd()
homedir = os.path.expanduser('~')
pwd = pwd.replace(homedir, '~', 1)

if len(pwd) > 40:
    # first 10 chars+last 30 chars
    pwd = pwd[:10] + '...' + pwd[-30:] 

# colours as per my current BASH Terminal: 
# username + hostname: bold green
# path and $: bold blue
print( '\[\e[;1;32m\]%s@%s \[\e[;1;34m\]%s $\[\e[0m\]  ' % (username, hostname, pwd) )

BASH 터미널의 색상 코드에 대한 자세한 내용은 여기를 참조하십시오 . 터미널이 자동으로 사용하는 색상을 찾는 방법이 있을지 모르지만 그게 무엇인지 알 수는 없습니다.

shebang 줄을 사용하면 export.bashrc에 포함될 줄은 다음과 같습니다.

export PROMPT_COMMAND='PS1="$(~/.local/bin/manage_prompt.py)"' # adjust path to .py file

NB1이 "\ e"이스케이프 코드는 항상 "\ [... \]"로 묶어야합니다. 그렇지 않으면 줄 바꿈이 완전히 엉망이됩니다.

NB2는 언제라도 전체 경로를 얻을 수 있습니다.

... $ pwd 

물론이야...

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