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”作为下一个命令出现在我的提示中。
您获得的字符串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。