Ubuntu 14.04 이상에서는 bash
내 PS1
변수가 다음으로 끝납니다.
\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제목 표시줄은 래핑되거나 축약되지 않습니다. 이는 여기에 있는 다른 답변 중 하나를 위 함수에 통합하여 수행할 수 있습니다. )