Running Commands: xargs
When find produces a
list of files, it is often useful to be able to supply that list as
arguments to another command. Normally, this is done with the shell's
command substitution feature, as in this example of searching for the
symbol POSIX_OPEN_MAX in system
header files:
$ grep POSIX_OPEN_MAX /dev/null $(find /usr/include -type f | sort)
/usr/include/limits.h:#define _POSIX_OPEN_MAX 16Whenever you write a program or a command that deals with a list
of objects, you should make sure that it behaves properly if the list is
empty. Because grep reads standard
input when it is given no file arguments, we supplied an argument of
/dev/null to ensure that it does not
hang waiting for terminal input if find produces no output: that will not happen
here, but it is good to develop defensive programming habits.
The output from the substituted command can sometimes be lengthy, with the result that a nasty kernel limit on the combined length of a command line and its environment variables is exceeded. When that happens, you'll see this instead:
$ grep POSIX_OPEN_MAX /dev/null $(find /usr/include -type f | sort)
/usr/local/bin/grep: Argument list too long.That limit can be found with getconf:
$ getconf ARG_MAX
Get system configuration value of ARG_MAX
131072On the systems that we tested, the reported values ranged from a low of 24,576 (IBM AIX) to a high of 1,048,320 (Sun Solaris).
The solution to the ARG_MAX problem is provided by xargs: it takes a list of arguments on ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access