>/dev/null如何占用输出流?

cs9*_*s95 2 unix bash dev-null

/dev/null在bash编程中使用了很多东西将不必要的输出发送到黑洞.

例如,这个命令:

$ echo 'foo bar' > /dev/null
$ 
Run Code Online (Sandbox Code Playgroud)

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

tso*_*tso 5

>/dev/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,
};
Run Code Online (Sandbox Code Playgroud)

write_null是写入/ dev/null时调用的.它总是返回与您写入的字节数相同的字节数:

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

而已.缓冲区只是被忽略了.