如何将“echo -e '\e]4;40;?\a'”的输出保存到变量中,或通过管道传输?

如何将“echo -e '\e]4;40;?\a'”的输出保存到变量中,或通过管道传输?

灵感来自这个论坛帖子,我在 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,sttytty(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

尝试使用evaleval可以找到关于这里

out=`eval "echo -e '\e]4;40;?\a'"`; echo $out

内容存储在 $out 中,只有当我包含时才会打印它们echo $out

相关内容