터미널의 배경색을 기반으로 조건부로 작업을 수행하고 싶었는데 다음을 실행하여 파악할 수 있습니다.
printf '\e]11;?\a'
내 경우에는 출력은 다음과 같습니다.
stanton@mybox:~$ printf '\e]11;?\a'
^[]11;rgb:ffff/ffff/ffff^Gstanton@mybox:~$ 11;rgb:ffff/ffff/ffff
이미 혼란스럽습니다. 어쨌든, 나는 다음과 같은 테스트를 실행하려고 생각했습니다.
[ "$(printf '\e]11;?\a')" = "^[]11;rgb:ffff/ffff/ffff^G" ] && echo it\'s light || echo it\'s dark
하지만 작동하지 않습니다. (이스케이프 시퀀스 등이 있든 없든 내 마음에 떠오른 문자열의 가능한 변형을 시도했지만 결과가 없었습니다.)
printf의 출력과 문자열을 비교하려면 어떻게 해야 합니까?
답변1
printf
문제는 의 출력 이 아니라 터미널의 응답을 원한다는 것입니다 . 우리가 볼 수 있듯이 귀하는 $(...)
이 답변을 평가하지 않습니다.
$ v=$(printf '\e]11;?\a')
$ printf "%q\n" "$v"
$'\E]11;?\a'
%q
변수 v는 첫 번째 printf의 출력과 동일합니다($'...'는 문자열을 인용하는 형식의 결과입니다 ).
read
터미널에서 응답을 캡처하려면 셸의 명령을 사용해야 합니다 . 예를 들어, bash를 사용하면 다음과 같습니다.
$ read -n 24 -p "$v" reply
$ printf "%q\n" "$reply"
$'\E]11;rgb:ffff/ffff/ffff\a'
여기서는 -p
변수를 인쇄하는 데 사용되며 $v
변수는 reply
터미널 응답에서 24자를 읽습니다. 최종 printf는 reply
예상한 문자열을 보유하고 있음을 보여줍니다. 그래서 당신은 그것과 비교할 수 있습니다 :
[ "$reply" = $'\e]11;rgb:ffff/ffff/ffff\a' ]