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

Apo*_*lia 2 shell bash terminal

受此论坛帖子的启发,我在 Bash 提示符下运行了此命令:

echo -e '\e]4;40;?\a'
Run Code Online (Sandbox Code Playgroud)

哪些输出:

# 4;rgb:8b8b/cdcd/0000
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,输出不知何故变成了我的提示的下一个命令,而不是打印在我的提示上方。

我想将“4;rgb:8b8b/cdcd/0000”文本保存在一个变量中,但令我惊讶的是,当我这样做时,同样的问题发生了:

output=$(echo -e '\e]4;30;?\a')
echo "$output"
Run Code Online (Sandbox Code Playgroud)

同样的:

echo -e '\e]4;30;?\a'   |   awk  -F ":"  ' { print $1 } '
Run Code Online (Sandbox Code Playgroud)

如何将“4;rgb:8b8b/cdcd/0000”输出保存到变量中,或通过管道传输?

谢谢你的帮助!

.

编辑:感谢您的回复!但是,同样的问题也会发生:

out=`eval "echo -e '\e]4;40;?\a'"`; echo $out
Run Code Online (Sandbox Code Playgroud)

.

然后我尝试创建 $out 变量的子字符串,但是,这打印了一个空行而不是“4;rgb”:

substring=${out:0:5}; echo "$substring"
Run Code Online (Sandbox Code Playgroud)

.

我也试过这个:

out=`eval "echo -e '\e]4;40;?\a'"`; echo $out |  awk  -F ":"  ' { print $1 } '
Run Code Online (Sandbox Code Playgroud)

awk 响应一个空行(而不是“4;rgb”),然后“4;rgb:8b8b/cdcd/0000”作为下一个命令出现在我的提示中。

jll*_*gre 5

您获得的字符串4;rgb:8b8b/cdcd/0000实际上并不是 echo 命令的输出,而是将回显字符串发送到您的终端仿真器的副作用,后者通过输出这些字符对其做出反应,就像您键入它们一样。

shell 不知道它,这就是尝试捕获输出结果为空字符串的原因。

这是一种实现您想要的方法:

script -qc "echo -e '\e]4;40;?\a';read foo" /tmp/foo
out=$(tail -1 /tmp/foo)
Run Code Online (Sandbox Code Playgroud)

这里有一些关于它的解释:该script命令捕获屏幕上显示的所有内容,read foo一个是为了防止script命令在终端模拟器输出您想要获取的字符串之前完成。该tail -1命令正在剥离该命令生成的不需要的行script