> /dev/null 如何吃掉输出流?

How does > /dev/null eat up output streams?

我在 bash 编程中经常使用 /dev/null 来将不必要的输出发送到黑洞中。

例如,这个命令:

$ echo 'foo bar' > /dev/null
$ 

不会echo任何东西。我读到 /dev/null 是一个空文件,用于通过重定向处理不需要的输出。但这种处置究竟是如何进行的呢?我无法想象 /dev/null 将内容写入文件然后立即删除该文件。那么当你重定向到这个文件时到底发生了什么?

>/dev/null 将命令标准输出重定向到 null 设备,这是一种特殊设备,会丢弃写入它的信息。 这都是通过 file_operations 实现的(drivers/char/mem.c 如果你对自己感兴趣的话):

static const struct file_operations null_fops = {
    .llseek     = null_lseek,
    .read       = read_null,
    .write      = write_null,
    .splice_write   = splice_write_null,
};

write_null就是写/dev/null时调用的。它始终 returns 与您写入的字节数相同:

static ssize_t write_null(struct file *file, const char __user *buf,
              size_t count, loff_t *ppos)
{
    return count;
}

就是这样。缓冲区被忽略。