Qua*_*one 3 command-line shell text-processing streams
我想隐藏丑陋的数据,以免被命令行工具cat
(也可能是简单的文本编辑器)显示,这些工具经常被二进制数据混淆。例如,VT100 终端有时会被二进制输出错误配置。
<?php
// PHP code shown by text tools on the command line
__halt_compiler();
// here some fake EOF mark for simple text processing tools
// hidden ugly data
Run Code Online (Sandbox Code Playgroud)
能否最终文件是伪造的,以简单的基于流的文本浏览器的工具,特别是对Linux的命令行工具(但也许还有些窗口工具)?
我正在从混合文本/二进制文件中寻找解决方案,以便其他使用cat
或类似文件的人不会在他们的屏幕上看到垃圾。
一种“解决方案”是使用许多(但不是全部)终端支持的替代屏幕缓冲区。考虑以下命令:
printf "Hello, \e[?1049h ABCDEFG \e[?1049l World\n"
Run Code Online (Sandbox Code Playgroud)
在支持替代屏幕缓冲区的终端上,您会看到
Hello, World!
Run Code Online (Sandbox Code Playgroud)
可能是终端突然闪烁。
该\e[?1049h
序列将导致终端切换到备用屏幕缓冲区,之后打印的所有内容都将在此处结束。的\e[?1049l
序列切换回主画面缓冲器。
以 php 为例:
<?php
echo "Hello";
// Nothing to see here...^[[?1049h
echo ", World!\n";
//^[[?1049l
?>
Run Code Online (Sandbox Code Playgroud)
where^[
代表转义字符。
替代屏幕缓冲区被许多喜欢创建终端用户界面但希望在关闭后恢复终端内容的程序使用。这就是less可以使用整个窗口显示内容的方式,但是在退出时,所有先前的命令仍然可见。如果您安装了unbuffer,您可以验证这一点:
$ unbuffer less -f /dev/null | xxd
00000000: 1b5b 3f31 3034 3968 1b3d 0d0d 1b5b 4b1b .[?1049h.=...[K.
Run Code Online (Sandbox Code Playgroud)
如您所见,打印的第一件事是\x1b[?1049h
导致终端切换屏幕缓冲区。
这不适用于任何编辑器(我知道),因为大多数编辑器不会尝试显示不可打印的字符。