쉘 프롬프트에서 사용되는 이스케이프 코드를 에코와 같은 다른 곳에서 사용할 수 있습니까?

쉘 프롬프트에서 사용되는 이스케이프 코드를 에코와 같은 다른 곳에서 사용할 수 있습니까?

예:

  • 내가 달릴 때

    echo -e "\[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]"
    

    인쇄된 응답은 다음과 같습니다.

    \[\][    \u (\#th) | \w]$\[\]
    

    첫 번째 이후 와 마지막 이전의 \[모든 것은 \]주황색 갈색입니다.

  • 그러나 명령 프롬프트를 다음으로 설정하면

    \[\033[;33m\][\t \u (\#th) | \w]$\[\033[0m\]
    

    명령 프롬프트는 다음과 같이 인쇄됩니다.

    [21:55:17 {username} (89th) | {current directory path}]$
    

    전체 명령 프롬프트는 주황색-갈색입니다.

어쨌든 내 질문은 다음과 같습니다. 명령 프롬프트 디자인( echo, catless포함)을 명령 프롬프트인 것처럼 인쇄할 수 있습니까?

답변1

Bash 4.4+에서는 인용된 콘텐츠를 생성하는 ${var@P}방법과 유사하게 를 사용할 수 있습니다 .${var@Q}var3.5.3 쉘 매개변수 확장매뉴얼 페이지 하단에 있습니다.

$ printf "%s\n" "${var}" 
\[\033[00;32m\]\w\[\033[00m\]\$
$ printf "%s\n" "${var@P}"  |od -tx1z
0000000 01 1b 5b 30 30 3b 33 32 6d 02 2f 74 6d 70 01 1b  >..[00;32m./tmp..<
0000020 5b 30 30 6d 02 24 0a                             >[00m.$.<
0000027

또는 없이 후자를 실행하는 경우 od현재 경로가 녹색으로 표시되어야 합니다.

and for and를 인쇄 합니다 \001. 이것들은 당신에게 별로 유용하지 않을 수도 있습니다. 임시 변수와 문자열 대체 확장을 사용하여 이를 제거할 수 있습니다.\002\[\]

$ printf -v pst "%s\n" "${var@P}" 
$ pst=${pst//[$'\001\002']}
$ printf "%s\n" "$pst" |od -tx1z
0000000 1b 5b 30 30 3b 33 32 6d 2f 74 6d 70 1b 5b 30 30  >.[00;32m/tmp.[00<
0000020 6d 24 0a 0a                                      >m$..<
0000024

Zsh에는 다음이 있습니다 print -P.

$ print -P "%F{green}%d%F{normal}%#" |od -tx1z
0000000 1b 5b 33 32 6d 2f 74 6d 70 2f 61 61 61 1b 5b 33  >.[32m/tmp/aaa.[3<
0000020 39 6d 25 0a                                      >9m%.<

및 매개변수 확장 플래그는 위 의 Bash와 유사 %하므로 결과 문자열 을 .${(%)var}${var@P}print -v othervar -P "..."othervar=${(%)var}othervar


\uBash와 같은 경우 에는 and를 대신 \w사용할 수 있지만 or와 같은 경우에는 쉽지 않을 수 있습니다.$USER$PWD\#\j

관련 정보