是否有任何控制字符或 hack 来阻止简单的命令行工具显示后续数据?

是否有任何控制字符或 hack 来阻止简单的命令行工具显示后续数据?

我想隐藏丑陋的数据,使其不被命令行工具(也可能是简单的文本编辑器)显示,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

文件结尾被欺骗到简单的基于流的文本查看器工具,尤其是 Linux 命令行工具(但也可能是某些 Windows 工具)?

我正在寻找混合文本/二进制文件中的解决方案,以便其他使用cat或类似文件的人不会在屏幕上看到垃圾。

答案1

一种“解决方案”是使用许多(但不是全部)终端支持的替代屏幕缓冲区。考虑以下命令:

printf "Hello, \e[?1049h ABCDEFG \e[?1049l World\n"

在支持替代屏幕缓冲区的终端上,您会看到

Hello,  World!

可能是终端突然闪烁。

\e[?1049h序列将导致终端切换到备用屏幕缓冲区,之后打印的所有内容都将在此结束。该\e[?1049l序列将切换回主屏幕缓冲区。

一个使用 php 的例子:

<?php
echo "Hello";
// Nothing to see here...^[[?1049h
echo ", World!\n";
//^[[?1049l
?>

其中^[代表转义字符。

许多喜欢创建终端用户界面但希望在关闭后恢复终端内容的程序都使用替代屏幕缓冲区。就是这样较少的可以使用整个窗口显示内容,但退出后,之前的所有命令仍然可见。如果你有解缓冲安装后,您可以验证这一点:

$ unbuffer less -f /dev/null | xxd
00000000: 1b5b 3f31 3034 3968 1b3d 0d0d 1b5b 4b1b  .[?1049h.=...[K.

如您所见,打印的第一件事是\x1b[?1049h导致终端切换屏幕缓冲区。

这不适用于任何编辑器(据我所知),因为大多数编辑器不会尝试显示不可打印的字符。

相关内容