/dev/null 是什么,为什么我不能在其上使用 hx?

/dev/null 是什么,为什么我不能在其上使用 hx?

我一直在 /dev 中查找,偶然发现了几个文件,包括null。我想查看文件中的内容,所以我这样做了hx null,但什么也没发生,并给出了错误File null is not a regular file。是什么导致了此消息?

答案1

/dev中的几个对象伪设备并直接由核函数处理。最常用的是:

  • /dev/null:无限容量的通用接收器。用于丢弃输出:尝试echo foo >/dev/null。从中读取将返回一个空字节流(立即 EOF)。
  • /dev/zero:无限字节源0x00。通常用作输入,用 0 覆盖内容。
  • /dev/random/dev/urandom:无限的随机字节来源。

答案2

确实,其他答案似乎都没有真正回答为什么 hx 拒绝使用 /dev/null 的问题。hx 之所以这样反应,只是因为它被编程为针对设备文件输出此错误消息。

https://github.com/krpors/hx/blob/develop/editor.c#L125

if (!S_ISREG(statbuf.st_mode)) {
        fprintf(stderr, "File '%s' is not a regular file\n", filename);
        exit(1);

这意味着 hx 明确拒绝处理任何非常规文件。我认为没有很好的理由进行此项检查 - 如果没有它,我认为/dev/nullhx 可以正常工作,因为 hx 会读取一个空文件,并且在保存时对它的任何更新都会丢失。

(假设https://github.com/krpors/hx/确实是海报上说的 hx 程序)

答案3

/dev/null基本上是一种丢弃信息的方法。

主要目的只是能够将事物转移到遗忘之地。

echo 'duck' > /dev/null

echo 'duck'将抑制所发送的消息/dev/null,因此将其丢弃。

这主要用于使用命令给出您不想看到的输出时。

读取后/dev/null立即返回文件末尾 — — 即,它就像一个空文件。

还有其他有趣的东西,/dev比如random会给你随机数据;并不是你对“文件”的期望 :) 值得注意的是,这/dev/random是从系统使用情况中收集的真正随机数据(按键之间的时间等),并且该池可能很快就会耗尽。/dev/urandom给你一个看似随机的数字,但却是通过数学公式计算出来的。通常/dev/urandom可以满足您的需求,但对于非常强大的加密密钥来说,这还不够好。

您还可以读取/dev/zero以获得无限的零(空)字节流。

答案4

/dev/null是字符设备文件,即设备驱动程序的接口。

此特定设备是虚拟设备(不代表真实硬件)。它被特意设计为无底垃圾桶;您可以将任何程序的输出转储到其中,以防您不想将它们显示出来或放在其他地方。

  • 从内容上看,如果你真的尝试这个文件 (是的,就是你阅读),它会总是相当于一个长度为 0 字节的空文件

我不知道你的hx命令是什么,但根据你的描述我猜这是一个识别文件类型的命令通过其内容。我在 GNU/Linux 系统上用于此任务的命令是file,如果发现该文件不是常规文件,它也会停止……

$ file /dev/null
/dev/null: character special

但是file命令还提供了一个-s选项,强制它无论如何都读取......

$ file -s /dev/null
/dev/null: empty

也许您的hx命令有一个类似的选项可供使用?

默认情况下不识别非常规文件file(也许你的命令也是如此)的原因在选项的文档中有所暗示hx-sfile的手册页,即……

  • 读取这些文件可能会引起副作用,有时这些副作用是不受欢迎的。
    • 从 FIFO 管道读取会永久消耗其中的数据,您无法将已读取的数据推回到管道中。
    • 读取设备文件会导致设备改变......
      • 从磁带设备读取会导致磁带头位置发生偏移。
      • 从串行端口设备读取会导致缓冲输入字节被消耗。
      • 从随机数设备读取会导致系统的熵池耗尽。
      • 还有更多,取决于相关设备的驱动程序。
  • 识别这些特殊文件按内容需要做更多的工作,而且确定性更低:
    • 内容大小无法提前得知(或者需要特殊的系统特定ioctl()调用才能获取)。
    • 在很多情况下,寻求是行不通的。
    • 依赖于文件结束签名的文件类型检测将需要读取整个内容。
    • 其中一些文件提供无穷内容。

如果您的程序不是为处理所需的工作而设计的,那么它可能无法识别非常规文件的内容;并且作为安全预防措施中止。

  • 如果该项目没有经过安全检查就继续进行,可能会导致悬挂, A碰撞或更糟的是,导致系统内存不足;取决于相关程序的设计。

如果是这种情况,那么这是程序的限制;file -s请将其用于识别目的。


附录

如果你hx一些十六进制/二进制编辑那么它尤其不建议使用它来打开你不知道的特殊文件。十六进制編輯通常预紧整个文件进入内存以供您进行编辑操作。

因此,如果你尝试让它打开一个无限内容的设备文件(如/dev/zero/dev/urandom)甚至一个大的有限设备(如/dev/sda),它可能会使你的系统陷入内存不足的情况,您可能需要重置整个机器才能恢复。

您刚刚触发的安全检查很可能是为了保护您免受这种情况的影响。(如前所述:设备文件的内容大小是无法提前知道的——程序无法预先确定您是否有足够的内存来加载它)

万一您只是想“查看”文件的标题;使用十六进制查看者反而, 喜欢hexdump(推荐),或老式的od。 例如:

  • hexdump -C -n 512 /dev/null(内容将为空)
  • hexdump -C -n 512 /dev/urandom(每次内容都会是不同的胡言乱语)

^ 该-n 512选项将视图限制为前 512 个字节。但即使您忽略了这一点,并被无尽的输出轰炸,您只需按 即可停止它Ctrl+C

相关内容