When trying to redirect to /dev/null
and /dev/zero
, the output it is discarded. It seems both /dev/null
and /dev/zero
accept and discard all input. So, what is the difference between /dev/null
and /dev/zero
?
Asked
Active
Viewed 4.0k times
61

Rui F Ribeiro
- 56,709
- 26
- 150
- 232

Pandya
- 24,618
1 Answers
92
Yes, both accept and discard all input, but their output is not the same:
/dev/null
produces no output./dev/zero
produces a continuous stream of NULL (zero value) bytes.
You can see the difference by executing cat /dev/null
and cat /dev/zero
.
Try
cat /dev/null > file
and you will find an emptyfile
.Now try
cat /dev/zero > file
, while watching the size of the file (watch -n 1 du -h file
) continuously increase. This is because reading from/dev/zero
gives an endless stream of\0
(null) characters.
Use dd
to visualize the difference more appropriately:
$ dd if=/dev/null of=file count=10
0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000276193 s, 0.0 kB/s
$ dd if=/dev/zero of=file count=10
10+0 records in
10+0 records out
5120 bytes (5.1 kB) copied, 0.00090775 s, 5.6 MB/s
/dev/zero
is used to create dummy files or swap.
Also visit:
-
-
3Worth noting:
mmap
ping/dev/zero
withMAP_PRIVATE
is the "portable" way to obtain an anonymous memory mapping (in the absence of extensions likeMAP_ANON
). – nneonneo Jan 10 '16 at 23:11 -
13Perhaps not obvious to the casual reader is just how
/dev/null
produces no output: It signals EOF immediately. – Peter - Reinstate Monica Jan 11 '16 at 04:30 -
2
-
5hi @AaronFranke, Oh sure!
:-)
Consider output of/dev/zero
as a stream of potential all-ones bytes: we just need to replace each all-zeros byte with an all-ones byte. An all-ones byte is377
in octal (asprintf '%o\n' $((2#11111111))
tells us);tr '\000' '\377' </dev/zero >/tmp/all-ones.dat
will swiftly generate a huge pile of all-ones bytes. – Vainstein K Jan 12 '21 at 06:03
rm -f /dev/zero ; echo -n 111111111111 > /dev/zero
*runs away* – joeytwiddle Jan 10 '16 at 19:23