> /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;
}
就是这样。缓冲区被忽略。
我在 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;
}
就是这样。缓冲区被忽略。