我读过维基百科文章/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
此后我尝试将文件移动到/dev/null
:
$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied
因为这给了我一个Permission denied
错误;我继续使用,sudo
就像我遇到Permission denied
错误时通常做的那样。
$ sudo mv test_file /dev/null
命令已成功执行,并且test_file
不再存在于目录中。
但是,维基百科文章说,无法恢复移动到的任何内容/dev/null
,并且它EOF
为任何尝试从中读取的进程提供了权限。但是,我可以从中读取/dev/null
:
$ cat /dev/null
This is written by Aditya
我做错了什么?如何修复才能/dev/null
恢复正常?为什么我Permission denied
一开始会遇到错误?
答案1
/dev/null
是一个文件。一个特殊文件。一个像 /dev/sda 或 /dev/tty 这样的设备文件,用于与系统上的某个硬件进行通信。
唯一的区别/dev/null
是它没有连接任何硬件。你发送给它的任何数据都会被悄悄丢弃。就像下面的命令一样:
echo "Hello World" > /dev/null
这不会在你的终端上打印任何内容,因为你将的输出发送echo
到 null,发送到虚空,从而发送到黑洞。
但当你这样做时,mv test_file /dev/null
你就用一个普通的文本文件替换了这个特殊文件/dev/null
,该文件保存了你的 内容的副本test_file
。换句话说,你丢失了/dev/null
。
现在,您要做的就是(重建它):
sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3
您应该重建它,因为很多脚本默认将输出发送到/dev/null
。如果/dev/null
它不再是一个黑洞,而是一个普通的文本文件,它可能会不断增长并填满您的文件系统。我相信您想避免这种情况。
更危险的是,许多脚本都假设读取/dev/null
不会读到任何内容;违反这一假设可能会导致系统周围的文件中写入随机垃圾……几乎不可能修复。
请记住,Linux 是多任务处理的:当您使用时/dev/null
,许多进程都在运行,即使在几秒钟的“机会窗口”内也可能造成严重破坏。
如果您想玩一下,/dev/null
可以创建一个副本并进行实验:
sudo mknod -m 0666 /tmp/null c 1 3
将创建一个/tmp/null
以完全相同的方式工作的文件,/dev/null
但您可以操作和测试它而不会对您的系统造成任何风险。
答案2
两者之间有很大区别覆盖一个文件和写信给一份文件。
当你写一些东西 /dev/null
例如,
$ echo Hello > /dev/null
...它会被默默丢弃。为此,您需要对 具有写入权限/dev/null
,每个人都有此权限:
$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null
当你覆写 /dev/null
,就像您对mv
命令所做的那样,您将用移动到那里的任何内容替换特殊文件/dev/null
。不要这样做!你需要 root 权限才能执行此操作,因为要覆盖文件,你需要写权限到包含该文件的目录, 在这种情况下/dev
:
$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev
要恢复/dev/null
,请发出命令
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3
答案3
运行命令时
$ sudo mv test_file /dev/null
你有被取代将特殊文件/dev/null
与您的文本文件放在一起。后续尝试读取将/dev/null
返回文本文件的内容,并且尝试/dev/null
以正常方式使用的程序可能会中断。
替换或删除设备文件/dev/
需要超级用户权限,这就是为什么您的非 sudo 尝试失败并出现错误。
有关如何手动恢复的信息,请参阅 Benoit 的回答/dev/null
,但由于大多数(如果不是全部)内容/dev/
都是由 udev 动态管理的,我认为简单的重启也可能会解决这个问题。
答案4
要回答您应该做什么的问题,要删除文件,您可以执行以下操作:
rm test_file
正如其他人所说,/dev/null 是程序输出的目的地。