The cat
command does not operate on nothing; it operates on standard input, up until it is told that the input is ended. As Rampion notes, the cat
command is not necessary here, but it is operating on its implicit input (standard input), not on nothing.
The xargs
command reads the output from cat
, and groups the information into arguments to the man
command specified as its (only) argument. When it reaches a limit (configurable on the command line), it will execute the man
command.
The find ... -print0 | xargs -0 ...
idiom deals with file names that contain awkward characters such as blanks, tabs and newlines. The find
command prints each filename followed by an ASCII NUL ('\0'
); this is one of two characters that cannot appear in a simple file name - the other being '/' (which appears in path names, of course, but not in simple file names). It is not directly equivalent to the sequence you provide; xargs
groups collections of file names into a single argument list, up to a size limit. If the names are short enough (they usually are), then there will be fewer executions of grep
than there are file names.
Note, too, the grep
only prints the file name where the material is found if it has more than one file to search -- or if it supports an option so that it always prints the file names and the option is used: '-H
' is a GNU extension to grep
that does this. The portable way to ensure that the file names always appear is to list /dev/null
as the first file (so 'xargs grep something /dev/null
'); it doesn't take long to search /dev/null
.