Bash 프롬프트는 긴 명령을 중단하지 않습니다

Bash 프롬프트는 긴 명령을 중단하지 않습니다

- 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_COMMANDBash는 각 명령에 대해 내부에서 코드를 실행합니다.

복사/붙여넣기 문제가 있는 경우,스크립트를 다운로드할 수 있습니다.

산출

설명하다

  • (( ))산술입니다 bash. 참조http://wiki.bash-hackers.org/syntax/arith_expr
  • PROMPT_COMMAND: 설정된 경우 이 값은 각 기본 프롬프트가 실행되기 전에 명령으로 실행됩니다. 바라보다man bash | less +/PROMPT_COMMAND
  • tputANSI 이스케이프 코드를 하드코딩하는 것보다 낫습니다. 바라보다http://wiki.bash-hackers.org/scripting/terminalcodes
  • PIPESTATUS: 포그라운드 파이프라인에서 가장 최근에 실행된 프로세스에 대한 종료 상태 값 목록을 포함하는 배열 변수입니다(단일 명령만 포함할 수 있음). 바라보다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 노트북

관련 정보