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


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.