我可以从 /dev/null 读取;如何解决?

Adi*_*tya 81 udev

我阅读了维基百科文章,/dev/null并通过将文件移动到/dev/null.

为此,我创建了一个test_file并在其中放入了一些内容:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya
Run Code Online (Sandbox Code Playgroud)

此后我尝试将文件移动到/dev/null

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied
Run Code Online (Sandbox Code Playgroud)

因为,这给了我一个Permission denied错误;sudo每当我遇到Permission denied错误时,我都会像往常一样继续使用。

$ sudo mv test_file /dev/null
Run Code Online (Sandbox Code Playgroud)

命令成功并且test_file不再存在于目录中。

但是,维基百科文章说无法恢复移动到的任何内容,/dev/null并且它为EOF任何尝试从中读取的进程提供了一个。但是,我可以阅读/dev/null

$ cat /dev/null
This is written by Aditya
Run Code Online (Sandbox Code Playgroud)

我做错了什么,如何/dev/null恢复正常?为什么我首先遇到Permission denied错误?

Ben*_*oit 149

/dev/null是一个文件。一个特殊的文件。像 /dev/sda 或 /dev/tty 这样的设备文件,它与系统上的某个硬件进行通信。

唯一的区别/dev/null是没有任何硬件与它相关联。您发送给它的任何数据都会被悄悄丢弃。像下面的命令:

echo "Hello World" > /dev/null
Run Code Online (Sandbox Code Playgroud)

它不会在您的终端上打印任何内容,因为您将echonull的输出发送到 void,因此是一个黑洞。

但是当你这样做时,mv test_file /dev/null你已经用/dev/null一个普通的文本文件替换了特殊文件,保存了test_file. 换句话说,你已经失去了你的/dev/null.

现在,你要做的是(重建它):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3
Run Code Online (Sandbox Code Playgroud)

您应该重建它,因为默认情况下很多脚本将输出发送到/dev/null. 如果/dev/null它不再是一个黑洞而是一个普通的文本文件,它可能会增长、增长并填满您的文件系统。我相信你想避免这种情况。

更危险的是,很多脚本都假设读取 from/dev/null不会读取任何内容;打破这个假设可能会导致在系统周围的文件中写入随机垃圾......实际上无法修复。

请记住,Linux 是多任务处理的:在您使用 时/dev/null,许多进程正在运行,即使在几秒钟的“机会之窗”期间也可能造成严重破坏。

如果你想玩,/dev/null你可以创建一个副本并试验它:

sudo mknod -m 0666 /tmp/null c 1 3 
Run Code Online (Sandbox Code Playgroud)

将创建一个/tmp/null以完全相同的方式工作的文件,/dev/null但您可以操作和测试该文件,而不会对您的系统造成任何风险。


Mal*_*ppa 17

覆盖文件和写入文件之间有很大的区别。

当你写一些东西时 /dev/null,例如,

$ echo Hello > /dev/null
Run Code Online (Sandbox Code Playgroud)

...它被默默地丢弃了。为此,您需要写入权限/dev/null,每个人都拥有:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null
Run Code Online (Sandbox Code Playgroud)

当您覆盖 时 /dev/null,就像您对mv命令所做的那样,您将特殊文件替换为/dev/null您移动到那里的任何内容。不要这样做!您需要 root 权限这样做的原因是因为要覆盖文件,您需要对包含该文件的目录的写权限,在这种情况下/dev

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev
Run Code Online (Sandbox Code Playgroud)

要恢复/dev/null,请发出命令

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3
Run Code Online (Sandbox Code Playgroud)

(另请参阅U&L StackExchange:如何创建/dev/null


小智 8

当你运行命令时

$ sudo mv test_file /dev/null
Run Code Online (Sandbox Code Playgroud)

您已/dev/null文本文件替换了特殊文件。随后的读取尝试将/dev/null返回文本文件的内容,并且尝试以/dev/null正常方式使用的程序可能会中断。

替换或删除设备文件/dev/需要超级用户权限,这就是您的非 sudo 尝试失败并出现错误的原因。

有关如何/dev/null手动恢复的信息,请参阅 Benoit 的回答,但由于/dev/udev 的大部分(如果不是全部)内容是由 udev 动态管理的,我怀疑简单的重新启动也可能会修复它。


小智 6

要回答您应该做什么的问题,要删除文件,请执行以下操作:

rm test_file
Run Code Online (Sandbox Code Playgroud)

正如其他人所说, /dev/null 是程序输出的目的地。

  • 公平地说,问“我做错了什么”需要解释应该做什么。对于大多数用户来说,这可能是微不足道的,但其他答案甚至都没有提到它。 (7认同)
  • 我没有投反对票,但问题不是关于删除文件......我知道我们使用 `rm` 来删除文件/目录......我只是阅读了关于 `/dev/null` 的内容,以便了解更多关于它的信息,我试图将文件移动到 `/dev/null` 并查看效果.. 这个问题是关于通过将文件移动到 `/dev/null` 来理解我做错了什么,因此我现在可以从中读取...问题不在于如何从系统中删除文件...我希望很清楚...但您的回答仍然受欢迎并且足以作为答案保留... :-) (2认同)