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 16
Whenever 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
131072
On 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 ...
Get Classic Shell Scripting now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.