我一直在 /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/null
hx 可以正常工作,因为 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
-s
file
的手册页,即……
- 读取这些文件可能会引起副作用,有时这些副作用是不受欢迎的。
- 从 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。