问题描述
我阅读了/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
错误;无论何时遇到Permission denied
错误,我都会像往常一样使用sudo
。
$ 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
错误?
最佳解决办法
/dev/null
是一个文件。一个特殊的文件。像/dev /sda或/dev /tty这样的设备文件可以与系统中的一块硬件进行通信。
与/dev/null
的唯一区别是没有硬件与其链接。您发送给它的任何数据都将被丢弃。像下面的命令一样:
echo "Hello World" > /dev/null
这将不会在您的终端上打印任何内容,因为您将echo
的输出发送到空白处,因此发生黑洞。
但是当你做mv test_file /dev/null
时,你已经用普通的文本文件替换了特殊文件/dev/null
,并保存了test_file
的内容副本。换句话说,你已经失去了你的/dev/null
。
现在,你需要做的是(重建它):
sudo rm /dev/null
sudo mknod /dev/null c 1 3
sudo chmod 666 /dev/null
chmod
需要修复his answer中hope中记录的权限。
你应该重建它,因为很多脚本通过默认输出发送到/dev/null
。如果/dev/null
不再是一个黑洞,而是一个普通的文本文件,它可能会增长,增长并填充您的file-system。我相信你想避免这种情况。
而且更危险的是,很多脚本都假定从/dev/null
读取的内容什么都不会读取;打破这个假设可能导致随机垃圾写入您系统周围的文件中……实际上不可能修复。
请记住,Linux是multi-tasking:当你与/dev/null
玩,有很多的进程正在运行,甚至在几秒钟的“机会之窗”可以肆虐。
如果你想玩/dev/null
,你可以创建一个副本并进行实验:
sudo mknod -m 0666 /tmp/null c 1 3
将创建一个与/dev/null
完全相同的/tmp/null
文件,但您可以在没有任何系统风险的情况下进行操作和测试。
次佳解决办法
@Benoit在his answer中几乎正确。您还需要修复权限。
$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ ls -l /dev/null
crw-r--r-- 1 root root 1, 3 Mar 18 08:38 /dev/null
$ sudo chmod 666 /dev/null
$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Mar 18 08:38 /dev/null
这会恢复权限。否则,作为non-root用户,您将无法使用echo foo > /dev/null
。
第三种解决办法
覆盖文件和写入文件有很大的区别。
当您向/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
(另请参阅U& L StackExchange:如何创建/dev/null
)
第四种办法
当你运行命令
$ sudo mv test_file /dev/null
您已将特殊文件/dev/null
替换为您的文本文件。随后尝试从/dev/null
读取返回您的文本文件的内容,并试图以正常方式使用/dev/null
的程序可能会中断。
替换或删除/dev/
中的设备文件需要超级用户权限,这就是您的non-sudo尝试失败并出现错误的原因。
有关如何手动恢复/dev/null
的信息,请参阅Benoit的答案,但由于大多数(如果不是全部)/dev/
的内容由udev动态管理,我怀疑简单的重启也可能会修复它。
第五种办法
要回答你应该做什么的问题,要删除一个文件,你需要:
rm test_file
正如其他人所说的,/dev /null是程序输出的目的地。