에서 영감을 받다이 포럼 게시물, Bash 프롬프트에서 다음 명령을 실행했습니다.
echo -e '\e]4;40;?\a'
어떤 출력:
# 4;rgb:8b8b/cdcd/0000
그러나 이상한 점은 출력이 내 프롬프트 위에 인쇄되는 대신 내 프롬프트의 다음 명령이 된다는 것입니다.
"4;rgb:8b8b/cdcd/0000" 텍스트를 변수에 저장하고 싶지만 놀랍게도 다음과 같은 문제가 발생합니다.
output=$(echo -e '\e]4;30;?\a')
echo "$output"
이것과 동일:
echo -e '\e]4;30;?\a' | awk -F ":" ' { print $1 } '
"4;rgb:8b8b/cdcd/0000" 출력을 변수에 저장하거나 파이프하려면 어떻게 해야 합니까?
도와주셔서 감사합니다!
.
편집: 답장을 보내주셔서 감사합니다! 그러나 동일한 문제가 발생합니다.
out=`eval "echo -e '\e]4;40;?\a'"`; echo $out
.
그런 다음 $out 변수의 하위 문자열을 생성하려고 시도했지만 "4;rgb" 대신 빈 줄이 인쇄되었습니다.
substring=${out:0:5}; echo "$substring"
.
나는 또한 이것을 시도했습니다 :
out=`eval "echo -e '\e]4;40;?\a'"`; echo $out | awk -F ":" ' { print $1 } '
awk는 "4;rgb" 대신 빈 줄로 응답하고 다음 명령으로 "4;rgb:8b8b/cdcd/0000"이 프롬프트에 나타납니다.
답변1
얻는 문자열은 4;rgb:8b8b/cdcd/0000
실제로 echo 명령의 출력이 아니라 터미널 에뮬레이터로 전송된 에코 문자열의 부작용입니다. 터미널 에뮬레이터는 해당 문자를 입력한 것처럼 출력하여 반응합니다.
쉘은 이를 알지 못하므로 빈 문자열 출력을 캡처하려고 시도합니다.
원하는 것을 달성하는 한 가지 방법은 다음과 같습니다.
script -qc "echo -e '\e]4;40;?\a';read foo" /tmp/foo
out=$(tail -1 /tmp/foo)
이에 대한 몇 가지 설명은 다음과 같습니다. 이 script
명령은 화면에 표시된 모든 것을 캡처합니다. 이 명령은 터미널 에뮬레이터가 원하는 문자열을 출력하기 전에 명령이 완료되는 것을 read foo
방지하는 것입니다 . script
이 tail -1
명령은 이 명령으로 생성된 원치 않는 행을 제거합니다 script
.
답변2
도구를 추가하는 대신 아마도 갖고 있는 도구를 사용할 수 있습니다(그리고 그 과정에서 무언가를 배울 수도 있습니다). 사용하고 싶다면강아지리눅스효과적으로, 이것은좋은 것.
다음은 쉘만 사용한 간단한 예입니다.cat
,printf
,stty
그리고tty
(예제는 이러한 프로그램에서 제공하는 이식 불가능한 기능을 사용하지 않지만 GNU CoreUtils의 모든 부분):
#!/bin/sh
# $Id: osc4-demo,v 1.2 2016/04/03 12:50:20 tom Exp $
# A simple demo for retrieving a color using xterm's OSC 4 control
osc4_demo() {
result=$(
old=$(stty -g);
stty raw -echo min 0 time 2;
printf '\033]4;%d;?\007' "$1" >$(tty);
cat $(tty);
stty $old
)
echo "asked $1, result: $(echo "$result" | cat -v)"
}
for code in "$@"
do
osc4_demo $code
done
스크립트는 result
변수를 설정하고 이를 인쇄 가능한 형식으로 표시합니다. 예를 들어:
$ osc4-demo 4 44 144 244
asked 4, result: ^[]4;4;rgb:0000/0000/eeee^G
asked 44, result: ^[]4;44;rgb:0000/d7d7/d7d7^G
asked 144, result: ^[]4;144;rgb:afaf/afaf/8787^G
asked 244, result: ^[]4;244;rgb:8080/8080/8080^G
터미널을 일시적으로 원시 모드로 변경하고 개행을 종료하지 않고 값을 다시 읽을 수 있는 방식으로 작동합니다. 이것이 본질적으로 이러한 도구가 수행하는 작업입니다.
스크립트가 실제 보내기/받기를 수행하므로 tty
결과를 파일로 리디렉션할 수 있습니다. 결과를 생성하는 데 사용되는 -v
옵션cat
읽을 수 있는(실제 변수는 제어 문자를 제어하지만)
추가하는 것을 고려 중입니다
exec < /dev/tty
이를 개선하려면 다른 xterm 기반 스크립트(예를 들어 참조)실행 사용내부에고급 Bash 스크립팅 가이드), 그러나 이것이 Debian dash에서는 도움이 되지 않는다는 것을 발견했습니다.
이 형식을 고집하는 사람들에게는 여러 줄 표현을 한 줄로 압축할 수도 있지만 일반적으로 명확성을 잃습니다.
추가 자료:
답변3
xtermcontrol --get-colorN
처음 16가지 색상을 사용할 수도 있습니다 . 안타깝게도 전체 256 색상 팔레트를 지원하지 않습니다.
답변4
다음을 사용해 보십시오 eval
( eval
다음에 대한 정보를 찾을 수 있습니다).여기)
out=`eval "echo -e '\e]4;40;?\a'"`; echo $out
내용은 $out에 저장되며 포함할 때만 인쇄됩니다.echo $out