bash
  • path
  • prompt
  • 2010-08-16 6 views 21 likes 
    21

    bash를위한 프롬프트 경로 축소 도구를 구현하여 PS1 환경 변수에 포함 시켰습니다. 이렇게하면 작업 디렉터리가보다 작지만 여전히 설명적인 것으로 축소됩니다. 나는 다른 아이디어가 존재할지 궁금하다. "20"은 최대 파라미터 인과코드 챌린지 : Bash 프롬프트 경로 단축자

    PS1='\[\033[01;32m\]\[email protected]\h\[\033[01;34m\] $(
        _dir_chomp "$(pwd)" 20 
    )\[\033[01;37m\]$(parse_git_branch)\[\033[01;34m\] \$\[\033[00m\] ' 
    

    :

    은 (행 바꿈 가독성 삽입)이 추천 PS1에 포함될 수 떠들썩한 기능 _dir_chomp 만들기 : 여기

    는 도전 소프트 한도로 길이. 다음은 예입니다

    1. /usr/portage/media-plugins/banshee-community-extensions/files/u/p/m/b/files
    2. /home/user1/media/video/music/live-sets~/m/v/m/live-sets
    3. /home/user2/media (20 문자 제한을 초과하지 않음) 변경되지 않습니다
    4. /home/user1/this-is-a-very-long-path-name-with-more-than-20-chars가된다합니다 (문자는 $ 홈에 대한 대체 ~주의)을하게된다 ~/this-is-a-very-long-path-name-with-more-than-20-chars (마지막 구성 요소는 약식 상태로 유지됨 : 소프트 한도)
    5. /home/user1/src~/src ($ HOME 항상 합니다 (접두어 도트 보존 주)
    6. /home/user1/.kde4/share/config/kresources~/.k/s/c/kresources가된다) 단축

    현재 사용자 USER1이다.

    awk, perl, ruby, python하지만 컴파일 된 C 프로그램 또는 이와 유사한 같은 외부 통역사를 호출 할 수 있습니다. 즉, 외부 소스 파일을 사용할 수 없으며 코드는 인라인이어야합니다. 최단 버전 승. bash는 함수 본문 (와라는 하위 기능) 수,의 길이는 의미

    _sub_helper() { 
        # this counts 
    } 
    _dir_chomp() { 
        # these characters count (between { and }) 
        _sub_helper "foobar" # _sub_helper body counts, too 
    } 
    
    +0

    나는 당신이'parse_git_branch'을 가지고 있다는 것을 알아 차릴 것이다 - 당신이'__git_ps1'에 선호하는 것인가? – Cascabel

    +0

    그리고 정말로, 누군가가 시간을내어 갈 때까지, 나는 읽을 수없는 -하지만 - 짧은 펄 솔루션을 이길 수 있을지 의심 스럽다. – Cascabel

    +0

    @ Jefromi : 그것은 단지 하나의 라이너입니다 :'git branch 2>/dev/null | sed -e '/^[^ *]/d'-e 's/* \ (. * \)/[자식 : \ 1] /'' BTW : 내 솔루션이 펄, 펄하지 루비입니다. 한 줄짜리지만 꽤 읽기 쉽습니다. – hurikhan77

    답변

    12

    순수 배쉬 :

    테스트의 목적
    _dir_chomp() { 
        local IFS=/ c=1 n d 
        local p=(${1/#$HOME/\~}) r=${p[*]} 
        local s=${#r} 
        while ((s>$2&&c<${#p[*]}-1)) 
        do 
         d=${p[c]} 
         n=1;[[ $d = .* ]]&&n=2 
         ((s-=${#d}-n)) 
         p[c++]=${d:0:n} 
        done 
        echo "${p[*]}" 
    } 
    

    , 내가 있으리라 믿고있어 문제는 현재의 것을 의미 user는 "user1"입니다.

    참고 배시 4는 그 값에 따라 서브 디렉토리의 수를 유지하고 ...

    /$ PROMPT_DIRTRIM=2 
    /$ echo $PS1 
    \w\$ 
    /$ pwd 
    /
    /$ cd /usr/share/doc/bash 
    .../doc/bash$ 
    
    +0

    PROMPT_DIRTRIM은 나에게 너무 간결하므로 내 자신의 솔루션을 만들었습니다. – hurikhan77

    7

    이것은 20 정도 인로 나머지를 대체하여 PS1에서 \w 탈출 단축 가변 PROMPT_DIRTRIM을 갖는다 문자가 다른 답변보다 짧습니다.

    _dir_chomp() { 
        local p=${1/#$HOME/\~} b s 
        s=${#p} 
        while [[ $p != "${p//\/}" ]]&&(($s>$2)) 
        do 
         p=${p#/} 
         [[ $p =~ \.?. ]] 
         b=$b/${BASH_REMATCH[0]} 
         p=${p#*/} 
         ((s=${#b}+${#p})) 
        done 
        echo ${b/\/~/\~}${b+/}$p 
    } 
    
    +0

    나는 순수한 배쉬 방식을 좋아한다. – hurikhan77

    +0

    내 대답은 모두 순수한 Bash입니다. –

    +0

    내 루비 솔루션과는 대조적 인 의미입니다. – hurikhan77

    1

    이 문제에 대한 아이디어를 얻었을 때 이것은 내 자신의 해결책이었습니다. 영감은 실제로 Jolexa's Blog에서 왔습니다.

    _dir_chomp() { 
        ruby -e'a="'$1'".gsub(%r{^'$HOME'},"~");b,a=a,a.gsub(%r{/(\.?[^/.])[^/]+(/.*)},"/\\1\\2")while(a.length>'$2')&&(b!=a);print a' 
    } 
    
    -1

    이 내 bash는 프롬프트를 단축하는 방법입니다

    a = ARGV[1].gsub(%r{^#{ENV['HOME']}}, "~") 
    b, a = a, a.gsub(%r{/(\.?[^/.])[^/]+(/.*)}, '/\1\2') while 
        (a.length > ARGV[2].to_i) && (b != a) 
    print a 
    

    그리고 bash는 함수 내 실제 한 줄 구현 :

    그래서 여기가, 루비 읽을 수있는 형태로 구현 제목 표시 줄의 전체 경로 포함 (3.0 이후 작동) :

    _PS1P=('' '..') 
    PROMPT_COMMAND='_PS1L=${#DIRSTACK[0]} _PS1D=${DIRSTACK[0]}' 
    PS1='\[\e]2;\h:\w\a\]\h ${_PS1P[$_PS1L>36]}${_PS1D:$_PS1L>36?-34:0} \$ ' 
    

    낮은 CPU 오버 헤드.

    관련 문제