이전 줄이 명령인지 확인하세요.

이전 줄이 명령인지 확인하세요.

활성화하고 싶습니다Windows 터미널 셸 통합배쉬에서. (저를 판단하지 마십시오.) 좋은 기능은 터미널이 각 명령의 스크롤 막대에 마커를 표시할 수 있다는 것입니다. 그 색상은 명령 실행의 성공 여부에 따라 달라집니다. 그러나 명령이 실행되지 않으면(빈 줄, Ctrl-C...) 색상은 중간색으로 유지되어야 합니다.

이는 프롬프트에 특수 이스케이프 시퀀스를 배치하여 수행됩니다. 현재 프롬프트의 단순화된 버전은 다음과 같습니다.

PS1="\[\e]133;D;\$?\a\] \$ \[\e]133;B\a\]"

거기에서 \e]133;D;\$?\a이전 명령의 끝을 표시하고 ;\$?최종 반환 코드를 포함하여 터미널이 어떻게 끝났는지 알 수 있습니다. (그리고 \e]133;B\a프롬프트의 끝을 표시합니다.) 제 생각에는아니요;\$?이전 입력이 명령이 아닌 경우 포함됩니다(다시: 빈 줄, Ctrl-C...).

이 상황을 감지할 수 있는 방법이 있나요?

위에 링크된 문서는 PowerShell용 솔루션을 제공하지만 이를 Bash에 적용하는 방법을 모르겠습니다. PowerShell은 각 기록 항목에 대한 고유 ID를 유지하고 각 프롬프트를 표시하기 전에 일부 논리로 전역 변수를 업데이트합니다. 반면에 내가 아는 한 bash는 그러한 ID를 유지하지 않습니다.

zsh 솔루션이 있다면 저도 채택하겠습니다.

답변1

다음 코드는 Bash 5.2.15에서 작동합니다.

_debug() { [ "$BASH_COMMAND" != _prompt_command ] && SHOW_STATUS=1; }
_prompt_command() { STATUS=";$?"; [ -z "$SHOW_STATUS" ] && STATUS=; SHOW_STATUS=; }
PROMPT_COMMAND=_prompt_command
trap _debug DEBUG
PS1="\$STATUS \$ "

이는 명령과 비명령을 합리적으로 구별하고 그에 따라 ;\$?프롬프트에 포함되거나 포함되지 않을 수 있는 개념 증명입니다. DEBUG명령이 아닌 경우에는 트랩이 실행되지 않기 때문에 작동합니다 .

불행하게도 이와 같은 하위 쉘은 (echo foo)트랩을 트리거하지 않으며 명시적인 하위 쉘 파이프(예: (echo foo) | (cat))도 작동하지 않습니다. 이것이 내 솔루션의 결함입니다. 그럼에도 불구하고 이러한 명령은 대화형 셸에서는 거의 발생하지 않을 수 있으므로(내 작업 흐름에서는 이러한 명령이 극히 드물다는 것을 알고 있습니다) 이 결함이 사소하다는 것을 알게 되기를 바랍니다.

귀하의 경우 정의 라인은 다음 PS1과 같아야 합니다.

PS1="\[\e]133;D\$STATUS\a\] \$ \[\e]133;B\a\]"

하지만 Windows 터미널에서는 테스트할 수 없습니다.

관련 정보