为什么(以及如何)在二进制文件上使用 cat 会弄乱终端?

Kiw*_*iwy 9 terminal binary cat

如果我cat正确理解手册:

连接文件并在标准输出上打印

cat将文件作为参数并将它们打印在标准输出上。
我没有得到的是,如果我使用命令:

cat img.png > copy.png
Run Code Online (Sandbox Code Playgroud)

如果我只是,我将获得 2 个相同的 png 文件

cat img.png  
Run Code Online (Sandbox Code Playgroud)

我很有可能我的终端搞砸了并误解了我输入的内容。

  • 这怎么可能?
  • 二进制值仍然是二进制数据。为什么它不简单地显示一系列 0 和 1 或这些二进制数据的 ASCII 解释或终端中的任何编码?
  • 这种行为是否也可以通过cating 包含奇怪字符的文本文件来实现?
  • 是否应该实现像 try{}catch{} 语句这样的机制来防止这种行为?

X T*_*ian 8

cat 将命令行上作为参数给出的文件连接到标准输出,它一次读取字节,默认情况下不对其读取的字节执行任何解释。

在您的第一个示例中,您将标准输出重定向到一个文件,这就是您获得新文件的原因。

在您的第二个示例中,字节被写入终端,终端将字符序列解释为终端的控制序列,这就是您在终端上出现异常行为的原因。它与此无关catcat不知道您将如何处理它的输出。您可能会通过管道将其发送到另一个程序来解释/处理/打印或播放“雨中歌唱”。

所以遵循unix哲学,

做一件事,只做一件事,但要做好

cat 不应该试图再次猜测您正在尝试做什么。

编辑下面@kiwy 的第一条评论的 1 条回复。

是和否,让我解释一下,

不,如果您cat使用终端,因为它(终端软件)正在将输出发送到您的屏幕或解释控制序列(它正在模拟旧硬件,即电传设备)。

但,

是的,如果您转到管道并且接收的程序可以将字符解释为命令。

以 cat this 为例,cat anyOldShellScript | bashbash 会将它获取的内容解释为命令。

  • @Kiwy 控制字符在你的键盘上不存在,但是如果你选择的话,你可以让 `echo` 输出它们。请参阅 http://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux 了解如何操作和 http://www.termsys.demon.co。 uk/vtansi.htm 了解一些可能的内容 (3认同)