## xe: simple xargs and apply replacement `xe` is a new tool for constructing command lines from file listings or arguments, which includes the best features of `xargs(1)` and `apply(1)`. `xe` means "execute for every ...". ## Benefits Over xargs: * Sane defaults (behaves like `xargs -d'\n' -I{} -n1 -r`). * No weird parsing, arguments are separated linewise or by NUL byte. * Can also take arguments from command-line. * No shell involved unless `-s` is used. * `{}` replacing possible with multiple arguments. Over apply: * Parallel mode. * Sane argument splitting. * Can use shell-syntax instead of escape characters. ## Usage: xe [-0FLRnv] [-I arg] [-N maxargs] [-j maxjobs] COMMAND... | -f ARGFILE COMMAND... | -s SHELLSCRIPT | -a COMMAND... -- ARGS... | -A ARGSEP COMMAND... ARGSEP ARGS... * `-0`: input filenames are separated by NUL bytes (default: newlines). * `-F`: fatal: stop after first failing command. * `-L`: run the commands with line-buffered output; lines from two jobs will not interleave. * `-LL`: prefix each line with the job id in such a manner that the output can be piped to `sort -snk1` to group it by job. * `-R`: return with status 122 when no arguments have been passed. * `-n`: don't run the commands, just print them. * `-v`: print commands to standard error before running them. * `-vv`: print job id and exit status for each command. * `-I`: replace occurrences of *arg* with the argument(s) (default: `{}`). Use an empty *arg* to disable the replace function. * `-N`: pass up to *maxargs* arguments to each COMMAND (default: 1). `-N0` will pass as many arguments as possible. * `-j`: run up to *maxjobs* processes concurrently. `-j0` will run as many processes as there are CPU cores running. `-j2x` will run twice as many processes as there are CPU cores running. * `COMMAND...`: default operation: each command line argument is passed as-is, `{}` is replaced by the argument (not with `-N` > 1). * `-f ARGFILE`: Read arguments from ARGFILE, do not close standard input. * `-s SHELLSCRIPT`: The argument `SHELLSCRIPT` is evaluated using `/bin/sh` with the arguments (up to `-N`) passed as `$1`, `$2`, `$3`... (this behaves as if `/bin/sh -c SHELLSCRIPT -` is passed as plain COMMAND). * `-a`: take arguments from commandline, starting after the first `--`. * `-A`: take arguments from commandline, starting after the first *argsep*. If no argument is passed, default to "printf %s\n". The current iteration is passed as `$ITER` to the child process (increased on every exec()). ## Return code Like GNU and OpenBSD xargs: * 0 on success * 123 if any invocation of the command exited with status 1-125 * 124 if the command exited with status 255 * 125 if the command is killed by a signal * 126 if the command cannot be run * 127 if the command is not found * 1 if some other error occurred. Additionally, 122 is returned when `-R` is passed and no input/arguments were passed. ## Installation Use `make all` to build, `make install` to install relative to `PREFIX` (`/usr/local` by default). The `DESTDIR` convention is respected. You can also just copy the binary into your `PATH`. ## Copyright xe is in the public domain. To the extent possible under law, Leah Neukirchen has waived all copyright and related or neighboring rights to this work. http://creativecommons.org/publicdomain/zero/1.0/