디렉토리 트리/파일 이름 작업 시 간단한 bash 팁

디렉토리 트리/파일 이름 작업 시 간단한 bash 팁

Ubuntu 14.04 이상에서는 bashPS1변수가 다음으로 끝납니다.

\u@\h:\w\$

프롬프트가 다음과 같이 표시되도록

user@machinename:/home/mydirectory$

그러나 때로는 현재 디렉터리의 이름이 매우 길거나 이름이 매우 긴 디렉터리에 있으므로 프롬프트는 다음과 같습니다.

user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$

이렇게 하면 터미널의 줄이 채워지고 커서가 다른 줄로 이동하게 되어 짜증납니다.

나는 다음과 같은 것을 얻고 싶다

user@machinename:/home/mydirectory1/...another_long_name$

PS1디렉터리 이름이 특정 문자 수를 초과하지 않고 더 짧은 프롬프트가 표시되도록 디렉터리 이름을 "래핑"하고 "압축"하는 변수를 정의하는 방법이 있습니까 ?

답변1

먼저 \w. \W​이렇게 하면 전체 경로가 아닌 현재 디렉터리의 이름만 인쇄됩니다.

terdon@oregano:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name $ PS1="\u@\h:\W \$ "
terdon@oregano:my_actual_directory_with_another_long_name $ 

디렉토리 이름 자체가 너무 길면 이 방법만으로는 충분하지 않을 수 있습니다. 이 경우 이 PROMPT_COMMAND변수를 사용할 수 있습니다. 이는 각 프롬프트가 표시되기 전에 값이 명령으로 실행되는 특수 bash 변수입니다. 그래서 현재 디렉터리 경로의 길이에 따라 원하는 힌트를 설정하는 함수로 설정하면 원하는 것을 얻을 수 있다. 예를 들어 다음 줄을 다음 줄에 추가하세요 ~/.bashrc.

get_PS1(){
        limit=${1:-20}
        if [[ "${#PWD}" -gt "$limit" ]]; then
                ## Take the first 5 characters of the path
                left="${PWD:0:5}"
                ## ${#PWD} is the length of $PWD. Get the last $limit
                ##  characters of $PWD.
                right="${PWD:$((${#PWD}-$limit)):${#PWD}}"
                PS1="\[\033[01;33m\]\u@\h\[\033[01;34m\] ${left}...${right} \$\[\033[00m\] "
        else
                PS1="\[\033[01;33m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] "
        fi


}
PROMPT_COMMAND=get_PS1

효과는 다음과 같습니다.

terdon@oregano ~ $ cd /home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name
terdon@oregano /home...th_another_long_name $ 

답변2

이에 대한 나의 주요 해결책은 문자 반환을 추가하는 것이었습니다.

따라서 내 프롬프트(더 길게 만들기 위한 추가 콘텐츠 포함)는 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

$가 새 줄로 반환되는 것을 볼 수 있습니다.

나는 이것을 통해 이것을 달성했습니다.

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"`'
PS1=$TIME$USER$HOST$LOCATION'\n\$ '

별도의 줄에 있더라도 다음과 같은 매우 긴 디렉토리 트리가 있습니다.

/home/durrantm/Dropbox/96_2013_archive/work/code/ruby__rails단축

/home/durrantm/Dropbox/_/code/ruby__rails

즉, "처음 3개 디렉토리 /_/와 하위 2개 디렉토리"는 일반적으로 제가 관심을 두는 부분입니다.

이렇게 하면 디렉토리 트리의 길이 때문에 줄이 너무 길어지는 것을 방지할 수 있습니다. 항상 완전한 디렉토리 트리를 원한다면 LOCATION을 조정하십시오.

LOCATION=' \[\033[01;34m\]`pwd`'

답변3

~/.bash_prompt 생성:

maxlen=36
# set leftlen to zero for printing just the right part of the path
leftlen=19
shortened="..."
# Default PWD
nPWD=${PWD}
if [ ${#nPWD} -gt $maxlen ]; then
  offset=$(( ${#nPWD} - $maxlen + $leftlen ))
  nPWD="${nPWD:0:$leftlen}${shortened}${nPWD:$offset:$maxlen}"
else
  nPWD='\w'
fi
echo "\u@\h:$nPWD\$ "

내 ~/.bash_profile에 추가되었습니다:

function prompt_command {
  export PS1=$(~/.bash_prompt)
}
export PROMPT_COMMAND=prompt_command

출력은 다음과 같습니다

user@machinename:/home/mydirectory1/...another_long_name$

답변4

나는 이것을 사용하고 여러 줄로 줄바꿈하고 길이만큼 들여쓰기하므로 user@host현재가 PS1실제로 " \u@\h:\w$"라고 가정합니다. 경로를 자르지 않고 현재 터미널 너비에 맞춰집니다. 경로만 분할하므로 /매우 긴 디렉터리를 정상적으로 처리하지 못합니다(그러나 선택/복사를 위한 공간은 보존합니다). 이를 통해 항상 최소 20자를 입력할 수 있습니다.

readonly _PS1="${PS1}" 2>/dev/null

function myprompt()
{
    local IFS
    local nn nb pbits xpwd="" ww=60 len=0 pp='\\w\$ '
    local indent uh="${LOGNAME}@${HOSTNAME//.*/}"

    test -n "$COLUMNS" && let ww=$COLUMNS-20  # may be unset at startup

    PS1="${_PS1}"
    if [ ${#PWD} -ge $ww ]; then
        printf -v indent "%${#uh}s%s" " " "> "  # indent strlen(user@host)

        IFS=/ pbits=( $PWD ); unset IFS
        nb=${#pbits[*]}
        for ((nn=1; nn<nb; nn++)) {
            if [ $(( $len + 1 + ${#pbits[$nn]} )) -gt $ww ]; then
                xpwd="${xpwd}/...\n${indent}..."
                len=0
            fi
            xpwd="${xpwd}/${pbits[$nn]}"
            let len=len+1+${#pbits[$nn]}
        }
        # add another newline+indent if the input space is too tight
        if (( ( ${#uh} + len ) > ww )); then
            printf -v xpwd "${xpwd}\n%${#uh}s" " " 
        fi 
        PS1="${PS1/$pp/$xpwd}$ "    
    fi
}
PROMPT_COMMAND=myprompt

이는 마법을 제거하고 \w(이것만 일치 \w$) PS1이를 일반 문자열로 대체하여 $PWD수행됩니다 . PS1에 저장된 원래 값에서 매번 다시 계산됩니다 . _PS1즉, "보이지 않는" 이스케이프도 보존된다는 의미입니다. 전체 원래 프롬프트 문자열 xterm과 굵은 프롬프트는 다음과 같습니다.

PS1="\[\033]0;\u@\h:\w\007\]\[$(tput bold)\]\u@\h\[$(tput sgr0)\]:\w$ "

최종 결과는 80열 터미널입니다.

mr@onomatopoeia:~$ cd /usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace
mr@onomatopoeia:/usr/src/linux/tools/perf/scripts/perl/Perf-Trace-Util/lib/...
               > .../Perf/Trace$ _

이는 bash-3.2부터 사용할 수 있습니다 printf -v var. 왜냐하면다양한 복잡성다른 변형에 대한 일부 조정이 필요합니다 PS1.

(경로는 다음과 같습니다.xterm제목 표시줄은 래핑되거나 축약되지 않습니다. 이는 여기에 있는 다른 답변 중 하나를 위 함수에 통합하여 수행할 수 있습니다. )

관련 정보