Mavericks에서 iTerm2를 사용하고 있습니다. $TERM
로 설정됩니다 xterm-256color
. 이것을 명령 줄에 인쇄하면 :
echo -e "\e[0;36m xxx \e[0m"
콘솔에서 오류가 발생하면 경고음이 울리고 출력은 다음과 같습니다.
xxx " xxx
올바른 색상으로. 내가 무엇을 놓치고 있는지에 대한 아이디어가 있습니까?
이 동작의 가능한 이유는 ~/.zshrc
.NET과 같은 특수 문자를 인용하지 않고 현재 실행중인 명령 줄을 포함하도록 터미널 제목을 업데이트하는 일부 설정이 있기 때문일 수 있습니다 \e
.
실제로 제목을 업데이트하는 줄은 다음과 같습니다.
print -n -- "\e]2; $commandline \a"
그 대신에 \e]2;
일 수도 있고 \e]0;
그 대신 print -n
일 수도 있습니다 echo -en
.
중요한 부분은 이것이 터미널에 인쇄하는 데 사용되는 것과 동일한 명령이라는 것입니다. 그러나 \e]2;
와 \a
( "종"문자) 사이의 모든 것은 터미널에 인쇄되는 대신 터미널 제목으로 이동합니다.
하지 않는 한은 $commandline
같은 일부 특수 문자가 포함 \a
나 \e
. 이러한 경우 출력의 일부 또는 전체가 제목 대신 터미널에 인쇄 될 수 있습니다.
귀하의 경우에는 첫 번째 \e
에서 echo
인터럽트하여 터미널 제목의 설정을 한 후 모든게 터미널로 이동합니다. 즉, 출력의 첫 번째 부분은- xxx "
터미널 제목의 실패한 설정에서 비롯되고 두 번째 부분은- xxx
의 실제 출력입니다 echo
.
이 동작을 방지하려면 터미널로 보낼 모든 것을 제목으로 올바르게 인용해야합니다.
내에서는 ~/.zshrc
명령 줄을 정리 한 후 터미널 제목을 설정하는 데 다음과 같은 내용이 있습니다.
settermtitle () {
# save the first argument in commandline if given, else use empty string
local commandline="${1:-}"
# remove special whitespaces (newline, tab, vertical tab, etc)
commandline=$(print -nr -- "$cl" | tr "\n\t\v\f\r" " ")
# quote print specials
commandline=${(V)commandline}
# quote backslashes
commandline=${commandline//\\/\\\\}
print -n -- "\e]2; iTerm2 - $commandline\a"
}
preexec_title () {
settermtitle "$1"
}
add-zsh-hook preexec preexec_title
먼저 공백을 공백 문자로 바꿉니다. 그런 다음 인쇄 할 수없는 문자를 표시합니다. 같은 - 그리고 마지막으로 나는 탈출 문자로 문제를 방지하기 위해 남아있는 백래쉬를 인용 \e
-에 $commandline
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다