![Bash 프롬프트는 긴 명령을 중단하지 않습니다](https://linux55.com/image/27273/Bash%20%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8%EB%8A%94%20%EA%B8%B4%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%A4%91%EB%8B%A8%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
- hostname(screen#):directory$
마지막 명령이 성공적으로 완료되면 녹색, 실패하면 빨간색으로 표시되는 bash 프롬프트를 설정하려고 합니다 . 지금까지 내가 가지고 있는 것은 다음과 같습니다. 실제로 작업을 수행하지만 명령이 래핑되면 표시 문제를 일으키는 것 같습니다.
PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\` - \h(${WINDOW}):\W$\e[00m "
구글링해서 찾은 질문매우 도움이 되는 게시물입니다한 의견에서는 인쇄되지 않는 문자를 래핑하여 이 문제를 방지한다고 언급 \\[
했습니다 \\]
. 그래서 다음을 시도했지만 문제가 해결되지 않았고 색상 변경도 중단되었습니다.
PS1="\[\`if [[ \$? = "0" ]]; then echo '\e[32m'; else echo '\e[31m' ; fi\`\] - \h(${WINDOW}):\W$\[\e[00m\] "
이 프롬프트의 구조(색상 포함)를 유지하면서 긴 명령이 올바르게 표시되도록 수정하려면 어떻게 해야 합니까?
답변1
색상이 이상한 프롬프트가 표시되는데 이제 bash는 내 터미널의 너비를 모르는 것 같습니다. 줄 바꿈이 잘못되었습니다.
이 작업을 수행하는 또 다른 올바른 방법이 있습니다. 이 코드를 귀하의 코드에 넣거나 ~/.bashrc
새 파일을 만든 다음 다음을 수행하십시오 source file
.
PROMPT_COMMAND=$(
cat<<-'EOF'
retval=$?
RED=$(tput setaf 1)
GREEN=$(tput setaf 2)
STOP=$(tput sgr0)
# arithmetic using bash parameter expansion on a array
if (($retval + ${PIPESTATUS[@]/%/+} + 0)); then
PS1="\[$RED\]\u@\h:\w$ \[$STOP\]"
else
PS1="\[$GREEN\]\u@\h:\w$ \[$STOP\]"
fi
EOF
)
그게 다야 =)
PROMPT_COMMAND
Bash는 각 명령에 대해 내부에서 코드를 실행합니다.
복사/붙여넣기 문제가 있는 경우,스크립트를 다운로드할 수 있습니다.
설명하다
(( ))
산술입니다bash
. 참조http://wiki.bash-hackers.org/syntax/arith_exprPROMPT_COMMAND
: 설정된 경우 이 값은 각 기본 프롬프트가 실행되기 전에 명령으로 실행됩니다. 바라보다man bash | less +/PROMPT_COMMAND
tput
ANSI 이스케이프 코드를 하드코딩하는 것보다 낫습니다. 바라보다http://wiki.bash-hackers.org/scripting/terminalcodesPIPESTATUS
: 포그라운드 파이프라인에서 가장 최근에 실행된 프로세스에 대한 종료 상태 값 목록을 포함하는 배열 변수입니다(단일 명령만 포함할 수 있음). 바라보다man bash | less +/PIPESTATUS
cat<<-'EOF'
특별하다여기에 문서가 있습니다: 이-
문자는 코드를 들여쓸 수 있다는 의미이고, 작은따옴표는'EOF'
변수가 삽입되지 않았음을 의미합니다.
답변2
2줄 프롬프트가 있으므로 잠재적으로 긴 내용이 명령줄에 영향을 주지 않습니다.
glennj@homebase ~/tmp
2219 $ set | grep PS1=
PS1='\n\u@\h \w\n\! \$ '
답변3
\\[
뿐만 아니라 \[
. \[
처음에는 여분의 것이 있습니다.
답변4
이것은 원래 질문에 대한 직접적인 대답이 아니며 단지 사용 예일뿐입니다.
@stArdustͲ의 답변을 바탕으로 터미널 오른쪽 상단에 배터리 * 상태를 표시하도록 명령 프롬프트를 사용자 정의하는 올바른 솔루션을 찾았습니다 . 색상은 내에서 별도의 파일로 정의됩니다 .bashrc
.
PROMPT_COMMAND=$(
cat<<-'EOF'
function battery_percentage {
PERCENTAGE=$(upower -i $(echo $(upower -e |grep 'battery')) |grep 'percentage' |sed -e 's/^[ \t]*//;s/[[:space:]]\+/ /g;s/[ \t]*$//' |cut -d' ' -f2 |cut -d"%" -f1)
BColor='IGray'
if [ "${PERCENTAGE}" -lt 15 ]
then PColor='BlinkIRed'
PBackground='On_White'
else PColor='Gray'
fi
echo "\001${!BColor}\002Battery\001${!PColor}\002 ${PERCENTAGE}% \001${Reset}\002"
}
function battery_time {
TIME=$(upower -i $(echo $(upower -e |grep 'battery')) |grep 'time' |sed -e 's/^[ \t]*//;s/[[:space:]]\+/ /g;s/[ \t]*$//' |cut -d' ' -f4,5)
echo "\001${IGray}\002${TIME}\001${Reset}\002"
}
export PS1="\[\e[s\]\[\e[1;\$((COLUMNS-26))f\]$(battery_percentage) $(battery_time)\[\e[u\]${PS1}"
EOF
)
결국 다음 PS1
과 같습니다.
\[\e[s\]\[\e[1;$((COLUMNS-26))f\]\001\e[0;38;5;8m\002Battery\001\e[0;38;5;7m\002 82% \001\e[0m\002 \001\e[0;38;5;8m\0023.6 hours\001\e[0m\002\[\e[u\]\[\e[0;38;5;232m\]\[\e[48;5;5m\] \u \[\e[0;38;5;5m\]\[\e[48;5;11m\] \[\e[0;38;5;232m\]\[\e[48;5;11m\]@\H \[\e[0;38;5;11m\]\[\e[48;5;0m\]\[\e[0m\] \[\e[0;38;5;6m\]\w\a \[\e[1;38;5;5m\]→\e[0m
노트,하지만 명령 기록을 위아래로 스크롤할 때 커서 위치 지정 문제가 있었습니다.
* ThinkPad 노트북