(As this does not answer the question, this is should have been a comment, but is too long - so treat it as a comment).
As an alternative to FreeBSD's xargs you can use GNU Parallel which does not have this limitation. It even supports repeating the context:
seq 10 | parallel -Xj1 echo con{}text
seq 10 | parallel -mj1 echo con{}text
GNU Parallel is a general parallelizer and makes is easy to run jobs in parallel on the same machine or on multiple machines you have ssh access to. It can often replace a for
loop.
If you have 32 different jobs you want to run on 4 CPUs, a straight forward way to parallelize is to run 8 jobs on each CPU:
GNU Parallel instead spawns a new process when one finishes - keeping the CPUs active and thus saving time:
Installation
If GNU Parallel is not packaged for your distribution, you can do a personal installation, which does not require root access. It can be done in 10 seconds by doing this:
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
For other installation options see http://git.savannah.gnu.org/cgit/parallel.git/tree/README
Learn more
See more examples: http://www.gnu.org/software/parallel/man.html
Watch the intro videos: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Walk through the tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html
Sign up for the email list to get support: https://lists.gnu.org/mailman/listinfo/parallel
If I understand you correctly, you just want to insert the contents of javaoptions.txt
into your java command. If so, xargs
is no help. That's for running the same command on each line of output of another command. All you need here is
java $(cat javaoptions.txt) ClassName
Personally, however, I would write a function for this:
runJava(){
javaOpts="-Xmx4g -Djava.io.tmpdir=/tmp/foo" ## random example
java $javaOpts "$@" ## run the java command with the options
}
Add that to your ~/.bashrc
(or equivalent for your shell) and you can run:
runJava Classname
To run
java -Xmx4g -Djava.io.tmpdir=/tmp/foo Classname
Best Answer
I am not sure this is what you were expecting, but in the BSD world (such as macOS)
-I
and-J
differ in how they pass the multiple "lines" to the command. Example:So with
-I
, xargs will run the command for each element passed to it individually. With-J
, xargs will execute the command once and concatenate all the elements and pass them as arguments all together.Some commands such as
rm
ormkdir
can take multiple arguments and act on them the same way as if you passed a single argument and ran them multiple times. But some apps may change depending how you pass arguments to them. For instance thetar
. You may create a tar file and then add files to it or you may create a tar file by adding all the files to it in one go.