我阅读了维基百科文章,/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)
它不会在您的终端上打印任何内容,因为您将echo
null的输出发送到 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 是程序输出的目的地。