灵感来自这个论坛帖子,我在 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 命令的输出,而是发送到终端模拟器的回显字符串的副作用,终端模拟器通过输出这些字符对其做出反应,就像您键入它们一样。
shell 不知道这一点,这就是尝试捕获空字符串输出结果的原因。
这是实现您想要的目标的一种方法:
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
您可以使用您可能拥有的工具,而不是添加工具(并在此过程中学习一些东西)。如果你想使用小狗Linux有效地,这将是一个好东西。
这是一个仅使用 shell 的简单示例,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 的破折号没有帮助。
对于那些坚持这种形式的人来说,多行表达式当然可以折叠成单行,但通常会失去清晰度。
进一步阅读:
答案3
您还可以使用xtermcontrol --get-colorN
前 16 种颜色。可惜它不支持整个 256 调色板。
答案4
尝试使用eval
(eval
可以找到关于这里)
out=`eval "echo -e '\e]4;40;?\a'"`; echo $out
内容存储在 $out 中,只有当我包含时才会打印它们echo $out