diff --git a/doc/citation-notice-faq.txt b/doc/citation-notice-faq.txt index 30977115..3d0046fd 100644 --- a/doc/citation-notice-faq.txt +++ b/doc/citation-notice-faq.txt @@ -25,7 +25,7 @@ single solution that just works: * https://web.archive.org/web/20210923091339/https://blog.licensezero.com/2019/08/26/but-you-said.html * https://www.numfocus.org/blog/why-is-numpy-only-now-getting-funded/ * https://feross.org/funding-experiment-recap/ - +* https://www.fordfoundation.org/media/2976/roads-and-bridges-the-unseen-labor-behind-our-digital-infrastructure.pdf == Is the citation notice compatible with GPLv3? == diff --git a/doc/haikus b/doc/haikus index a090a768..7cde98a7 100644 --- a/doc/haikus +++ b/doc/haikus @@ -4,6 +4,18 @@ Quote of the month: +Colorful output +parallel, with --color flag +tasks more vibrant now + +--line-buffer, a flag +parallel, now more precise +Output is in sync + + +write a haiku about gnu parallel and the :::+ option + + Got around to using GNU parallel for the first time from a suggestion by @jdwasmuth ... now I'm wishing I started using this years ago -- Stefan Gavriliuc @GavriliucStefan@twitter diff --git a/doc/release_new_version b/doc/release_new_version index d0263255..4849694f 100644 --- a/doc/release_new_version +++ b/doc/release_new_version @@ -262,7 +262,7 @@ from:tange@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org stable-bcc: Jesse Alama -Subject: GNU Parallel 20230122 ('Pele/MashaAmina<<>>') released +Subject: GNU Parallel 20230122 ('Bolsanaro+Brasilia/Pele/MashaAmina<<>>') released GNU Parallel 20230122 ('<<>>') has been released. It is available for download at: lbry://@GnuParallel:4 @@ -278,6 +278,8 @@ News about GNU Parallel: https://www.purevpn.com/blog/the-best-hacking-tools-of-2023/#11_GNU_Parallel +https://www.vivaolinux.com.br/artigo/GNU-Parallel-criando-atividades-em-paralelo-com-shell-script/ + this is wrong-https://climbtheladder.com/10-gnu-parallel-best-practices/ <<>> diff --git a/src/Makefile.am b/src/Makefile.am index 7264c3d8..c113c4fb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,36 +8,58 @@ bin_SCRIPTS = parallel sql niceload parcat parset parsort \ env_parallel.ksh env_parallel.mksh env_parallel.pdksh \ env_parallel.sh env_parallel.tcsh env_parallel.zsh +POD_FILES = parcat.pod parset.pod sem.pod parallel.pod \ + env_parallel.pod niceload.pod parallel_examples.pod \ + parallel_tutorial.pod parallel_book.pod parallel_design.pod \ + parallel_alternatives.pod + +MAN_FILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \ + parallel_examples.7 parallel_tutorial.7 parallel_book.7 \ + parallel_design.7 parallel_alternatives.7 parcat.1 parset.1 \ + parsort.1 + +PDF_MAN = parallel.pdf env_parallel.pdf sem.pdf sql.pdf \ + niceload.pdf parallel_examples.pdf parallel_tutorial.pdf \ + parallel_book.pdf parallel_design.pdf \ + parallel_alternatives.pdf parcat.pdf parset.pdf parsort.pdf + +PDF_OTHER = parallel_cheat_bw.pdf parallel_options_map.pdf + +PDF_FILES = $(PDF_MAN) $(PDF_OTHER) + +RST_FILES = parallel.rst env_parallel.rst sem.rst sql.rst \ + niceload.rst parallel_examples.rst parallel_tutorial.rst \ + parallel_book.rst parallel_design.rst \ + parallel_alternatives.rst parcat.rst parset.rst parsort.rst + +TEXI_FILES = parallel.texi env_parallel.texi sem.texi sql.texi \ + niceload.texi parallel_examples.texi parallel_tutorial.texi \ + parallel_book.texi parallel_design.texi \ + parallel_alternatives.texi parcat.texi parset.texi \ + parsort.texi + +HTML_FILES = parallel.html env_parallel.html sem.html sql.html \ + niceload.html parallel_examples.html parallel_tutorial.html \ + parallel_book.html parallel_design.html \ + parallel_alternatives.html parcat.html parset.html \ + parsort.html + install-exec-hook: rm "$(DESTDIR)$(bindir)"/sem || true $(LN_S) parallel "$(DESTDIR)$(bindir)"/sem if DOCUMENTATION -man_MANS = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \ - parallel_examples.7 parallel_tutorial.7 parallel_book.7 \ - parallel_design.7 parallel_alternatives.7 parcat.1 parset.1 \ - parsort.1 -doc_DATA = parallel.html env_parallel.html sem.html sql.html \ - niceload.html parallel_examples.html parallel_tutorial.html \ - parallel_book.html parallel_design.html \ - parallel_alternatives.html parcat.html parset.html \ - parsort.html \ - parallel.texi env_parallel.texi sem.texi sql.texi \ - niceload.texi parallel_examples.texi parallel_tutorial.texi \ - parallel_book.texi parallel_design.texi \ - parallel_alternatives.texi parcat.texi parset.texi \ - parsort.texi \ - parallel.rst env_parallel.rst sem.rst sql.rst niceload.rst \ - parallel_examples.rst parallel_tutorial.rst parallel_book.rst \ - parallel_design.rst parallel_alternatives.rst parcat.rst \ - parset.rst parsort.rst \ - parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf \ - parallel_examples.pdf parallel_tutorial.pdf parallel_book.pdf \ - parallel_design.pdf parallel_alternatives.pdf parcat.pdf \ - parset.pdf parsort.pdf parallel_cheat_bw.pdf \ - parallel_options_map.pdf +man_MANS = $(MAN_FILES) +doc_DATA = $(HTML_FILES) $(TEXI_FILES) $(RST_FILES) $(PDF_FILES) endif +DISTCLEANFILES = $(MAN_FILES) $(HTML_FILES) $(TEXI_FILES) \ + $(RST_FILES) $(PDF_FILES) + + +EXTRA_DIST = $(bin_SCRIPTS) sem $(POD_FILES) \ + parallel_cheat_bw.fodt pod2graph $(DISTCLEANFILES) + web: sphinx true @@ -381,36 +403,3 @@ parallel_options_map.pdf: parallel.pod pod2graph sem: parallel ln -fs parallel sem -DISTCLEANFILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \ - parallel_examples.7 parallel_tutorial.7 parallel_book.7 \ - parallel_design.7 parallel_alternatives.7 parcat.1 parset.1 \ - parsort.1 \ - parallel.html env_parallel.html sem.html sql.html \ - niceload.html parallel_examples.html parallel_tutorial.html \ - parallel_book.html parallel_design.html \ - parallel_alternatives.html parcat.html parset.html \ - parsort.html \ - parallel.texi env_parallel.texi sem.texi sql.texi \ - niceload.texi parallel_examples.texi parallel_tutorial.texi \ - parallel_book.texi parallel_design.texi \ - parallel_alternatives.texi parcat.texi parset.texi \ - parsort.texi \ - parallel.rst env_parallel.rst sem.rst sql.rst niceload.rst \ - parallel_examples.rst parallel_tutorial.rst parallel_book.rst \ - parallel_design.rst parallel_alternatives.rst parcat.rst \ - parset.rst parsort.rst \ - parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf \ - parallel_examples.pdf parallel_tutorial.pdf parallel_book.pdf \ - parallel_design.pdf parallel_alternatives.pdf parcat.pdf \ - parset.pdf parsort.pdf parallel_cheat_bw.pdf \ - parallel_options_map.pdf - -EXTRA_DIST = parallel sem sql niceload parcat parset parsort \ - env_parallel env_parallel.ash env_parallel.bash \ - env_parallel.csh env_parallel.dash env_parallel.fish \ - env_parallel.ksh env_parallel.mksh env_parallel.pdksh \ - env_parallel.sh env_parallel.tcsh env_parallel.zsh parcat.pod \ - parset.pod sem.pod parallel.pod env_parallel.pod niceload.pod \ - parallel_examples.pod parallel_tutorial.pod parallel_book.pod \ - parallel_design.pod parallel_alternatives.pod \ - parallel_cheat_bw.fodt pod2graph $(DISTCLEANFILES) diff --git a/src/parallel b/src/parallel index d229afb5..32ca0b9d 100755 --- a/src/parallel +++ b/src/parallel @@ -1955,7 +1955,7 @@ sub options_completion_hash() { # Before changing these lines, please read # https://www.gnu.org/software/parallel/parallel_design.html#citation-notice # https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt - # You accept to be put in a public hall of shame by removing + # You accept to be put in a public hall-of-shame by removing # these lines. ("bibtex|citation". "[Print the citation notice and BibTeX entry for GNU parallel, ". @@ -2194,8 +2194,7 @@ sub parse_options(@) { # Before changing these line, please read # https://www.gnu.org/software/parallel/parallel_design.html#citation-notice # https://git.savannah.gnu.org/cgit/parallel.git/tree/doc/citation-notice-faq.txt - # You accept to be added to a public hall of shame by - # removing the lines. + # You accept to be added to a public hall-of-shame by removing the lines. if(defined $opt::citation) { citation(\@argv_before,\@ARGV); wait_and_exit(0); @@ -3557,7 +3556,7 @@ sub shell_quote_scalar_default($) { # $shell_quoted = string quoted as needed by the shell local $_ = $_[0]; if(/[^-_.+a-z0-9\/]/i) { - s/'/'"'"'/g; # "-quote '-quotes + s/'+/'"$&"'/g; # "-quote '-quotes: ''' => "'''" $_ = "'$_'"; # '-quote entire string s/^''//; # Remove unneeded '' at ends s/''$//; # (faster than s/^''|''$//g) diff --git a/src/parallel_alternatives.pod b/src/parallel_alternatives.pod index 2d737742..bd983548 100644 --- a/src/parallel_alternatives.pod +++ b/src/parallel_alternatives.pod @@ -104,7 +104,7 @@ The following features are in some of the comparable tools: =over -=item E1. Running jobs in parallel +=item E1. Run jobs in parallel =item E2. List running jobs @@ -246,7 +246,7 @@ the last half of the line is from another process. The example B cannot be done reliably with B because of this. To see this in action try: - parallel perl -e '\$a=\"1\".\"{}\"x10000000\;print\ \$a,\"\\n\"' \ + parallel perl -e "'"'$a="1"."{}"x10000000;print $a,"\n"'"'" \ '>' {} ::: a b c d e f g h # Serial = no mixing = the wanted result # 'tr -s a-z' squeezes repeating letters into a single letter @@ -417,7 +417,8 @@ using GNU B: 1$ find /path/to/files -type f | parallel gzip - 2$ ./ppss.sh standalone -d /path/to/files -c 'cp "$ITEM" /destination/dir ' + 2$ ./ppss.sh standalone -d /path/to/files \ + -c 'cp "$ITEM" /destination/dir ' 2$ find /path/to/files -type f | parallel cp {} /destination/dir @@ -435,9 +436,11 @@ using GNU B: ./ppss deploy -C config.cfg ./ppss start -C config - 5$ # parallel does not use configs. If you want a different username put it in nodes.txt: user@hostname + 5$ # parallel does not use configs. If you want + # a different username put it in nodes.txt: user@hostname find source/dir -type f | - parallel --sshloginfile nodes.txt --trc {.}.mp3 lame -a {} -o {.}.mp3 --preset standard --quiet + parallel --sshloginfile nodes.txt --trc {.}.mp3 \ + lame -a {} -o {.}.mp3 --preset standard --quiet 6$ ./ppss stop -C config.cfg @@ -1124,7 +1127,7 @@ file. GNU B does not. https://github.com/reconquest/orgalorg -=head2 DIFFERENCES BETWEEN Rust parallel AND GNU Parallel +=head2 DIFFERENCES BETWEEN Rust parallel(mmstick) AND GNU Parallel Rust parallel focuses on speed. It is almost as fast as B, but not as fast as B. It implements a few features from GNU @@ -2618,18 +2621,26 @@ You can then do: =head3 EXAMPLES FROM rargs MANUAL - ls *.bak | rargs -p '(.*)\.bak' mv {0} {1} - ls *.bak | parallel mv {} {.} + 1$ ls *.bak | rargs -p '(.*)\.bak' mv {0} {1} - cat download-list.csv | rargs -p '(?P.*),(?P.*)' wget {url} -O {filename} - cat download-list.csv | parallel --csv wget {1} -O {2} + 1$ ls *.bak | parallel mv {} {.} + + 2$ cat download-list.csv | + rargs -p '(?P.*),(?P.*)' wget {url} -O {filename} + + 2$ cat download-list.csv | + parallel --csv wget {1} -O {2} # or use regexps: - cat download-list.csv | - parallel --rpl '{url} s/,.*//' --rpl '{filename} s/.*?,//' wget {url} -O {filename} + 2$ cat download-list.csv | + parallel --rpl '{url} s/,.*//' --rpl '{filename} s/.*?,//' \ + wget {url} -O {filename} - cat /etc/passwd | rargs -d: echo -e 'id: "{1}"\t name: "{5}"\t rest: "{6..::}"' - cat /etc/passwd | - parallel -q --colsep : echo -e 'id: "{1}"\t name: "{5}"\t rest: "{=6 $_=join":",@arg[6..$#arg]=}"' + 3$ cat /etc/passwd | + rargs -d: echo -e 'id: "{1}"\t name: "{5}"\t rest: "{6..::}"' + + 3$ cat /etc/passwd | + parallel -q --colsep : \ + echo -e 'id: "{1}"\t name: "{5}"\t rest: "{=6 $_=join":",@arg[6..$#arg]=}"' https://github.com/lotabout/rargs (Last checked: 2020-01) @@ -2944,7 +2955,7 @@ composed commands. 8$ # GNU Parallel does not need to stop a server -https://github.com/ctbur/async/ (Last checked: 2020-11) +https://github.com/ctbur/async/ (Last checked: 2023-01) =head2 DIFFERENCES BETWEEN pardi AND GNU Parallel @@ -2989,14 +3000,16 @@ parallel>). 2$ pardi -n 1 -i data/test_in.types -o data/test_out.types \ -d 'r:^#atoms:' -w 'cat %IN > %OUT' - 2$ cat data/test_in.types | parallel -n 1 -k --pipe --cat \ - --regexp --recstart '^#atoms' 'cat {}' > data/test_out.types + 2$ cat data/test_in.types | + parallel -n 1 -k --pipe --cat --regexp --recstart '^#atoms' \ + 'cat {}' > data/test_out.types 3$ pardi -c 6 -i data/test_in.types -o data/test_out.types \ -d 'r:^#atoms:' -w 'cat %IN > %OUT' - 3$ cat data/test_in.types | parallel -n 6 -k --pipe --cat \ - --regexp --recstart '^#atoms' 'cat {}' > data/test_out.types + 3$ cat data/test_in.types | + parallel -n 6 -k --pipe --cat --regexp --recstart '^#atoms' \ + 'cat {}' > data/test_out.types 4$ pardi -i data/decoys.mol2 -o data/still_decoys.mol2 \ -d 's:@MOLECULE' -w 'cp %IN %OUT' @@ -3069,9 +3082,11 @@ Summary (see legend above): 1$ simple_gpu_scheduler --gpus 0 1 2 < gpu_commands.txt 1$ parallel -j3 --shuf \ - CUDA_VISIBLE_DEVICES='{=1 $_=slot()-1 =} {=uq;=}' < gpu_commands.txt + CUDA_VISIBLE_DEVICES='{=1 $_=slot()-1 =} {=uq;=}' \ + < gpu_commands.txt - 2$ simple_hypersearch "python3 train_dnn.py --lr {lr} --batch_size {bs}" \ + 2$ simple_hypersearch \ + "python3 train_dnn.py --lr {lr} --batch_size {bs}" \ -p lr 0.001 0.0005 0.0001 -p bs 32 64 128 | simple_gpu_scheduler --gpus 0,1,2 @@ -3086,7 +3101,7 @@ Summary (see legend above): simple_gpu_scheduler --gpus 0,1,2 3$ parallel --header : --shuf \ - CUDA_VISIBLE_DEVICES='{=1 $_=slot()-1; seq() > 5 and skip() =}' \ + CUDA_VISIBLE_DEVICES='{=1 $_=slot()-1; seq()>5 and skip() =}' \ python3 train_dnn.py --lr {lr} --batch_size {bs} \ ::: lr 0.001 0.0005 0.0001 ::: bs 32 64 128 @@ -3592,6 +3607,188 @@ https://github.com/ctbur/async (Last checked: 2023-01) +=head2 DIFFERENCES BETWEEN tandem AND GNU Parallel + +Summary (see legend above): + +=over + +=item - - - I4 - - N/A + +=item M1 - - - - M6 + +=item - - O3 - - - - N/A - - + +=item E1 - E3 - E5 - - + +=item - - - - - - - - - + +=item - - + +=back + +B runs full commands in parallel. It is made for starting a +"server", running a job against the server, and when the job is done, +the server is killed. + +More generally: it kills all jobs when the first job completes - +similar to '--halt now,done=1'. + +B silently discards some output. It is unclear exactly when +this happens. It looks like a race condition, because it varies for +each run. + + $ tandem "seq 10000" | wc -l + 6731 <- This should always be 10002 + + +=head3 EXAMPLES FROM Demo + + tandem \ + 'php -S localhost:8000' \ + 'esbuild src/*.ts --bundle --outdir=dist --watch' \ + 'tailwind -i src/index.css -o dist/index.css --watch' + + # Emulate tandem's behaviour + PARALLEL='--color --lb --halt now,done=1 --tagstring ' + PARALLEL="$PARALLEL'"'{=s/ .*//; $_.=".".$app{$_}++;=}'"'" + export PARALLEL + + parallel ::: \ + 'php -S localhost:8000' \ + 'esbuild src/*.ts --bundle --outdir=dist --watch' \ + 'tailwind -i src/index.css -o dist/index.css --watch' + + +=head3 EXAMPLES FROM tandem -h + + # Emulate tandem's behaviour + PARALLEL='--color --lb --halt now,done=1 --tagstring ' + PARALLEL="$PARALLEL'"'{=s/ .*//; $_.=".".$app{$_}++;=}'"'" + export PARALLEL + + 1$ tandem 'sleep 5 && echo "hello"' 'sleep 2 && echo "world"' + + 1$ parallel ::: 'sleep 5 && echo "hello"' 'sleep 2 && echo "world"' + + # '-t 0' fails. But '--timeout 0 works' + 2$ tandem --timeout 0 'sleep 5 && echo "hello"' \ + 'sleep 2 && echo "world"' + + 2$ parallel --timeout 0 ::: 'sleep 5 && echo "hello"' \ + 'sleep 2 && echo "world"' + +=head3 EXAMPLES FROM tandem's readme.md + + # Emulate tandem's behaviour + PARALLEL='--color --lb --halt now,done=1 --tagstring ' + PARALLEL="$PARALLEL'"'{=s/ .*//; $_.=".".$app{$_}++;=}'"'" + export PARALLEL + + 1$ tandem 'next dev' 'nodemon --quiet ./server.js' + + 1$ parallel ::: 'next dev' 'nodemon --quiet ./server.js' + + 2$ cat package.json + { + "scripts": { + "dev:php": "...", + "dev:js": "...", + "dev:css": "..." + } + } + + tandem 'npm:dev:php' 'npm:dev:js' 'npm:dev:css' + + # GNU Parallel uses bash functions instead + 2$ cat package.sh + dev:php() { ... ; } + dev:js() { ... ; } + dev:css() { ... ; } + export -f dev:php dev:js dev:css + + . package.sh + parallel ::: dev:php dev:js dev:css + + 3$ tandem 'npm:dev:*' + + 3$ compgen -A function | grep ^dev: | parallel + +For usage in Makefiles, include a copy of GNU Parallel with your +source using `parallel --embed`. This has the added benefit of also +working if access to the internet is down or restricted. + +https://github.com/rosszurowski/tandem +(Last checked: 2023-01) + + +=head2 DIFFERENCES BETWEEN rust-parallel(aaronriekenberg) AND GNU Parallel + +Summary (see legend above): + +=over + +=item I1 I2 I3 - - - - + +=item - - - - - M6 + +=item O1 O2 O3 - O5 O6 - N/A - O10 + +=item E1 - - E4 - - - + +=item - - - - - - - - - + +=item - - + +=back + +B has a goal of only using Rust. It seems it is +impossible to call bash functions from the command line. You would +need to put these in a script. + +Calling script that miss the shebang line (#! as first line) fails. + +=head3 EXAMPLES FROM rust-parallel's README.md + + $ cat >./test <$TMPDIR/$$ - # Generate 10 MB output that will not be buffered due to full disk + # Generate 10 MB output that will not be buffered + # due to full disk perl -e 'print "X"x10_000_000' | head -c 10M echo This part is missing from incomplete output sleep 2 diff --git a/testsuite/wanted-results/parallel-local-ssh5 b/testsuite/wanted-results/parallel-local-ssh5 index eebf500a..6a664ed8 100644 --- a/testsuite/wanted-results/parallel-local-ssh5 +++ b/testsuite/wanted-results/parallel-local-ssh5 @@ -129,92 +129,92 @@ par_command_len_shellquote -Slo -j10 ' 1 7 1 1 2188 par_command_len_shellquote -Slo -j10 ' 1 8 1 1 6562 par_command_len_shellquote -Slo -j10 ' 1 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 1 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 2 1 1 1 9 -par_command_len_shellquote -Slo -j10 ' 2 2 1 1 27 -par_command_len_shellquote -Slo -j10 ' 2 3 1 1 81 -par_command_len_shellquote -Slo -j10 ' 2 4 1 1 243 -par_command_len_shellquote -Slo -j10 ' 2 5 1 1 729 -par_command_len_shellquote -Slo -j10 ' 2 6 1 1 2187 -par_command_len_shellquote -Slo -j10 ' 2 7 1 1 6561 +par_command_len_shellquote -Slo -j10 ' 2 1 1 1 5 +par_command_len_shellquote -Slo -j10 ' 2 2 1 1 11 +par_command_len_shellquote -Slo -j10 ' 2 3 1 1 29 +par_command_len_shellquote -Slo -j10 ' 2 4 1 1 83 +par_command_len_shellquote -Slo -j10 ' 2 5 1 1 245 +par_command_len_shellquote -Slo -j10 ' 2 6 1 1 731 +par_command_len_shellquote -Slo -j10 ' 2 7 1 1 2189 par_command_len_shellquote -Slo -j10 ' 2 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 2 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 2 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 3 1 1 1 14 -par_command_len_shellquote -Slo -j10 ' 3 2 1 1 44 -par_command_len_shellquote -Slo -j10 ' 3 3 1 1 134 -par_command_len_shellquote -Slo -j10 ' 3 4 1 1 404 -par_command_len_shellquote -Slo -j10 ' 3 5 1 1 1214 -par_command_len_shellquote -Slo -j10 ' 3 6 1 1 3644 -par_command_len_shellquote -Slo -j10 ' 3 7 1 1 10xxx +par_command_len_shellquote -Slo -j10 ' 3 1 1 1 6 +par_command_len_shellquote -Slo -j10 ' 3 2 1 1 12 +par_command_len_shellquote -Slo -j10 ' 3 3 1 1 30 +par_command_len_shellquote -Slo -j10 ' 3 4 1 1 84 +par_command_len_shellquote -Slo -j10 ' 3 5 1 1 246 +par_command_len_shellquote -Slo -j10 ' 3 6 1 1 732 +par_command_len_shellquote -Slo -j10 ' 3 7 1 1 2190 par_command_len_shellquote -Slo -j10 ' 3 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 3 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 3 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 4 1 1 1 19 -par_command_len_shellquote -Slo -j10 ' 4 2 1 1 61 -par_command_len_shellquote -Slo -j10 ' 4 3 1 1 187 -par_command_len_shellquote -Slo -j10 ' 4 4 1 1 565 -par_command_len_shellquote -Slo -j10 ' 4 5 1 1 1699 -par_command_len_shellquote -Slo -j10 ' 4 6 1 1 5101 -par_command_len_shellquote -Slo -j10 ' 4 7 1 1 15xxx +par_command_len_shellquote -Slo -j10 ' 4 1 1 1 7 +par_command_len_shellquote -Slo -j10 ' 4 2 1 1 13 +par_command_len_shellquote -Slo -j10 ' 4 3 1 1 31 +par_command_len_shellquote -Slo -j10 ' 4 4 1 1 85 +par_command_len_shellquote -Slo -j10 ' 4 5 1 1 247 +par_command_len_shellquote -Slo -j10 ' 4 6 1 1 733 +par_command_len_shellquote -Slo -j10 ' 4 7 1 1 2191 par_command_len_shellquote -Slo -j10 ' 4 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 4 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 4 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 5 1 1 1 24 -par_command_len_shellquote -Slo -j10 ' 5 2 1 1 78 -par_command_len_shellquote -Slo -j10 ' 5 3 1 1 240 -par_command_len_shellquote -Slo -j10 ' 5 4 1 1 726 -par_command_len_shellquote -Slo -j10 ' 5 5 1 1 2184 -par_command_len_shellquote -Slo -j10 ' 5 6 1 1 6558 -par_command_len_shellquote -Slo -j10 ' 5 7 1 1 19xxx +par_command_len_shellquote -Slo -j10 ' 5 1 1 1 8 +par_command_len_shellquote -Slo -j10 ' 5 2 1 1 14 +par_command_len_shellquote -Slo -j10 ' 5 3 1 1 32 +par_command_len_shellquote -Slo -j10 ' 5 4 1 1 86 +par_command_len_shellquote -Slo -j10 ' 5 5 1 1 248 +par_command_len_shellquote -Slo -j10 ' 5 6 1 1 734 +par_command_len_shellquote -Slo -j10 ' 5 7 1 1 2192 par_command_len_shellquote -Slo -j10 ' 5 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 5 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 5 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 6 1 1 1 29 -par_command_len_shellquote -Slo -j10 ' 6 2 1 1 95 -par_command_len_shellquote -Slo -j10 ' 6 3 1 1 293 -par_command_len_shellquote -Slo -j10 ' 6 4 1 1 887 -par_command_len_shellquote -Slo -j10 ' 6 5 1 1 2669 -par_command_len_shellquote -Slo -j10 ' 6 6 1 1 8015 +par_command_len_shellquote -Slo -j10 ' 6 1 1 1 9 +par_command_len_shellquote -Slo -j10 ' 6 2 1 1 15 +par_command_len_shellquote -Slo -j10 ' 6 3 1 1 33 +par_command_len_shellquote -Slo -j10 ' 6 4 1 1 87 +par_command_len_shellquote -Slo -j10 ' 6 5 1 1 249 +par_command_len_shellquote -Slo -j10 ' 6 6 1 1 735 par_command_len_shellquote -Slo -j10 ' 6 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 6 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 6 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 6 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 7 1 1 1 34 -par_command_len_shellquote -Slo -j10 ' 7 2 1 1 112 -par_command_len_shellquote -Slo -j10 ' 7 3 1 1 346 -par_command_len_shellquote -Slo -j10 ' 7 4 1 1 1048 -par_command_len_shellquote -Slo -j10 ' 7 5 1 1 3154 -par_command_len_shellquote -Slo -j10 ' 7 6 1 1 9472 +par_command_len_shellquote -Slo -j10 ' 7 1 1 1 10 +par_command_len_shellquote -Slo -j10 ' 7 2 1 1 16 +par_command_len_shellquote -Slo -j10 ' 7 3 1 1 34 +par_command_len_shellquote -Slo -j10 ' 7 4 1 1 88 +par_command_len_shellquote -Slo -j10 ' 7 5 1 1 250 +par_command_len_shellquote -Slo -j10 ' 7 6 1 1 736 par_command_len_shellquote -Slo -j10 ' 7 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 7 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 7 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 7 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 8 1 1 1 39 -par_command_len_shellquote -Slo -j10 ' 8 2 1 1 129 -par_command_len_shellquote -Slo -j10 ' 8 3 1 1 399 -par_command_len_shellquote -Slo -j10 ' 8 4 1 1 1209 -par_command_len_shellquote -Slo -j10 ' 8 5 1 1 3639 -par_command_len_shellquote -Slo -j10 ' 8 6 1 1 10xxx +par_command_len_shellquote -Slo -j10 ' 8 1 1 1 11 +par_command_len_shellquote -Slo -j10 ' 8 2 1 1 17 +par_command_len_shellquote -Slo -j10 ' 8 3 1 1 35 +par_command_len_shellquote -Slo -j10 ' 8 4 1 1 89 +par_command_len_shellquote -Slo -j10 ' 8 5 1 1 251 +par_command_len_shellquote -Slo -j10 ' 8 6 1 1 737 par_command_len_shellquote -Slo -j10 ' 8 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 8 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 8 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 8 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 9 1 1 1 44 -par_command_len_shellquote -Slo -j10 ' 9 2 1 1 146 -par_command_len_shellquote -Slo -j10 ' 9 3 1 1 452 -par_command_len_shellquote -Slo -j10 ' 9 4 1 1 1370 -par_command_len_shellquote -Slo -j10 ' 9 5 1 1 4124 -par_command_len_shellquote -Slo -j10 ' 9 6 1 1 12xxx +par_command_len_shellquote -Slo -j10 ' 9 1 1 1 12 +par_command_len_shellquote -Slo -j10 ' 9 2 1 1 18 +par_command_len_shellquote -Slo -j10 ' 9 3 1 1 36 +par_command_len_shellquote -Slo -j10 ' 9 4 1 1 90 +par_command_len_shellquote -Slo -j10 ' 9 5 1 1 252 +par_command_len_shellquote -Slo -j10 ' 9 6 1 1 738 par_command_len_shellquote -Slo -j10 ' 9 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 9 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 9 9 0 0 0 par_command_len_shellquote -Slo -j10 ' 9 10 0 0 0 -par_command_len_shellquote -Slo -j10 ' 10 1 1 1 49 -par_command_len_shellquote -Slo -j10 ' 10 2 1 1 163 -par_command_len_shellquote -Slo -j10 ' 10 3 1 1 505 -par_command_len_shellquote -Slo -j10 ' 10 4 1 1 1531 -par_command_len_shellquote -Slo -j10 ' 10 5 1 1 4609 -par_command_len_shellquote -Slo -j10 ' 10 6 1 1 13xxx +par_command_len_shellquote -Slo -j10 ' 10 1 1 1 13 +par_command_len_shellquote -Slo -j10 ' 10 2 1 1 19 +par_command_len_shellquote -Slo -j10 ' 10 3 1 1 37 +par_command_len_shellquote -Slo -j10 ' 10 4 1 1 91 +par_command_len_shellquote -Slo -j10 ' 10 5 1 1 253 +par_command_len_shellquote -Slo -j10 ' 10 6 1 1 739 par_command_len_shellquote -Slo -j10 ' 10 7 0 0 0 par_command_len_shellquote -Slo -j10 ' 10 8 0 0 0 par_command_len_shellquote -Slo -j10 ' 10 9 0 0 0 @@ -397,91 +397,91 @@ par_command_len_shellquote ' 1 7 1 2 2190 par_command_len_shellquote ' 1 8 0 0 0 par_command_len_shellquote ' 1 9 0 0 0 par_command_len_shellquote ' 1 10 0 0 0 -par_command_len_shellquote ' 2 1 1 2 12 -par_command_len_shellquote ' 2 2 1 2 30 -par_command_len_shellquote ' 2 3 1 2 84 -par_command_len_shellquote ' 2 4 1 2 246 -par_command_len_shellquote ' 2 5 1 2 732 -par_command_len_shellquote ' 2 6 1 2 2190 -par_command_len_shellquote ' 2 7 1 2 6564 +par_command_len_shellquote ' 2 1 1 2 8 +par_command_len_shellquote ' 2 2 1 2 14 +par_command_len_shellquote ' 2 3 1 2 32 +par_command_len_shellquote ' 2 4 1 2 86 +par_command_len_shellquote ' 2 5 1 2 248 +par_command_len_shellquote ' 2 6 1 2 734 +par_command_len_shellquote ' 2 7 1 2 2192 par_command_len_shellquote ' 2 8 0 0 0 par_command_len_shellquote ' 2 9 0 0 0 par_command_len_shellquote ' 2 10 0 0 0 -par_command_len_shellquote ' 3 1 1 2 18 -par_command_len_shellquote ' 3 2 1 2 48 -par_command_len_shellquote ' 3 3 1 2 138 -par_command_len_shellquote ' 3 4 1 2 408 -par_command_len_shellquote ' 3 5 1 2 1218 -par_command_len_shellquote ' 3 6 1 2 3648 +par_command_len_shellquote ' 3 1 1 2 10 +par_command_len_shellquote ' 3 2 1 2 16 +par_command_len_shellquote ' 3 3 1 2 34 +par_command_len_shellquote ' 3 4 1 2 88 +par_command_len_shellquote ' 3 5 1 2 250 +par_command_len_shellquote ' 3 6 1 2 736 par_command_len_shellquote ' 3 7 0 0 0 par_command_len_shellquote ' 3 8 0 0 0 par_command_len_shellquote ' 3 9 0 0 0 par_command_len_shellquote ' 3 10 0 0 0 -par_command_len_shellquote ' 4 1 1 2 24 -par_command_len_shellquote ' 4 2 1 2 66 -par_command_len_shellquote ' 4 3 1 2 192 -par_command_len_shellquote ' 4 4 1 2 570 -par_command_len_shellquote ' 4 5 1 2 1704 -par_command_len_shellquote ' 4 6 1 2 5106 +par_command_len_shellquote ' 4 1 1 2 12 +par_command_len_shellquote ' 4 2 1 2 18 +par_command_len_shellquote ' 4 3 1 2 36 +par_command_len_shellquote ' 4 4 1 2 90 +par_command_len_shellquote ' 4 5 1 2 252 +par_command_len_shellquote ' 4 6 1 2 738 par_command_len_shellquote ' 4 7 0 0 0 par_command_len_shellquote ' 4 8 0 0 0 par_command_len_shellquote ' 4 9 0 0 0 par_command_len_shellquote ' 4 10 0 0 0 -par_command_len_shellquote ' 5 1 1 2 30 -par_command_len_shellquote ' 5 2 1 2 84 -par_command_len_shellquote ' 5 3 1 2 246 -par_command_len_shellquote ' 5 4 1 2 732 -par_command_len_shellquote ' 5 5 1 2 2190 -par_command_len_shellquote ' 5 6 1 2 6564 +par_command_len_shellquote ' 5 1 1 2 14 +par_command_len_shellquote ' 5 2 1 2 20 +par_command_len_shellquote ' 5 3 1 2 38 +par_command_len_shellquote ' 5 4 1 2 92 +par_command_len_shellquote ' 5 5 1 2 254 +par_command_len_shellquote ' 5 6 1 2 740 par_command_len_shellquote ' 5 7 0 0 0 par_command_len_shellquote ' 5 8 0 0 0 par_command_len_shellquote ' 5 9 0 0 0 par_command_len_shellquote ' 5 10 0 0 0 -par_command_len_shellquote ' 6 1 1 2 36 -par_command_len_shellquote ' 6 2 1 2 102 -par_command_len_shellquote ' 6 3 1 2 300 -par_command_len_shellquote ' 6 4 1 2 894 -par_command_len_shellquote ' 6 5 1 2 2676 -par_command_len_shellquote ' 6 6 1 2 8022 +par_command_len_shellquote ' 6 1 1 2 16 +par_command_len_shellquote ' 6 2 1 2 22 +par_command_len_shellquote ' 6 3 1 2 40 +par_command_len_shellquote ' 6 4 1 2 94 +par_command_len_shellquote ' 6 5 1 2 256 +par_command_len_shellquote ' 6 6 1 2 742 par_command_len_shellquote ' 6 7 0 0 0 par_command_len_shellquote ' 6 8 0 0 0 par_command_len_shellquote ' 6 9 0 0 0 par_command_len_shellquote ' 6 10 0 0 0 -par_command_len_shellquote ' 7 1 1 2 42 -par_command_len_shellquote ' 7 2 1 2 120 -par_command_len_shellquote ' 7 3 1 2 354 -par_command_len_shellquote ' 7 4 1 2 1056 -par_command_len_shellquote ' 7 5 1 2 3162 -par_command_len_shellquote ' 7 6 1 2 9480 +par_command_len_shellquote ' 7 1 1 2 18 +par_command_len_shellquote ' 7 2 1 2 24 +par_command_len_shellquote ' 7 3 1 2 42 +par_command_len_shellquote ' 7 4 1 2 96 +par_command_len_shellquote ' 7 5 1 2 258 +par_command_len_shellquote ' 7 6 1 2 744 par_command_len_shellquote ' 7 7 0 0 0 par_command_len_shellquote ' 7 8 0 0 0 par_command_len_shellquote ' 7 9 0 0 0 par_command_len_shellquote ' 7 10 0 0 0 -par_command_len_shellquote ' 8 1 1 2 48 -par_command_len_shellquote ' 8 2 1 2 138 -par_command_len_shellquote ' 8 3 1 2 408 -par_command_len_shellquote ' 8 4 1 2 1218 -par_command_len_shellquote ' 8 5 1 2 3648 -par_command_len_shellquote ' 8 6 1 2 10xxx +par_command_len_shellquote ' 8 1 1 2 20 +par_command_len_shellquote ' 8 2 1 2 26 +par_command_len_shellquote ' 8 3 1 2 44 +par_command_len_shellquote ' 8 4 1 2 98 +par_command_len_shellquote ' 8 5 1 2 260 +par_command_len_shellquote ' 8 6 1 2 746 par_command_len_shellquote ' 8 7 0 0 0 par_command_len_shellquote ' 8 8 0 0 0 par_command_len_shellquote ' 8 9 0 0 0 par_command_len_shellquote ' 8 10 0 0 0 -par_command_len_shellquote ' 9 1 1 2 54 -par_command_len_shellquote ' 9 2 1 2 156 -par_command_len_shellquote ' 9 3 1 2 462 -par_command_len_shellquote ' 9 4 1 2 1380 -par_command_len_shellquote ' 9 5 1 2 4134 +par_command_len_shellquote ' 9 1 1 2 22 +par_command_len_shellquote ' 9 2 1 2 28 +par_command_len_shellquote ' 9 3 1 2 46 +par_command_len_shellquote ' 9 4 1 2 100 +par_command_len_shellquote ' 9 5 1 2 262 par_command_len_shellquote ' 9 6 0 0 0 par_command_len_shellquote ' 9 7 0 0 0 par_command_len_shellquote ' 9 8 0 0 0 par_command_len_shellquote ' 9 9 0 0 0 par_command_len_shellquote ' 9 10 0 0 0 -par_command_len_shellquote ' 10 1 1 2 60 -par_command_len_shellquote ' 10 2 1 2 174 -par_command_len_shellquote ' 10 3 1 2 516 -par_command_len_shellquote ' 10 4 1 2 1542 -par_command_len_shellquote ' 10 5 1 2 4620 +par_command_len_shellquote ' 10 1 1 2 24 +par_command_len_shellquote ' 10 2 1 2 30 +par_command_len_shellquote ' 10 3 1 2 48 +par_command_len_shellquote ' 10 4 1 2 102 +par_command_len_shellquote ' 10 5 1 2 264 par_command_len_shellquote ' 10 6 0 0 0 par_command_len_shellquote ' 10 7 0 0 0 par_command_len_shellquote ' 10 8 0 0 0