parallel: --group-by bug: Column name with Capitals.

testsuite: Re-org for faster execution.
This commit is contained in:
Ole Tange 2019-05-06 01:06:48 +02:00
parent 818439c3ff
commit 324a9f3a07
18 changed files with 1620 additions and 1760 deletions

6
README
View file

@ -37,11 +37,11 @@ installation.
$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh
$ sha1sum install.sh | grep 3374ec53bacb199b245af2dda86df6c9
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh
$ md5sum install.sh | grep 029a9ac06e8b5bc6052eac57b2c3c9ca
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh
$ sha512sum install.sh | grep f517006d9897747bed8a4694b1acba1b
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh

View file

@ -612,7 +612,7 @@ sub group_by_loop($) {
if($groupby =~ s/^(\d+)\s*//) {
# Column number (possibly prefix)
$col = $1-1;
} elsif($groupby =~ s/^([a-z0-9_]+)\s*//) {
} elsif($groupby =~ s/^([a-z0-9_]+)\s*//i) {
# Column name (possibly prefix)
my $colname = $1;
my($read,$char,@line,$header);

View file

@ -795,6 +795,75 @@ B<--group> is the default. Can be reversed with B<-u>.
See also: B<--line-buffer> B<--ungroup>
=item B<--group-by> I<val> (alpha testing)
Group input by value. Combined with B<--pipe> B<--group-by> groups
lines with the same value into a record.
The value can be computed from the full line or from a single column.
I<val> can be:
=over 15
=item Z<> column number
Use the value in the column numbered.
=item Z<> column name
Treat the first line as a header and use the value in the column
named.
=item Z<> perl expression
Run the perl expression and use $_ as the value.
=item Z<> column number perl expression
Put the value of the column put in $_, run the perl expression, and use $_ as the value.
=item Z<> column name perl expression
Put the value of the column put in $_, run the perl expression, and use $_ as the value.
=back
Example:
UserID, Consumption
123, 1
123, 2
12-3, 1
221, 3
221, 1
2/21, 5
If you want to group 123, 12-3, 221, and 2/21 into 4 records and pass
one record at a time to B<wc>:
tail -n +2 table.csv | \
parallel --pipe --colsep , --group-by 1 -kN1 wc
Make GNU B<parallel> treat the first line as a header:
cat table.csv | \
parallel --pipe --colsep , --header : --group-by 1 -kN1 wc
Address column by column name:
cat table.csv | \
parallel --pipe --colsep , --header : --group-by UserID -kN1 wc
If 12-3 and 123 are really the same UserID, remove non-digits in
UserID when grouping:
cat table.csv | parallel --pipe --colsep , --header : \
--group-by 'UserID s/\D//g' -kN1 wc
See also B<--shard>.
=item B<--help>
=item B<-h>

View file

@ -4,20 +4,6 @@
# Each should be taking 0.3-1s and be possible to run in parallel
# I.e.: No race conditions, no logins
SMALLDISK=${SMALLDISK:-/mnt/ram}
export SMALLDISK
(
cd /tmp
sudo umount -l smalldisk.img
dd if=/dev/zero of=smalldisk.img bs=100k count=1k
yes|mkfs smalldisk.img
sudo mkdir -p /mnt/ram
sudo mount smalldisk.img /mnt/ram
sudo chmod 777 /mnt/ram
) >/dev/null 2>/dev/null
# Clean tmp
find /tmp{/*,}/*.{par,tms,tmx} 2>/dev/null -mmin -10 | parallel rm
stdsort() {
"$@" 2>&1 | LC_ALL=C sort;
@ -27,138 +13,139 @@ export -f stdsort
# Test amount of parallelization
# parallel --shuf --jl /tmp/myjl -j1 'export JOBS={1};'bash tests-to-run/parallel-local-0.3s.sh ::: {1..16} ::: {1..5}
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj13 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test bug #43376: {%} and {#} with --pipe'
echo foo | parallel -q --pipe -k echo {#}
echo foo | parallel --pipe -k echo {%}
echo foo | parallel -q --pipe -k echo {%}
echo foo | parallel --pipe -k echo {#}
par_tmux_command_not_found() {
echo '### PARALLEL_TMUX not found'
PARALLEL_TMUX=not-existing parallel --tmux echo ::: 1
}
echo '**'
par_echo_jobseq() {
echo '### bug #44995: parallel echo {#} ::: 1 2 ::: 1 2'
echo '### {} as part of the command'
echo p /bin/ls | parallel l{= s/p/s/ =}
echo /bin/ls-p | parallel --colsep '-' l{=2 s/p/s/ =} {1}
echo s /bin/ls | parallel l{}
echo /bin/ls | parallel ls {}
echo ls /bin/ls | parallel {}
echo ls /bin/ls | parallel
parallel -k echo {#} ::: 1 2 ::: 1 2
}
echo '**'
par_no_joblog_with_dryrun() {
echo 'bug #46016: --joblog should not log when --dryrun'
echo '### bug #43817: Some JP char cause problems in positional replacement strings'
parallel -k echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel -k echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel -Xj1 echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel -Xj1 echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel --dryrun --joblog - echo ::: Only_this
}
echo '**'
par_tagstring_with_d() {
echo 'bug #47002: --tagstring with -d \n\n'
echo '### --rpl % that is a substring of longer --rpl %D'
parallel --rpl '{+.} s:.*\.::' --rpl '%'
--rpl '%D $_=::shell_quote(::dirname($_));' --rpl '%B s:.*/::;s:\.[^/.]+$::;' --rpl '%E s:.*\.::'
'echo {}=%;echo %D={//};echo %B={/.};echo %E={+.};echo %D/%B.%E={}' ::: a.b/c.d/e.f
(seq 3; echo; seq 4) |
parallel -k -d '\n\n' --tagstring {%} echo ABC';'echo
}
echo '**'
par_xargs_nul_char_in_input() {
echo 'bug #47290: xargs: Warning: a NUL character occurred in the input'
echo '### Disk full'
cat /dev/zero >$SMALLDISK/out;
parallel --tmpdir $SMALLDISK echo ::: OK;
rm $SMALLDISK/out
perl -e 'print "foo\0not printed"' | parallel echo
}
echo '**'
par_maxproc() {
echo '### Test --max-procs and -P: Number of processes'
echo '### PARALLEL_TMUX not found'
PARALLEL_TMUX=not-existing parallel --tmux echo ::: 1
seq 1 10 | parallel -k --max-procs +0 echo max proc
seq 1 10 | parallel -k -P 200% echo 200% proc
}
echo '**'
par_maxchar_s() {
echo '### Test --max-chars and -s: Max number of chars in a line'
echo '### bug #44995: parallel echo {#} ::: 1 2 ::: 1 2'
(echo line 1;echo line 1;echo line 2) | parallel -k --max-chars 25 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k -s 25 -X echo
}
parallel -k echo {#} ::: 1 2 ::: 1 2
par_no_run_if_empty() {
echo '### Test --no-run-if-empty and -r: This should give no output'
echo '**'
echo " " | parallel -r echo
echo " " | parallel --no-run-if-empty echo
}
echo 'bug #46016: --joblog should not log when --dryrun'
par_help() {
echo '### Test --help and -h: Help output (just check we get the same amount of lines)'
parallel --dryrun --joblog - echo ::: Only_this
echo Output from -h and --help
parallel -h | wc -l
parallel --help | wc -l
}
echo '**'
par_version() {
echo '### Test --version: Version output (just check we get the same amount of lines)'
echo 'bug #47002: --tagstring with -d \n\n'
parallel --version | wc -l
}
(seq 3;echo;seq 4) | parallel -k -d '\n\n' --tagstring {%} echo ABC';'echo
par_verbose_t() {
echo '### Test --verbose and -t'
echo '**'
(echo b; echo c; echo f) | parallel -k -t echo {}ar 2>&1 >/dev/null
(echo b; echo c; echo f) | parallel -k --verbose echo {}ar 2>&1 >/dev/null
}
echo 'bug #47290: xargs: Warning: a NUL character occurred in the input'
par_show_limits() {
echo '### Test --show-limits'
perl -e 'print "foo\0not printed"' | parallel echo
(echo b; echo c; echo f) | parallel -k --show-limits echo {}ar
(echo b; echo c; echo f) | parallel -j1 -kX --show-limits -s 100 echo {}ar
}
echo '**'
par_test_zero_args() {
echo '### Test 0-arguments'
echo '### Test --max-procs and -P: Number of processes'
seq 1 2 | parallel -k -n0 echo n0
seq 1 2 | parallel -k -L0 echo L0
seq 1 2 | parallel -k -N0 echo N0
}
seq 1 10 | parallel -k --max-procs +0 echo max proc
seq 1 10 | parallel -k -P 200% echo 200% proc
par_l0_is_l1() {
echo '### Because of --tollef -l, then -l0 == -l1, sorry'
echo '### Test --max-chars and -s: Max number of chars in a line'
seq 1 2 | parallel -k -l0 echo l0
}
(echo line 1;echo line 1;echo line 2) | parallel -k --max-chars 25 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k -s 25 -X echo
par_replace_replacementstring() {
echo '### Test replace {}'
echo '### Test --no-run-if-empty and -r: This should give no output'
seq 1 2 | parallel -k -N0 echo replace {} curlies
}
echo " " | parallel -r echo
echo " " | parallel --no-run-if-empty echo
par_arguments_on_cmdline() {
echo '### Test arguments on commandline'
echo '### Test --help and -h: Help output (just check we get the same amount of lines)'
parallel -k -N0 echo args on cmdline ::: 1 2
}
echo Output from -h and --help
parallel -h | wc -l
parallel --help | wc -l
par_nice_locally() {
echo '### Test --nice locally'
echo '### Test --version: Version output (just check we get the same amount of lines)'
parallel --nice 1 -vv 'PAR=a bash -c "echo \$PAR {}"' ::: b
}
parallel --version | wc -l
par_disk_full() {
echo '### Disk full'
echo '### Test --verbose and -t'
SMALLDISK=${SMALLDISK:-/mnt/ram}
export SMALLDISK
(
cd /tmp
sudo umount -l smalldisk.img
dd if=/dev/zero of=smalldisk.img bs=100k count=1k
yes|mkfs smalldisk.img
sudo mkdir -p /mnt/ram
sudo mount smalldisk.img /mnt/ram
sudo chmod 777 /mnt/ram
) >/dev/null 2>/dev/null
(echo b; echo c; echo f) | parallel -k -t echo {}ar 2>&1 >/dev/null
(echo b; echo c; echo f) | parallel -k --verbose echo {}ar 2>&1 >/dev/null
cat /dev/zero >$SMALLDISK/out
parallel --tmpdir $SMALLDISK echo ::: OK
echo '### Test --show-limits'
rm $SMALLDISK/out
(echo b; echo c; echo f) | parallel -k --show-limits echo {}ar
(echo b; echo c; echo f) | parallel -j1 -kX --show-limits -s 100 echo {}ar
echo '### Test 0-arguments'
seq 1 2 | parallel -k -n0 echo n0
seq 1 2 | parallel -k -L0 echo L0
seq 1 2 | parallel -k -N0 echo N0
echo '### Because of --tollef -l, then -l0 == -l1, sorry'
seq 1 2 | parallel -k -l0 echo l0
echo '### Test replace {}'
seq 1 2 | parallel -k -N0 echo replace {} curlies
echo '### Test arguments on commandline'
parallel -k -N0 echo args on cmdline ::: 1 2
echo '### Test --nice locally'
parallel --nice 1 -vv 'PAR=a bash -c "echo \$PAR {}"' ::: b
EOF
echo '### 1 .par file from --files expected'
find /tmp{/*,}/*.{par,tms,tmx} 2>/dev/null -mmin -10 | wc -l
find /tmp{/*,}/*.{par,tms,tmx} 2>/dev/null -mmin -10 | parallel rm
sudo umount -l /tmp/smalldisk.img
sudo umount -l /tmp/smalldisk.img
}
par_delimiter() {
echo '### Test --delimiter and -d: Delimiter instead of newline'
@ -177,12 +164,24 @@ par_argfile() {
seq 1 10 >/tmp/parallel_$$-2; parallel -k --arg-file /tmp/parallel_$$-2 echo; rm /tmp/parallel_$$-2
}
par_pipe_unneeded_procs() {
echo '### Test bug #34241: --pipe should not spawn unneeded processes'
seq 3 | parallel -j30 --pipe --block-size 10 cat\;echo o 2> >(grep -Ev 'Warning: Starting|Warning: Consider')
}
par_results_arg_256() {
echo '### bug #42089: --results with arg > 256 chars (should be 1 char shorter)'
parallel --results parallel_test_dir echo ::: 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456;
ls parallel_test_dir/1/
rm -rf parallel_test_dir
}
par_pipe_to_func() {
echo '### bug #45998: --pipe to function broken'
myfunc() { echo $1; cat; };
export -f myfunc;
echo pipefunc OK | parallel --pipe myfunc {#};
myfunc() { echo $1; cat; }
export -f myfunc
echo pipefunc OK | parallel --pipe myfunc {#}
echo pipefunc and more OK | parallel --pipe 'myfunc {#};echo and more OK'
}
@ -203,30 +202,11 @@ par_pipepart_header() {
rm /tmp/parallel_44616
}
par_maxargs() {
echo '### Test -n and --max-args: Max number of args per line (only with -X and -m)'
(echo line 1;echo line 2;echo line 3) | parallel -k -n1 -m echo
(echo line 1;echo line 1;echo line 2) | parallel -k -n2 -m echo
(echo line 1;echo line 2;echo line 3) | parallel -k -n1 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k -n2 -X echo
(echo line 1;echo line 2;echo line 3) | parallel -k -n1 echo
(echo line 1;echo line 1;echo line 2) | parallel -k -n2 echo
(echo line 1;echo line 2;echo line 3) | parallel -k --max-args=1 -X echo
(echo line 1;echo line 2;echo line 3) | parallel -k --max-args 1 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k --max-args=2 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k --max-args 2 -X echo
(echo line 1;echo line 2;echo line 3) | parallel -k --max-args 1 echo
(echo line 1;echo line 1;echo line 2) | parallel -k --max-args 2 echo
}
par_quote() {
echo '### Test -q'
parallel -kq perl -e '$ARGV[0]=~/^\S+\s+\S+$/ and print $ARGV[0],"\n"' ::: "a b" c "d e f" g "h i"
echo '### Test -q {#}'
parallel -kq echo {#} ::: a b
parallel -kq echo {\#} ::: a b
parallel -kq echo {\\#} ::: a b
@ -234,55 +214,25 @@ par_quote() {
par_read_from_stdin() {
echo '### Test empty line as input'
echo | parallel echo empty input line
echo '### Tests if (cat | sh) works'
perl -e 'for(1..25) {print "echo a $_; echo b $_\n"}' | parallel 2>&1 | sort
echo '### Test if xargs-mode works'
perl -e 'for(1..25) {print "a $_\nb $_\n"}' | parallel echo 2>&1 | sort
}
par_totaljob_repl() {
echo '{##} bug #45841: Replacement string for total no of jobs'
parallel -k --plus echo {##} ::: {a..j};
parallel -k 'echo {= $::G++ > 3 and ($_=$Global::JobQueue->total_jobs());=}' ::: {1..10}
parallel -k -N7 --plus echo {#} {##} ::: {1..14}
parallel -k -N7 --plus echo {#} {##} ::: {1..15}
parallel -k -S 8/: -X --plus echo {#} {##} ::: {1..15}
}
par_jobslot_repl() {
echo 'bug #46232: {%} with --bar/--eta/--shuf or --halt xx% broken'
parallel --bar -kj2 --delay 0.1 echo {%} ::: a b ::: c d e 2>/dev/null
parallel --halt now,fail=10% -kj2 --delay 0.1 echo {%} ::: a b ::: c d e
parallel --eta -kj2 --delay 0.1 echo {%} ::: a b ::: c d e 2>/dev/null
parallel --shuf -kj2 --delay 0.1 echo {%} ::: a b ::: c d e 2>/dev/null
echo 'bug #46231: {%} with --pipepart broken. Should give 1+2'
seq 10000 > /tmp/num10000
parallel -k --pipepart -ka /tmp/num10000 --block 10k -j2 --delay 0.05 echo {%}
rm /tmp/num10000
}
par_total_from_joblog() {
echo 'bug #47086: [PATCH] Initialize total_completed from joblog'
rm -f /tmp/parallel-47086
parallel -j1 --joblog /tmp/parallel-47086 --halt now,fail=1 echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
parallel -j1 --joblog /tmp/parallel-47086 --halt now,fail=1 --resume echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
}
par_xapply() {
echo '### Test bug #43284: {%} and {#} with --xapply';
parallel --xapply 'echo {1} {#} {%} {2}' ::: a ::: b;
echo '### Test bug #43284: {%} and {#} with --xapply'
parallel --xapply 'echo {1} {#} {%} {2}' ::: a ::: b
parallel -N2 'echo {%}' ::: a b
echo '### bug #47501: --xapply for some input sources'
@ -290,148 +240,20 @@ par_xapply() {
parallel -k echo ::: a b c aWRAP :::+ aa bb cc ::: A B :::+ AA BB AAwrap
}
par_perlexpr_repl() {
echo '### {= and =} in different groups separated by space'
parallel echo {= s/a/b/ =} ::: a
parallel echo {= s/a/b/=} ::: a
parallel echo {= s/a/b/=}{= s/a/b/=} ::: a
parallel echo {= s/a/b/=}{=s/a/b/=} ::: a
parallel echo {= s/a/b/=}{= {= s/a/b/=} ::: a
parallel echo {= s/a/b/=}{={=s/a/b/=} ::: a
parallel echo {= s/a/b/ =} {={==} ::: a
parallel echo {={= =} ::: a
parallel echo {= {= =} ::: a
parallel echo {= {= =} =} ::: a
echo '### bug #45842: Do not evaluate {= =} twice'
parallel -k echo '{= $_=++$::G =}' ::: {1001..1004}
parallel -k echo '{=1 $_=++$::G =}' ::: {1001..1004}
parallel -k echo '{= $_=++$::G =}' ::: {1001..1004} ::: {a..c}
parallel -k echo '{=1 $_=++$::G =}' ::: {1001..1004} ::: {a..c}
echo '### bug #45939: {2} in {= =} fails'
parallel echo '{= s/O{2}//=}' ::: OOOK
parallel echo '{2}-{=1 s/O{2}//=}' ::: OOOK ::: OK
}
par_END() {
echo '### Test -i and --replace: Replace with argument'
(echo a; echo END; echo b) | parallel -k -i -eEND echo repl{}ce
(echo a; echo END; echo b) | parallel -k --replace -eEND echo repl{}ce
(echo a; echo END; echo b) | parallel -k -i+ -eEND echo repl+ce
(echo e; echo END; echo b) | parallel -k -i'*' -eEND echo r'*'plac'*'
(echo a; echo END; echo b) | parallel -k --replace + -eEND echo repl+ce
(echo a; echo END; echo b) | parallel -k --replace== -eEND echo repl=ce
(echo a; echo END; echo b) | parallel -k --replace = -eEND echo repl=ce
(echo a; echo END; echo b) | parallel -k --replace=^ -eEND echo repl^ce
(echo a; echo END; echo b) | parallel -k -I^ -eEND echo repl^ce
echo '### Test -E: Artificial end-of-file'
(echo include this; echo END; echo not this) | parallel -k -E END echo
(echo include this; echo END; echo not this) | parallel -k -EEND echo
echo '### Test -e and --eof: Artificial end-of-file'
(echo include this; echo END; echo not this) | parallel -k -e END echo
(echo include this; echo END; echo not this) | parallel -k -eEND echo
(echo include this; echo END; echo not this) | parallel -k --eof=END echo
(echo include this; echo END; echo not this) | parallel -k --eof END echo
}
par_exit_val() {
echo '### Test bug #45619: "--halt" erroneous error exit code (should give 0)';
seq 10 | parallel --halt now,fail=1 true;
echo '### Test bug #45619: "--halt" erroneous error exit code (should give 0)'
seq 10 | parallel --halt now,fail=1 true
echo $?
echo '### Test exit val - true';
echo true | parallel;
echo '### Test exit val - true'
echo true | parallel
echo $?
echo '### Test exit val - false';
echo false | parallel;
echo '### Test exit val - false'
echo false | parallel
echo $?
}
par_xargs_compat() {
echo xargs compatibility
echo '### Test -L -l and --max-lines'
(echo a_b;echo c) | parallel -km -L2 echo
(echo a_b;echo c) | parallel -k -L2 echo
(echo a_b;echo c) | xargs -L2 echo
echo '### xargs -L1 echo'
(echo a_b;echo c) | parallel -km -L1 echo
(echo a_b;echo c) | parallel -k -L1 echo
(echo a_b;echo c) | xargs -L1 echo
echo 'Lines ending in space should continue on next line'
echo '### xargs -L1 echo'
(echo a_b' ';echo c;echo d) | parallel -km -L1 echo
(echo a_b' ';echo c;echo d) | parallel -k -L1 echo
(echo a_b' ';echo c;echo d) | xargs -L1 echo
echo '### xargs -L2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -L2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -L2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -L2 echo
echo '### xargs -l echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -l -km echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | parallel -l -k echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | xargs -l echo
echo '### xargs -l2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -l2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -l2 echo
echo '### xargs -l1 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l1 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -l1 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -l1 echo
echo '### xargs --max-lines=2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km --max-lines 2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k --max-lines 2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs --max-lines=2 echo
echo '### xargs --max-lines echo'
(echo a_b' ';echo c;echo d;echo e) | parallel --max-lines -km echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | parallel --max-lines -k echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | xargs --max-lines echo
echo '### test too long args'
perl -e 'print "z"x1000000' | parallel echo 2>&1
perl -e 'print "z"x1000000' | xargs echo 2>&1
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort parallel -j1 -km -s 10 echo
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort xargs -s 10 echo
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort parallel -j1 -kX -s 10 echo
echo '### Test -x'
(seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo
(seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo
(seq 1 10; echo 12345; seq 12 15) | stdsort xargs -s 10 -x echo
(seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo
(seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo
(seq 1 10; echo 1234; seq 12 15) | stdsort xargs -s 10 -x echo
}
par_long_cmd_mem_use() {
echo '### Test long commands do not take up all memory'
@ -440,28 +262,6 @@ par_long_cmd_mem_use() {
sort
}
par_distribute_args_at_EOF() {
echo '### Test distribute arguments at EOF to 2 jobslots'
seq 1 92 | parallel -j2 -kX -s 100 echo
echo '### Test distribute arguments at EOF to 5 jobslots'
seq 1 92 | parallel -j5 -kX -s 100 echo
echo '### Test distribute arguments at EOF to infinity jobslots'
seq 1 92 | parallel -j0 -kX -s 100 echo 2>/dev/null
echo '### Test -N is not broken by distribution - single line'
seq 9 | parallel -N 10 echo
echo '### Test -N is not broken by distribution - two lines'
seq 19 | parallel -k -N 10 echo
}
par_test_L_context_replace() {
echo '### Test -N context replace'
@ -472,26 +272,6 @@ par_test_L_context_replace() {
seq 19 | parallel -k -L 10 echo a{}b
}
par_test_X_with_multiple_source() {
echo '### Test {} multiple times in different commands'
seq 10 | parallel -v -Xj1 echo {} \; echo {}
echo '### Test of -X {1}-{2} with multiple input sources'
parallel -j1 -kX echo {1}-{2} ::: a ::: b
parallel -j2 -kX echo {1}-{2} ::: a b ::: c d
parallel -j2 -kX echo {1}-{2} ::: a b c ::: d e f
parallel -j0 -kX echo {1}-{2} ::: a b c ::: d e f
echo '### Test of -X {}-{.} with multiple input sources'
parallel -j1 -kX echo {}-{.} ::: a ::: b
parallel -j2 -kX echo {}-{.} ::: a b ::: c d
parallel -j2 -kX echo {}-{.} ::: a b c ::: d e f
parallel -j0 -kX echo {}-{.} ::: a b c ::: d e f
}
par_test_r_with_pipe() {
echo '### Test of -r with --pipe - the first should give an empty line. The second should not.'
@ -917,35 +697,47 @@ par_wd_dotdotdot() {
parallel --wd ... 'echo $OLDPWD' ::: foo
}
par_shard() {
echo '### --shard'
# Each of the 5 lines should match:
# ##### ##### ######
seq 100000 | parallel --pipe --shard 1 -j5 wc |
perl -pe 's/(.*\d{5,}){3}/OK/'
# Data should be sharded to all processes
shard_on_col() {
col=$1
seq 10 99 | shuf | perl -pe 's/(.)/$1\t/g' |
parallel --pipe --shard $col -j2 --colsep "\t" sort -k$col |
field $col | uniq -c | sort
}
shard_on_col 1
shard_on_col 2
echo '*** broken'
# Shorthand for --pipe -j+0
seq 100000 | parallel --shard 1 wc |
perl -pe 's/(.*\d{5,}){3}/OK/'
# Combine with arguments
seq 100000 | parallel --shard 1 echo {}\;wc ::: {1..5} ::: a b |
perl -pe 's/(.*\d{5,}){3}/OK/'
}
par_fish() {
echo '### https://github.com/fish-shell/fish-shell/issues/5582'
echo OK | stdout fish -c 'parallel --pipe cat'
}
par_jobslot_jobnumber_pipe() {
echo '### Test bug #43376: {%} and {#} with --pipe'
echo foo | parallel -q --pipe -k echo {#}
echo foo | parallel --pipe -k echo {%}
echo foo | parallel -q --pipe -k echo {%}
echo foo | parallel --pipe -k echo {#}
}
par_replacement_string_as_part_of_command() {
echo '### {} as part of the command'
echo p /bin/ls | parallel l{= s/p/s/ =}
echo /bin/ls-p | parallel --colsep '-' l{=2 s/p/s/ =} {1}
echo s /bin/ls | parallel l{}
echo /bin/ls | parallel ls {}
echo ls /bin/ls | parallel {}
echo ls /bin/ls | parallel
}
par_japanese_chars_in_replacement_string() {
echo '### bug #43817: Some JP char cause problems in positional replacement strings'
parallel -k echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel -k echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel -Xj1 echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
parallel -Xj1 echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
}
par_rpl_that_is_substring_of_longer_rpl() {
echo '### --rpl % that is a substring of longer --rpl %D'
parallel --rpl '{+.} s:.*\.::' --rpl '%' \
--rpl '%D $_=::shell_quote(::dirname($_));' \
--rpl '%B s:.*/::;s:\.[^/.]+$::;' \
--rpl '%E s:.*\.::' \
'echo {}=%;echo %D={//};echo %B={/.};echo %E={+.};echo %D/%B.%E={}' ::: a.b/c.d/e.f
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | LC_ALL=C sort |
parallel --timeout 30 -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'
parallel --timeout 30 -j6 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -4,6 +4,208 @@
# Each should be taking 10-30s and be possible to run in parallel
# I.e.: No race conditions, no logins
par_parset() {
echo '### test parset'
. `which env_parallel.bash`
echo 'Put output into $myarray'
parset myarray -k seq 10 ::: 14 15 16
echo "${myarray[1]}"
echo 'Put output into vars "$seq, $pwd, $ls"'
parset "seq pwd ls" -k ::: "seq 10" pwd ls
echo "$seq"
echo 'Put output into vars ($seq, $pwd, $ls)':
into_vars=(seq pwd ls)
parset "${into_vars[*]}" -k ::: "seq 5" pwd ls
echo "$seq"
echo 'The commands to run can be an array'
cmd=("echo '<<joe \"double space\" cartoon>>'" "pwd")
parset data -k ::: "${cmd[@]}"
echo "${data[0]}"
echo "${data[1]}"
echo 'You cannot pipe into parset, but must use a tempfile'
seq 10 > /tmp/parset_input_$$
parset res -k echo :::: /tmp/parset_input_$$
echo "${res[0]}"
echo "${res[9]}"
rm /tmp/parset_input_$$
echo 'or process substitution'
parset res -k echo :::: <(seq 0 10)
echo "${res[0]}"
echo "${res[9]}"
echo 'Commands with newline require -0'
parset var -k -0 ::: 'echo "line1
line2"' 'echo "command2"'
echo "${var[0]}"
}
par_parset2() {
. `which env_parallel.bash`
echo '### parset into array'
parset arr1 echo ::: foo bar baz
echo ${arr1[0]} ${arr1[1]} ${arr1[2]}
echo '### parset into vars with comma'
parset comma3,comma2,comma1 echo ::: baz bar foo
echo $comma1 $comma2 $comma3
echo '### parset into vars with space'
parset 'space3 space2 space1' echo ::: baz bar foo
echo $space1 $space2 $space3
echo '### parset with newlines'
parset 'newline3 newline2 newline1' seq ::: 3 2 1
echo "$newline1"
echo "$newline2"
echo "$newline3"
echo '### parset into indexed array vars'
parset 'myarray[6],myarray[5],myarray[4]' echo ::: baz bar foo
echo ${myarray[*]}
echo ${myarray[4]} ${myarray[5]} ${myarray[5]}
echo '### env_parset'
alias myecho='echo myecho "$myvar" "${myarr[1]}"'
myvar="myvar"
myarr=("myarr 0" "myarr 1" "myarr 2")
mynewline="`echo newline1;echo newline2;`"
env_parset arr1 myecho ::: foo bar baz
echo "${arr1[0]} ${arr1[1]} ${arr1[2]}"
env_parset comma3,comma2,comma1 myecho ::: baz bar foo
echo "$comma1 $comma2 $comma3"
env_parset 'space3 space2 space1' myecho ::: baz bar foo
echo "$space1 $space2 $space3"
env_parset 'newline3 newline2 newline1' 'echo "$mynewline";seq' ::: 3 2 1
echo "$newline1"
echo "$newline2"
echo "$newline3"
env_parset 'myarray[6],myarray[5],myarray[4]' myecho ::: baz bar foo
echo "${myarray[*]}"
echo "${myarray[4]} ${myarray[5]} ${myarray[5]}"
echo 'bug #52507: parset arr1 -v echo ::: fails'
parset arr1 -v seq ::: 1 2 3
echo "${arr1[2]}"
}
par_perlexpr_repl() {
echo '### {= and =} in different groups separated by space'
parallel echo {= s/a/b/ =} ::: a
parallel echo {= s/a/b/=} ::: a
parallel echo {= s/a/b/=}{= s/a/b/=} ::: a
parallel echo {= s/a/b/=}{=s/a/b/=} ::: a
parallel echo {= s/a/b/=}{= {= s/a/b/=} ::: a
parallel echo {= s/a/b/=}{={=s/a/b/=} ::: a
parallel echo {= s/a/b/ =} {={==} ::: a
parallel echo {={= =} ::: a
parallel echo {= {= =} ::: a
parallel echo {= {= =} =} ::: a
echo '### bug #45842: Do not evaluate {= =} twice'
parallel -k echo '{= $_=++$::G =}' ::: {1001..1004}
parallel -k echo '{=1 $_=++$::G =}' ::: {1001..1004}
parallel -k echo '{= $_=++$::G =}' ::: {1001..1004} ::: {a..c}
parallel -k echo '{=1 $_=++$::G =}' ::: {1001..1004} ::: {a..c}
echo '### bug #45939: {2} in {= =} fails'
parallel echo '{= s/O{2}//=}' ::: OOOK
parallel echo '{2}-{=1 s/O{2}//=}' ::: OOOK ::: OK
}
par_END() {
echo '### Test -i and --replace: Replace with argument'
(echo a; echo END; echo b) | parallel -k -i -eEND echo repl{}ce
(echo a; echo END; echo b) | parallel -k --replace -eEND echo repl{}ce
(echo a; echo END; echo b) | parallel -k -i+ -eEND echo repl+ce
(echo e; echo END; echo b) | parallel -k -i'*' -eEND echo r'*'plac'*'
(echo a; echo END; echo b) | parallel -k --replace + -eEND echo repl+ce
(echo a; echo END; echo b) | parallel -k --replace== -eEND echo repl=ce
(echo a; echo END; echo b) | parallel -k --replace = -eEND echo repl=ce
(echo a; echo END; echo b) | parallel -k --replace=^ -eEND echo repl^ce
(echo a; echo END; echo b) | parallel -k -I^ -eEND echo repl^ce
echo '### Test -E: Artificial end-of-file'
(echo include this; echo END; echo not this) | parallel -k -E END echo
(echo include this; echo END; echo not this) | parallel -k -EEND echo
echo '### Test -e and --eof: Artificial end-of-file'
(echo include this; echo END; echo not this) | parallel -k -e END echo
(echo include this; echo END; echo not this) | parallel -k -eEND echo
(echo include this; echo END; echo not this) | parallel -k --eof=END echo
(echo include this; echo END; echo not this) | parallel -k --eof END echo
}
par_xargs_compat() {
echo xargs compatibility
echo '### Test -L -l and --max-lines'
(echo a_b;echo c) | parallel -km -L2 echo
(echo a_b;echo c) | parallel -k -L2 echo
(echo a_b;echo c) | xargs -L2 echo
echo '### xargs -L1 echo'
(echo a_b;echo c) | parallel -km -L1 echo
(echo a_b;echo c) | parallel -k -L1 echo
(echo a_b;echo c) | xargs -L1 echo
echo 'Lines ending in space should continue on next line'
echo '### xargs -L1 echo'
(echo a_b' ';echo c;echo d) | parallel -km -L1 echo
(echo a_b' ';echo c;echo d) | parallel -k -L1 echo
(echo a_b' ';echo c;echo d) | xargs -L1 echo
echo '### xargs -L2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -L2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -L2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -L2 echo
echo '### xargs -l echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -l -km echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | parallel -l -k echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | xargs -l echo
echo '### xargs -l2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -l2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -l2 echo
echo '### xargs -l1 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l1 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k -l1 echo
(echo a_b' ';echo c;echo d;echo e) | xargs -l1 echo
echo '### xargs --max-lines=2 echo'
(echo a_b' ';echo c;echo d;echo e) | parallel -km --max-lines 2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -k --max-lines 2 echo
(echo a_b' ';echo c;echo d;echo e) | xargs --max-lines=2 echo
echo '### xargs --max-lines echo'
(echo a_b' ';echo c;echo d;echo e) | parallel --max-lines -km echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | parallel --max-lines -k echo # This behaves wrong
(echo a_b' ';echo c;echo d;echo e) | xargs --max-lines echo
echo '### test too long args'
perl -e 'print "z"x1000000' | parallel echo 2>&1
perl -e 'print "z"x1000000' | xargs echo 2>&1
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort parallel -j1 -km -s 10 echo
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort xargs -s 10 echo
(seq 1 10; perl -e 'print "z"x1000000'; seq 12 15) | stdsort parallel -j1 -kX -s 10 echo
echo '### Test -x'
(seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo
(seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo
(seq 1 10; echo 12345; seq 12 15) | stdsort xargs -s 10 -x echo
(seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo
(seq 1 10; echo 1234; seq 12 15) | stdsort parallel -j1 -kX -s 10 -x echo
(seq 1 10; echo 1234; seq 12 15) | stdsort xargs -s 10 -x echo
}
par_sem_2jobs() {
echo '### Test semaphore 2 jobs running simultaneously'
parallel --semaphore --id 2jobs -u -j2 'echo job1a 1; sleep 4; echo job1b 3'
@ -200,11 +402,6 @@ par_compress_fail() {
seq 12 | parallel --compress -k seq {} 10000 | md5sum
}
par_round_robin_blocks() {
echo "bug #49664: --round-robin does not complete"
seq 20000000 | parallel -j8 --block 10M --round-robin --pipe wc -c | wc -l
}
par_results_csv() {
echo "bug #: --results csv"
@ -248,85 +445,6 @@ par_tmux_fg() {
stdout parallel --tmux --fg sleep ::: 3 | perl -pe 's/.tmp\S+/tmp/'
}
par_plus_dyn_repl() {
echo "Dynamic replacement strings defined by --plus"
unset myvar
echo ${myvar:-myval}
parallel --rpl '{:-(.+)} $_ ||= $$1' echo {:-myval} ::: "$myvar"
parallel --plus echo {:-myval} ::: "$myvar"
parallel --plus echo {2:-myval} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2:-myval} ::: "wrong" ::: "$myvar" ::: "wrong"
myvar=abcAaAdef
echo ${myvar:2}
parallel --rpl '{:(\d+)} substr($_,0,$$1) = ""' echo {:2} ::: "$myvar"
parallel --plus echo {:2} ::: "$myvar"
parallel --plus echo {2:2} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2:2} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar:2:3}
parallel --rpl '{:(\d+?):(\d+?)} $_ = substr($_,$$1,$$2);' echo {:2:3} ::: "$myvar"
parallel --plus echo {:2:3} ::: "$myvar"
parallel --plus echo {2:2:3} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2:2:3} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${#myvar}
parallel --rpl '{#} $_ = length $_;' echo {#} ::: "$myvar"
# {#} used for job number
parallel --plus echo {#} ::: "$myvar"
echo ${myvar#bc}
parallel --rpl '{#(.+?)} s/^$$1//;' echo {#bc} ::: "$myvar"
parallel --plus echo {#bc} ::: "$myvar"
parallel --plus echo {2#bc} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2#bc} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar#abc}
parallel --rpl '{#(.+?)} s/^$$1//;' echo {#abc} ::: "$myvar"
parallel --plus echo {#abc} ::: "$myvar"
parallel --plus echo {2#abc} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2#abc} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar%de}
parallel --rpl '{%(.+?)} s/$$1$//;' echo {%de} ::: "$myvar"
parallel --plus echo {%de} ::: "$myvar"
parallel --plus echo {2%de} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2%de} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar%def}
parallel --rpl '{%(.+?)} s/$$1$//;' echo {%def} ::: "$myvar"
parallel --plus echo {%def} ::: "$myvar"
parallel --plus echo {2%def} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2%def} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar/def/ghi}
parallel --rpl '{/(.+?)/(.+?)} s/$$1/$$2/;' echo {/def/ghi} ::: "$myvar"
parallel --plus echo {/def/ghi} ::: "$myvar"
parallel --plus echo {2/def/ghi} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2/def/ghi} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar^a}
parallel --rpl '{^(.+?)} s/^($$1)/uc($1)/e;' echo {^a} ::: "$myvar"
parallel --plus echo {^a} ::: "$myvar"
parallel --plus echo {2^a} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2^a} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar^^a}
parallel --rpl '{^^(.+?)} s/($$1)/uc($1)/eg;' echo {^^a} ::: "$myvar"
parallel --plus echo {^^a} ::: "$myvar"
parallel --plus echo {2^^a} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2^^a} ::: "wrong" ::: "$myvar" ::: "wrong"
myvar=AbcAaAdef
echo ${myvar,A}
parallel --rpl '{,(.+?)} s/^($$1)/lc($1)/e;' echo '{,A}' ::: "$myvar"
parallel --plus echo '{,A}' ::: "$myvar"
parallel --plus echo '{2,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo '{-2,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar,,A}
parallel --rpl '{,,(.+?)} s/($$1)/lc($1)/eg;' echo '{,,A}' ::: "$myvar"
parallel --plus echo '{,,A}' ::: "$myvar"
parallel --plus echo '{2,,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo '{-2,,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
}
par_retries_all_fail() {
echo "bug #53748: -k --retries 10 + out of filehandles = blocking"
@ -359,6 +477,7 @@ par_long_line_remote() {
parallel -j1 -S lo -N 10000 echo {} |wc
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | LC_ALL=C sort |
parallel --joblog /tmp/jl-`basename $0` -j10 --tag -k '{} 2>&1'

View file

@ -125,47 +125,6 @@ par_result_replace() {
rm -rf /tmp/par_*_49983-*
}
par_parset() {
echo '### test parset'
. `which env_parallel.bash`
echo 'Put output into $myarray'
parset myarray -k seq 10 ::: 14 15 16
echo "${myarray[1]}"
echo 'Put output into vars "$seq, $pwd, $ls"'
parset "seq pwd ls" -k ::: "seq 10" pwd ls
echo "$seq"
echo 'Put output into vars ($seq, $pwd, $ls)':
into_vars=(seq pwd ls)
parset "${into_vars[*]}" -k ::: "seq 5" pwd ls
echo "$seq"
echo 'The commands to run can be an array'
cmd=("echo '<<joe \"double space\" cartoon>>'" "pwd")
parset data -k ::: "${cmd[@]}"
echo "${data[0]}"
echo "${data[1]}"
echo 'You cannot pipe into parset, but must use a tempfile'
seq 10 > /tmp/parset_input_$$
parset res -k echo :::: /tmp/parset_input_$$
echo "${res[0]}"
echo "${res[9]}"
rm /tmp/parset_input_$$
echo 'or process substitution'
parset res -k echo :::: <(seq 0 10)
echo "${res[0]}"
echo "${res[9]}"
echo 'Commands with newline require -0'
parset var -k -0 ::: 'echo "line1
line2"' 'echo "command2"'
echo "${var[0]}"
}
par_incomplete_linebuffer() {
echo 'bug #51337: --lb does not kill jobs at sigpipe'
cat > /tmp/parallel--lb-test <<'_EOF'
@ -192,55 +151,6 @@ par_header_parens() {
parallel --header : echo {var.} ::: var sub/dir/file.ext
}
par_parset2() {
. `which env_parallel.bash`
echo '### parset into array'
parset arr1 echo ::: foo bar baz
echo ${arr1[0]} ${arr1[1]} ${arr1[2]}
echo '### parset into vars with comma'
parset comma3,comma2,comma1 echo ::: baz bar foo
echo $comma1 $comma2 $comma3
echo '### parset into vars with space'
parset 'space3 space2 space1' echo ::: baz bar foo
echo $space1 $space2 $space3
echo '### parset with newlines'
parset 'newline3 newline2 newline1' seq ::: 3 2 1
echo "$newline1"
echo "$newline2"
echo "$newline3"
echo '### parset into indexed array vars'
parset 'myarray[6],myarray[5],myarray[4]' echo ::: baz bar foo
echo ${myarray[*]}
echo ${myarray[4]} ${myarray[5]} ${myarray[5]}
echo '### env_parset'
alias myecho='echo myecho "$myvar" "${myarr[1]}"'
myvar="myvar"
myarr=("myarr 0" "myarr 1" "myarr 2")
mynewline="`echo newline1;echo newline2;`"
env_parset arr1 myecho ::: foo bar baz
echo "${arr1[0]} ${arr1[1]} ${arr1[2]}"
env_parset comma3,comma2,comma1 myecho ::: baz bar foo
echo "$comma1 $comma2 $comma3"
env_parset 'space3 space2 space1' myecho ::: baz bar foo
echo "$space1 $space2 $space3"
env_parset 'newline3 newline2 newline1' 'echo "$mynewline";seq' ::: 3 2 1
echo "$newline1"
echo "$newline2"
echo "$newline3"
env_parset 'myarray[6],myarray[5],myarray[4]' myecho ::: baz bar foo
echo "${myarray[*]}"
echo "${myarray[4]} ${myarray[5]} ${myarray[5]}"
echo 'bug #52507: parset arr1 -v echo ::: fails'
parset arr1 -v seq ::: 1 2 3
echo "${arr1[2]}"
}
par_pipe_compress_blocks() {
echo "### bug #41482: --pipe --compress blocks at different -j/seq combinations"
seq 1 | parallel -k -j2 --compress -N1 -L1 --pipe cat
@ -2247,4 +2157,4 @@ par_null_resume() {
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | LC_ALL=C sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'
parallel -j6 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -149,6 +149,8 @@ par_test_detected_shell() {
test_unknown_shell() {
shell="$1"
tmp="/tmp/test_unknown_shell_$shell"
# Remove the file to avoid potential text-file-busy
rm -f "$tmp"
cp $(which "$shell") "$tmp"
chmod +x "$tmp"
$tmp -c 'parallel -Dinit echo ::: 1; true' |
@ -249,6 +251,117 @@ par_macron() {
print_it "$(perl -e 'print "\257<\257<\257>\257>"')"
}
par_round_robin_blocks() {
echo "bug #49664: --round-robin does not complete"
seq 20000000 | parallel -j8 --block 10M --round-robin --pipe wc -c | wc -l
}
par_plus_dyn_repl() {
echo "Dynamic replacement strings defined by --plus"
unset myvar
echo ${myvar:-myval}
parallel --rpl '{:-(.+)} $_ ||= $$1' echo {:-myval} ::: "$myvar"
parallel --plus echo {:-myval} ::: "$myvar"
parallel --plus echo {2:-myval} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2:-myval} ::: "wrong" ::: "$myvar" ::: "wrong"
myvar=abcAaAdef
echo ${myvar:2}
parallel --rpl '{:(\d+)} substr($_,0,$$1) = ""' echo {:2} ::: "$myvar"
parallel --plus echo {:2} ::: "$myvar"
parallel --plus echo {2:2} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2:2} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar:2:3}
parallel --rpl '{:(\d+?):(\d+?)} $_ = substr($_,$$1,$$2);' echo {:2:3} ::: "$myvar"
parallel --plus echo {:2:3} ::: "$myvar"
parallel --plus echo {2:2:3} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2:2:3} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${#myvar}
parallel --rpl '{#} $_ = length $_;' echo {#} ::: "$myvar"
# {#} used for job number
parallel --plus echo {#} ::: "$myvar"
echo ${myvar#bc}
parallel --rpl '{#(.+?)} s/^$$1//;' echo {#bc} ::: "$myvar"
parallel --plus echo {#bc} ::: "$myvar"
parallel --plus echo {2#bc} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2#bc} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar#abc}
parallel --rpl '{#(.+?)} s/^$$1//;' echo {#abc} ::: "$myvar"
parallel --plus echo {#abc} ::: "$myvar"
parallel --plus echo {2#abc} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2#abc} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar%de}
parallel --rpl '{%(.+?)} s/$$1$//;' echo {%de} ::: "$myvar"
parallel --plus echo {%de} ::: "$myvar"
parallel --plus echo {2%de} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2%de} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar%def}
parallel --rpl '{%(.+?)} s/$$1$//;' echo {%def} ::: "$myvar"
parallel --plus echo {%def} ::: "$myvar"
parallel --plus echo {2%def} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2%def} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar/def/ghi}
parallel --rpl '{/(.+?)/(.+?)} s/$$1/$$2/;' echo {/def/ghi} ::: "$myvar"
parallel --plus echo {/def/ghi} ::: "$myvar"
parallel --plus echo {2/def/ghi} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2/def/ghi} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar^a}
parallel --rpl '{^(.+?)} s/^($$1)/uc($1)/e;' echo {^a} ::: "$myvar"
parallel --plus echo {^a} ::: "$myvar"
parallel --plus echo {2^a} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2^a} ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar^^a}
parallel --rpl '{^^(.+?)} s/($$1)/uc($1)/eg;' echo {^^a} ::: "$myvar"
parallel --plus echo {^^a} ::: "$myvar"
parallel --plus echo {2^^a} ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo {-2^^a} ::: "wrong" ::: "$myvar" ::: "wrong"
myvar=AbcAaAdef
echo ${myvar,A}
parallel --rpl '{,(.+?)} s/^($$1)/lc($1)/e;' echo '{,A}' ::: "$myvar"
parallel --plus echo '{,A}' ::: "$myvar"
parallel --plus echo '{2,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo '{-2,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
echo ${myvar,,A}
parallel --rpl '{,,(.+?)} s/($$1)/lc($1)/eg;' echo '{,,A}' ::: "$myvar"
parallel --plus echo '{,,A}' ::: "$myvar"
parallel --plus echo '{2,,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
parallel --plus echo '{-2,,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
}
par_keeporder_roundrobin() {
echo 'bug #50081: --keep-order --round-robin should give predictable results'
export PARALLEL="-j13 --block 1m --pipe --roundrobin"
random500m() {
< /dev/zero openssl enc -aes-128-ctr -K 1234 -iv 1234 2>/dev/null |
head -c 500m;
}
a=$(random500m | parallel -k 'echo {#} $(md5sum)' | sort)
b=$(random500m | parallel -k 'echo {#} $(md5sum)' | sort)
c=$(random500m | parallel 'echo {#} $(md5sum)' | sort)
if [ "$a" == "$b" ] ; then
# Good: -k should be == -k
if [ "$a" == "$c" ] ; then
# Bad: without -k the command should give different output
echo 'Broken: a == c'
printf "$a\n$b\n$c\n"
else
echo OK
fi
else
echo 'Broken: a <> b'
printf "$a\n$b\n$c\n"
fi
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
parallel --delay 0.3 -j0 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -4,6 +4,109 @@
# Each should be taking 3-10s and be possible to run in parallel
# I.e.: No race conditions, no logins
par_maxargs() {
echo '### Test -n and --max-args: Max number of args per line (only with -X and -m)'
(echo line 1;echo line 2;echo line 3) | parallel -k -n1 -m echo
(echo line 1;echo line 1;echo line 2) | parallel -k -n2 -m echo
(echo line 1;echo line 2;echo line 3) | parallel -k -n1 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k -n2 -X echo
(echo line 1;echo line 2;echo line 3) | parallel -k -n1 echo
(echo line 1;echo line 1;echo line 2) | parallel -k -n2 echo
(echo line 1;echo line 2;echo line 3) | parallel -k --max-args=1 -X echo
(echo line 1;echo line 2;echo line 3) | parallel -k --max-args 1 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k --max-args=2 -X echo
(echo line 1;echo line 1;echo line 2) | parallel -k --max-args 2 -X echo
(echo line 1;echo line 2;echo line 3) | parallel -k --max-args 1 echo
(echo line 1;echo line 1;echo line 2) | parallel -k --max-args 2 echo
}
par_totaljob_repl() {
echo '{##} bug #45841: Replacement string for total no of jobs'
parallel -k --plus echo {##} ::: {a..j};
parallel -k 'echo {= $::G++ > 3 and ($_=$Global::JobQueue->total_jobs());=}' ::: {1..10}
parallel -k -N7 --plus echo {#} {##} ::: {1..14}
parallel -k -N7 --plus echo {#} {##} ::: {1..15}
parallel -k -S 8/: -X --plus echo {#} {##} ::: {1..15}
}
par_jobslot_repl() {
echo 'bug #46232: {%} with --bar/--eta/--shuf or --halt xx% broken'
parallel --bar -kj2 --delay 0.1 echo {%} ::: a b ::: c d e 2>/dev/null
parallel --halt now,fail=10% -kj2 --delay 0.1 echo {%} ::: a b ::: c d e
parallel --eta -kj2 --delay 0.1 echo {%} ::: a b ::: c d e 2>/dev/null
parallel --shuf -kj2 --delay 0.1 echo {%} ::: a b ::: c d e 2>/dev/null
echo 'bug #46231: {%} with --pipepart broken. Should give 1+2'
seq 10000 > /tmp/num10000
parallel -k --pipepart -ka /tmp/num10000 --block 10k -j2 --delay 0.05 echo {%}
rm /tmp/num10000
}
par_shard() {
echo '### --shard'
# Each of the 5 lines should match:
# ##### ##### ######
seq 100000 | parallel --pipe --shard 1 -j5 wc |
perl -pe 's/(.*\d{5,}){3}/OK/'
# Data should be sharded to all processes
shard_on_col() {
col=$1
seq 10 99 | shuf | perl -pe 's/(.)/$1\t/g' |
parallel --pipe --shard $col -j2 --colsep "\t" sort -k$col |
field $col | uniq -c | sort
}
shard_on_col 1
shard_on_col 2
echo '*** broken'
# Shorthand for --pipe -j+0
seq 100000 | parallel --shard 1 wc |
perl -pe 's/(.*\d{5,}){3}/OK/'
# Combine with arguments
seq 100000 | parallel --shard 1 echo {}\;wc ::: {1..5} ::: a b |
perl -pe 's/(.*\d{5,}){3}/OK/'
}
par_distribute_args_at_EOF() {
echo '### Test distribute arguments at EOF to 2 jobslots'
seq 1 92 | parallel -j2 -kX -s 100 echo
echo '### Test distribute arguments at EOF to 5 jobslots'
seq 1 92 | parallel -j5 -kX -s 100 echo
echo '### Test distribute arguments at EOF to infinity jobslots'
seq 1 92 | parallel -j0 -kX -s 100 echo 2>/dev/null
echo '### Test -N is not broken by distribution - single line'
seq 9 | parallel -N 10 echo
echo '### Test -N is not broken by distribution - two lines'
seq 19 | parallel -k -N 10 echo
}
par_test_X_with_multiple_source() {
echo '### Test {} multiple times in different commands'
seq 10 | parallel -v -Xj1 echo {} \; echo {}
echo '### Test of -X {1}-{2} with multiple input sources'
parallel -j1 -kX echo {1}-{2} ::: a ::: b
parallel -j2 -kX echo {1}-{2} ::: a b ::: c d
parallel -j2 -kX echo {1}-{2} ::: a b c ::: d e f
parallel -j0 -kX echo {1}-{2} ::: a b c ::: d e f
echo '### Test of -X {}-{.} with multiple input sources'
parallel -j1 -kX echo {}-{.} ::: a ::: b
parallel -j2 -kX echo {}-{.} ::: a b ::: c d
parallel -j2 -kX echo {}-{.} ::: a b c ::: d e f
parallel -j0 -kX echo {}-{.} ::: a b c ::: d e f
}
par_resume_failed_k() {
echo '### bug #38299: --resume-failed -k'
tmp=$(tempfile)
@ -28,19 +131,6 @@ par_resume_k() {
rm -f $tmp
}
par_pipe_unneeded_procs() {
echo '### Test bug #34241: --pipe should not spawn unneeded processes'
seq 3 | parallel -j30 --pipe --block-size 10 cat\;echo o 2> >(grep -Ev 'Warning: Starting|Warning: Consider')
}
par_results_arg_256() {
echo '### bug #42089: --results with arg > 256 chars (should be 1 char shorter)'
parallel --results parallel_test_dir echo ::: 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456;
ls parallel_test_dir/1/
rm -rf parallel_test_dir
}
par_slow_args_generation() {
echo '### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834'
seq 1 3 | parallel -j1 "sleep 2; echo {}" | parallel -kj2 echo
@ -63,7 +153,7 @@ par_kill_hup() {
parallel -j 2 -q bash -c 'sleep {} & pid=$!; wait $pid' ::: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 &
T=$!
sleep 2
sleep 2.9
pstree $$
kill -HUP $T
sleep 2
@ -118,32 +208,6 @@ par_pipepart_block() {
rm /run/shm/parallel$$
}
par_keeporder_roundrobin() {
echo 'bug #50081: --keep-order --round-robin should give predictable results'
export PARALLEL="-j13 --block 1m --pipe --roundrobin"
random500m() {
< /dev/zero openssl enc -aes-128-ctr -K 1234 -iv 1234 2>/dev/null |
head -c 500m;
}
a=$(random500m | parallel -k 'echo {#} $(md5sum)' | sort)
b=$(random500m | parallel -k 'echo {#} $(md5sum)' | sort)
c=$(random500m | parallel 'echo {#} $(md5sum)' | sort)
if [ "$a" == "$b" ] ; then
# Good: -k should be == -k
if [ "$a" == "$c" ] ; then
# Bad: without -k the command should give different output
echo 'Broken: a == c'
printf "$a\n$b\n$c\n"
else
echo OK
fi
else
echo 'Broken: a <> b'
printf "$a\n$b\n$c\n"
fi
}
par_multiline_commands() {
echo 'bug #50781: joblog format with multiline commands'
rm -f /tmp/jl.$$
@ -212,6 +276,7 @@ par_delay_human_readable() {
par_exitval_signal() {
echo '### Test --joblog with exitval and Test --joblog with signal -- timing dependent'
rm -f /tmp/parallel_sleep
rm -f mysleep
cp /bin/sleep mysleep
chmod +x mysleep
parallel --joblog /tmp/parallel_joblog_signal \
@ -314,7 +379,7 @@ par_lb_mem_usage() {
par_groupby() {
tsv() {
printf "%s\t" a1 b1 c1; echo
printf "%s\t" a1 b1 C1; echo
printf "%s\t" 2 2 2; echo
printf "%s\t" 3 2 2; echo
printf "%s\t" 3 3 2; echo
@ -326,7 +391,7 @@ par_groupby() {
ssv() {
# space separated
printf "%s\t" a1 b1 c1; echo
printf "%s\t" a1 b1 C1; echo
printf "%s " 2 2 2; echo
printf "%s \t" 3 2 2; echo
printf "%s\t " 3 3 2; echo
@ -338,7 +403,7 @@ par_groupby() {
cssv() {
# , + space separated
printf "%s,\t" a1 b1 c1; echo
printf "%s,\t" a1 b1 C1; echo
printf "%s ," 2 2 2; echo
printf "%s ,\t" 3 2 2; echo
printf "%s\t, " 3 3 2; echo
@ -350,7 +415,7 @@ par_groupby() {
csv() {
# , separated
printf "%s," a1 b1 c1; echo
printf "%s," a1 b1 C1; echo
printf "%s," 2 2 2; echo
printf "%s," 3 2 2; echo
printf "%s," 3 3 2; echo
@ -372,18 +437,20 @@ par_groupby() {
export -f tester
parallel --tag -k tester \
::: -N1 '--block 20' \
::: '3 $_%=2' 3 's/^(.).*/$1/' c1 'c1 $_%=2' \
::: '3 $_%=2' 3 's/^(.).*/$1/' C1 'C1 $_%=2' \
::: tsv ssv cssv csv \
:::+ '\t' '\s+' '[\s,]+' ',' \
:::+ '\t' '\s+' '[\s,]+' ','
# Test --colsep char
# Test --colsep pattern
# Test --colsep -N1
# Test --colsep --block 20
# Test --groupby col
# Test --groupby 'col perl'
# Test space sep --colsep '\s'
# Test --colsep --header :
# Test --colsep char: OK
# Test --colsep pattern: OK
# Test --colsep -N1: OK
# Test --colsep --block 20: OK
# Test --groupby colno: OK
# Test --groupby 'colno perl': OK
# Test --groupby colname: OK
# Test --groupby 'colname perl': OK
# Test space sep --colsep '\s': OK
# Test --colsep --header : (OK: --header : not needed)
}
export -f $(compgen -A function | grep par_)

View file

@ -1,36 +1,41 @@
#!/bin/bash
# Assume /dev/shm is easy to fill up
SHM=/tmp/shm/parallel
# Make a dir that is easy to fill up
SHM=/tmp/shm/parallel-local14
mkdir -p $SHM
sudo umount -l $SHM
sudo mount -t tmpfs -o size=10% none $SHM
echo '3 x terminated is OK' >&2
echo '### Test $TMPDIR'
TMPDIR=$SHM stdout timeout -k 1 6 parallel pv -qL10m {} ::: /dev/zero >/dev/null &
PID=$!
seq 1 200 | parallel -N0 -I // -j1 "df $SHM | parallel -k --colsep ' +' echo {4}|tail -n 1;sleep 0.1" \
| stdout timeout -k 1 10 perl -ne 'BEGIN{$a=<>} $b=<>;
if ($a-1000 > $b) { print "More than 1 MB gone. Good!\n";exit }'
kill $PID
wait
sleep 0.1
check_disk_is_filling() {
# Run df every 0.1 second for 20 seconds
seq 1 200 |
parallel --delay 0.1 -N0 -I // -j1 df $SHM |
grep --line-buffer $SHM |
# tee /dev/tty |
perl -a -F'\s+' -ne '$a ||=$F[3]; $b=$F[3];
if ($a-1000 > $b) { print "More than 1 MB gone. Good!\n";exit }'
}
mytest() {
# '' or TMPDIR=$SHM or TMPDIR=/tmp
env="$1"
# '' or --tmpdir $SHM
arg="$2"
sudo umount -l $SHM 2>/dev/null
sudo mount -t tmpfs -o size=10% none $SHM
eval export $env
parallel --timeout 15 $arg pv -qL10m {} ::: /dev/zero >/dev/null &
PID=$!
TMPDIR=/tmp
check_disk_is_filling
kill -TERM $PID
sudo umount -l $SHM
}
echo '### Test --tmpdir'
stdout timeout -k 1 6 parallel --tmpdir $SHM pv -qL10m {} ::: /dev/zero >/dev/null &
PID=$!
seq 1 200 | parallel -N0 -I // -j1 "df $SHM | parallel -k --colsep ' +' echo {4}|tail -n 1;sleep 0.1" \
| stdout timeout -k 1 10 perl -ne 'BEGIN{$a=<>} $b=<>; if ($a-1000 > $b) { print "More than 1 MB gone. Good!\n"; exit }'
kill $PID
wait
sleep 0.1
mytest 'Dummy=dummy' "--tmpdir $SHM"
echo '### Test $TMPDIR'
mytest TMPDIR=$SHM ""
echo '### Test $TMPDIR and --tmpdir'
TMPDIR=/tmp stdout timeout -k 1 6 parallel --tmpdir $SHM pv -qL10m {} ::: /dev/zero >/dev/null &
PID=$!
seq 1 200 | parallel -N0 -I // -j1 "df $SHM | parallel -k --colsep ' +' echo {4}|tail -n 1;sleep 0.1" \
| stdout timeout -k 1 10 perl -ne 'BEGIN{$a=<>} $b=<>; if ($a-1000 > $b) { print "More than 1 MB gone. Good!\n"; exit }'
kill $PID
wait
sleep 0.1
mytest TMPDIR=/tmp "--tmpdir $SHM"

View file

@ -1,244 +1,5 @@
echo '### Test bug #43376: {%} and {#} with --pipe'
### Test bug #43376: {%} and {#} with --pipe
echo foo | parallel -q --pipe -k echo {#}
1
echo foo | parallel --pipe -k echo {%}
1
echo foo | parallel -q --pipe -k echo {%}
1
echo foo | parallel --pipe -k echo {#}
1
echo '**'
**
echo '### {} as part of the command'
### {} as part of the command
echo p /bin/ls | parallel l{= s/p/s/ =}
/bin/ls
echo /bin/ls-p | parallel --colsep '-' l{=2 s/p/s/ =} {1}
/bin/ls
echo s /bin/ls | parallel l{}
/bin/ls
echo /bin/ls | parallel ls {}
/bin/ls
echo ls /bin/ls | parallel {}
/bin/ls
echo ls /bin/ls | parallel
/bin/ls
echo '**'
**
echo '### bug #43817: Some JP char cause problems in positional replacement strings'
### bug #43817: Some JP char cause problems in positional replacement strings
parallel -k echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
<EFBFBD><<3C>>
<EFBFBD><1 $_=2<>>
parallel -k echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
<EFBFBD><<3C>>
<EFBFBD><1 $_=2<>>
parallel -Xj1 echo ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
<EFBFBD><<3C>> <20><1 $_=2<>> ワ
parallel -Xj1 echo {1} ::: '<27><<3C>>' '<27><1 $_=2<>>' 'ワ'
<EFBFBD><<3C>>
echo '**'
**
echo '### --rpl % that is a substring of longer --rpl %D'
### --rpl % that is a substring of longer --rpl %D
parallel --rpl '{+.} s:.*\.::' --rpl '%' --rpl '%D $_=::shell_quote(::dirname($_));' --rpl '%B s:.*/::;s:\.[^/.]+$::;' --rpl '%E s:.*\.::' 'echo {}=%;echo %D={//};echo %B={/.};echo %E={+.};echo %D/%B.%E={}' ::: a.b/c.d/e.f
a.b/c.d/e.f=a.b/c.d/e.f
a.b/c.d=a.b/c.d
e=e
f=f
a.b/c.d/e.f=a.b/c.d/e.f
echo '**'
**
echo '### Disk full'
### Disk full
cat /dev/zero >$SMALLDISK/out; parallel --tmpdir $SMALLDISK echo ::: OK; rm $SMALLDISK/out
cat: write error: No space left on device
parallel: Error: Output is incomplete.
parallel: Error: Cannot append to buffer file in /mnt/ram.
parallel: Error: Is the disk full?
parallel: Error: Change $TMPDIR with --tmpdir or use --compress.
Warning: unable to close filehandle properly: No space left on device during global destruction.
echo '**'
**
echo '### PARALLEL_TMUX not found'
### PARALLEL_TMUX not found
PARALLEL_TMUX=not-existing parallel --tmux echo ::: 1
parallel: Error: not-existing not found in $PATH.
echo '**'
**
echo '### bug #44995: parallel echo {#} ::: 1 2 ::: 1 2'
### bug #44995: parallel echo {#} ::: 1 2 ::: 1 2
parallel -k echo {#} ::: 1 2 ::: 1 2
1
2
3
4
echo '**'
**
echo 'bug #46016: --joblog should not log when --dryrun'
bug #46016: --joblog should not log when --dryrun
parallel --dryrun --joblog - echo ::: Only_this
echo Only_this
echo '**'
**
echo 'bug #47002: --tagstring with -d \n\n'
bug #47002: --tagstring with -d \n\n
(seq 3;echo;seq 4) | parallel -k -d '\n\n' --tagstring {%} echo ABC';'echo
1 ABC
1 1
1 2
1 3
2 ABC
2 1
2 2
2 3
2 4
2
echo '**'
**
echo 'bug #47290: xargs: Warning: a NUL character occurred in the input'
bug #47290: xargs: Warning: a NUL character occurred in the input
perl -e 'print "foo\0not printed"' | parallel echo
foo\0not printed
parallel: Warning: A NUL character in the input was replaced with \0.
parallel: Warning: NUL cannot be passed through in the argument list.
parallel: Warning: Did you mean to use the --null option?
echo '**'
**
echo '### Test --max-procs and -P: Number of processes'
### Test --max-procs and -P: Number of processes
seq 1 10 | parallel -k --max-procs +0 echo max proc
max proc 1
max proc 2
max proc 3
max proc 4
max proc 5
max proc 6
max proc 7
max proc 8
max proc 9
max proc 10
seq 1 10 | parallel -k -P 200% echo 200% proc
200% proc 1
200% proc 2
200% proc 3
200% proc 4
200% proc 5
200% proc 6
200% proc 7
200% proc 8
200% proc 9
200% proc 10
echo '### Test --max-chars and -s: Max number of chars in a line'
### Test --max-chars and -s: Max number of chars in a line
(echo line 1;echo line 1;echo line 2) | parallel -k --max-chars 25 -X echo
line 1 line 1
line 2
(echo line 1;echo line 1;echo line 2) | parallel -k -s 25 -X echo
line 1 line 1
line 2
echo '### Test --no-run-if-empty and -r: This should give no output'
### Test --no-run-if-empty and -r: This should give no output
echo " " | parallel -r echo
echo " " | parallel --no-run-if-empty echo
echo '### Test --help and -h: Help output (just check we get the same amount of lines)'
### Test --help and -h: Help output (just check we get the same amount of lines)
echo Output from -h and --help
Output from -h and --help
parallel -h | wc -l
37
parallel --help | wc -l
37
echo '### Test --version: Version output (just check we get the same amount of lines)'
### Test --version: Version output (just check we get the same amount of lines)
parallel --version | wc -l
10
echo '### Test --verbose and -t'
### Test --verbose and -t
(echo b; echo c; echo f) | parallel -k -t echo {}ar 2>&1 >/dev/null
echo bar
echo car
echo far
(echo b; echo c; echo f) | parallel -k --verbose echo {}ar 2>&1 >/dev/null
echo bar
echo car
echo far
echo '### Test --show-limits'
### Test --show-limits
(echo b; echo c; echo f) | parallel -k --show-limits echo {}ar
Maximal size of command: 131049
Maximal used size of command: 131049
Execution of will continue now, and it will try to read its input
and run commands; if this is not what you wanted to happen, please
press CTRL-D or CTRL-C
bar
car
far
(echo b; echo c; echo f) | parallel -j1 -kX --show-limits -s 100 echo {}ar
Maximal size of command: 131049
Maximal used size of command: 100
Execution of will continue now, and it will try to read its input
and run commands; if this is not what you wanted to happen, please
press CTRL-D or CTRL-C
bar car far
echo '### Test 0-arguments'
### Test 0-arguments
seq 1 2 | parallel -k -n0 echo n0
n0
n0
seq 1 2 | parallel -k -L0 echo L0
L0
L0
seq 1 2 | parallel -k -N0 echo N0
N0
N0
echo '### Because of --tollef -l, then -l0 == -l1, sorry'
### Because of --tollef -l, then -l0 == -l1, sorry
seq 1 2 | parallel -k -l0 echo l0
l0 1
l0 2
echo '### Test replace {}'
### Test replace {}
seq 1 2 | parallel -k -N0 echo replace {} curlies
replace curlies
replace curlies
echo '### Test arguments on commandline'
### Test arguments on commandline
parallel -k -N0 echo args on cmdline ::: 1 2
args on cmdline
args on cmdline
echo '### Test --nice locally'
### Test --nice locally
parallel --nice 1 -vv 'PAR=a bash -c "echo \$PAR {}"' ::: b
PAR=a bash -c "echo \$PAR b"
a b
### 1 .par file from --files expected
0
par_0_no_newline A single zero without \n should not be ignored
par_0_no_newline 0
par_END ### Test -i and --replace: Replace with argument
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END ### Test -E: Artificial end-of-file
par_END include this
par_END include this
par_END ### Test -e and --eof: Artificial end-of-file
par_END include this
par_END include this
par_END include this
par_END include this
par_PARALLEL_ENV ### PARALLEL_ENV as variable
par_PARALLEL_ENV OK as variable
par_PARALLEL_ENV ### PARALLEL_ENV as file
@ -273,6 +34,9 @@ par_argfile 7
par_argfile 8
par_argfile 9
par_argfile 10
par_arguments_on_cmdline ### Test arguments on commandline
par_arguments_on_cmdline args on cmdline
par_arguments_on_cmdline args on cmdline
par_basic_halt parallel: This job failed:
par_basic_halt false
par_basic_halt parallel: This job succeeded:
@ -331,54 +95,13 @@ par_delimiter line 3
par_delimiter delimiter TAB line 1
par_delimiter line 2
par_delimiter line 3
par_distribute_args_at_EOF ### Test distribute arguments at EOF to 2 jobslots
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
par_distribute_args_at_EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
par_distribute_args_at_EOF 66 67 68 69 70 71 72 73 74 75 76 77 78 79
par_distribute_args_at_EOF 80 81 82 83 84 85 86 87 88 89 90 91 92
par_distribute_args_at_EOF ### Test distribute arguments at EOF to 5 jobslots
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
par_distribute_args_at_EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
par_distribute_args_at_EOF 66 67 68 69 70 71
par_distribute_args_at_EOF 72 73 74 75 76 77
par_distribute_args_at_EOF 78 79 80 81 82 83
par_distribute_args_at_EOF 84 85 86 87 88 89
par_distribute_args_at_EOF 90 91 92
par_distribute_args_at_EOF ### Test distribute arguments at EOF to infinity jobslots
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
par_distribute_args_at_EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
par_distribute_args_at_EOF 66
par_distribute_args_at_EOF 67
par_distribute_args_at_EOF 68
par_distribute_args_at_EOF 69
par_distribute_args_at_EOF 70
par_distribute_args_at_EOF 71
par_distribute_args_at_EOF 72
par_distribute_args_at_EOF 73
par_distribute_args_at_EOF 74
par_distribute_args_at_EOF 75
par_distribute_args_at_EOF 76
par_distribute_args_at_EOF 77
par_distribute_args_at_EOF 78
par_distribute_args_at_EOF 79
par_distribute_args_at_EOF 80
par_distribute_args_at_EOF 81
par_distribute_args_at_EOF 82
par_distribute_args_at_EOF 83
par_distribute_args_at_EOF 84
par_distribute_args_at_EOF 85
par_distribute_args_at_EOF 86
par_distribute_args_at_EOF 87
par_distribute_args_at_EOF 88
par_distribute_args_at_EOF 89
par_distribute_args_at_EOF 90
par_distribute_args_at_EOF 91
par_distribute_args_at_EOF 92
par_distribute_args_at_EOF ### Test -N is not broken by distribution - single line
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9
par_distribute_args_at_EOF ### Test -N is not broken by distribution - two lines
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10
par_distribute_args_at_EOF 11 12 13 14 15 16 17 18 19
par_disk_full ### Disk full
par_disk_full cat: write error: No space left on device
par_disk_full parallel: Error: Output is incomplete.
par_disk_full parallel: Error: Cannot append to buffer file in /mnt/ram.
par_disk_full parallel: Error: Is the disk full?
par_disk_full parallel: Error: Change $TMPDIR with --tmpdir or use --compress.
par_disk_full Warning: unable to close filehandle properly: No space left on device during global destruction.
par_dryrun_append_joblog --dry-run should not append to joblog
par_dryrun_append_joblog 1
par_dryrun_append_joblog 2
@ -388,6 +111,11 @@ par_dryrun_append_joblog echo 2
par_dryrun_append_joblog echo 3
par_dryrun_append_joblog echo 4
par_dryrun_append_joblog 4
par_echo_jobseq ### bug #44995: parallel echo {#} ::: 1 2 ::: 1 2
par_echo_jobseq 1
par_echo_jobseq 2
par_echo_jobseq 3
par_echo_jobseq 4
par_empty bug #:
par_empty true
par_empty_command bug #54647: parset ignores empty lines
@ -437,6 +165,10 @@ par_halt_one_job 1
par_halt_one_job parallel: This job failed:
par_halt_one_job echo 1;exit 1
par_halt_one_job parallel: Starting no more jobs. Waiting for 0 jobs to finish.
par_help ### Test --help and -h: Help output (just check we get the same amount of lines)
par_help Output from -h and --help
par_help 37
par_help 37
par_inefficient_L bug #37325: Inefficiency of --pipe -L
par_inefficient_L 276 276 996
par_inefficient_L FOO
@ -456,37 +188,23 @@ par_inefficient_L 200 200 1000
par_inefficient_L FOO
par_inefficient_L 184 184 920
par_inefficient_L FOO
par_jobslot_repl bug #46232: {%} with --bar/--eta/--shuf or --halt xx% broken
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl bug #46231: {%} with --pipepart broken. Should give 1+2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_japanese_chars_in_replacement_string ### bug #43817: Some JP char cause problems in positional replacement strings
par_japanese_chars_in_replacement_string <09><<3C>>
par_japanese_chars_in_replacement_string <09><1 $_=2<>>
par_japanese_chars_in_replacement_string ワ
par_japanese_chars_in_replacement_string <09><<3C>>
par_japanese_chars_in_replacement_string <09><1 $_=2<>>
par_japanese_chars_in_replacement_string ワ
par_japanese_chars_in_replacement_string <09><<3C>> <20><1 $_=2<>> ワ
par_japanese_chars_in_replacement_string <09><<3C>>
par_jobslot_jobnumber_pipe ### Test bug #43376: {%} and {#} with --pipe
par_jobslot_jobnumber_pipe 1
par_jobslot_jobnumber_pipe 1
par_jobslot_jobnumber_pipe 1
par_jobslot_jobnumber_pipe 1
par_l0_is_l1 ### Because of --tollef -l, then -l0 == -l1, sorry
par_l0_is_l1 l0 1
par_l0_is_l1 l0 2
par_linebuffer_files ### bug #48658: --linebuffer --files
par_linebuffer_files 10
par_link_files_as_only_arg bug #50685: single ::::+ does not work
@ -699,96 +417,50 @@ par_long_cmd_mem_use perl -e '$r=rand(shift); for($f = 0; $f < $r; $f++){ $a = "
par_long_cmd_mem_use perl -e '$r=rand(shift); for($f = 0; $f < $r; $f++){ $a = "a"x100 } print shift,"\n"' 10000 97
par_long_cmd_mem_use perl -e '$r=rand(shift); for($f = 0; $f < $r; $f++){ $a = "a"x100 } print shift,"\n"' 10000 98
par_long_cmd_mem_use perl -e '$r=rand(shift); for($f = 0; $f < $r; $f++){ $a = "a"x100 } print shift,"\n"' 10000 99
par_maxargs ### Test -n and --max-args: Max number of args per line (only with -X and -m)
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxchar_s ### Test --max-chars and -s: Max number of chars in a line
par_maxchar_s line 1 line 1
par_maxchar_s line 2
par_maxchar_s line 1 line 1
par_maxchar_s line 2
par_maxproc ### Test --max-procs and -P: Number of processes
par_maxproc max proc 1
par_maxproc max proc 2
par_maxproc max proc 3
par_maxproc max proc 4
par_maxproc max proc 5
par_maxproc max proc 6
par_maxproc max proc 7
par_maxproc max proc 8
par_maxproc max proc 9
par_maxproc max proc 10
par_maxproc 200% proc 1
par_maxproc 200% proc 2
par_maxproc 200% proc 3
par_maxproc 200% proc 4
par_maxproc 200% proc 5
par_maxproc 200% proc 6
par_maxproc 200% proc 7
par_maxproc 200% proc 8
par_maxproc 200% proc 9
par_maxproc 200% proc 10
par_newline_in_command Command with newline and positional replacement strings
par_newline_in_command O K
par_nice_locally ### Test --nice locally
par_nice_locally PAR=a bash -c "echo \$PAR b"
par_nice_locally a b
par_no_command_given ### Test bugfix if no command given
par_no_command_given 1 2
par_no_command_given /bin/bash: 3: command not found
par_no_command_given parallel: Error: Command line too long (1000002 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_no_joblog_with_dryrun bug #46016: --joblog should not log when --dryrun
par_no_joblog_with_dryrun echo Only_this
par_no_run_if_empty ### Test --no-run-if-empty and -r: This should give no output
par_parcat_args_stdin bug #51690: parcat: read args from stdin
par_parcat_args_stdin OK1
par_parcat_args_stdin OK2
par_parcat_rm bug #51691: parcat --rm remove fifo when opened
par_parcat_rm OK1
par_parcat_rm OK file removed
par_perlexpr_repl ### {= and =} in different groups separated by space
par_perlexpr_repl b
par_perlexpr_repl b
par_perlexpr_repl bb
par_perlexpr_repl bb
par_perlexpr_repl b{= b
par_perlexpr_repl b{=b
par_perlexpr_repl b {=a
par_perlexpr_repl {=a
par_perlexpr_repl {= a
par_perlexpr_repl {= a =}
par_perlexpr_repl ### bug #45842: Do not evaluate {= =} twice
par_perlexpr_repl 1
par_perlexpr_repl 2
par_perlexpr_repl 3
par_perlexpr_repl 4
par_perlexpr_repl 1
par_perlexpr_repl 2
par_perlexpr_repl 3
par_perlexpr_repl 4
par_perlexpr_repl 1 2
par_perlexpr_repl 3 4
par_perlexpr_repl 5 6
par_perlexpr_repl 7 8
par_perlexpr_repl 9 10
par_perlexpr_repl 11 12
par_perlexpr_repl 13 14
par_perlexpr_repl 15 16
par_perlexpr_repl 17 18
par_perlexpr_repl 19 20
par_perlexpr_repl 21 22
par_perlexpr_repl 23 24
par_perlexpr_repl 1
par_perlexpr_repl 2
par_perlexpr_repl 3
par_perlexpr_repl 4
par_perlexpr_repl 5
par_perlexpr_repl 6
par_perlexpr_repl 7
par_perlexpr_repl 8
par_perlexpr_repl 9
par_perlexpr_repl 10
par_perlexpr_repl 11
par_perlexpr_repl 12
par_perlexpr_repl ### bug #45939: {2} in {= =} fails
par_perlexpr_repl OK
par_perlexpr_repl OK-OK
par_perlexpr_with_newline Perl expression spanning 2 lines
par_pipe_N1_regexp bug #55131: --regexp --recstart hangs
par_pipe_N1_regexp These should give the same
@ -876,6 +548,11 @@ par_pipe_to_func pipefunc OK
par_pipe_to_func 1
par_pipe_to_func pipefunc and more OK
par_pipe_to_func and more OK
par_pipe_unneeded_procs ### Test bug #34241: --pipe should not spawn unneeded processes
par_pipe_unneeded_procs 1
par_pipe_unneeded_procs 2
par_pipe_unneeded_procs 3
par_pipe_unneeded_procs o
par_pipepart_block_bigger_2G ### Test that --pipepart can have blocks > 2GB
par_pipepart_block_bigger_2G 1 1 4
par_pipepart_header ### bug #44614: --pipepart --header off by one
@ -1051,47 +728,55 @@ par_read_from_stdin b 6
par_read_from_stdin b 7
par_read_from_stdin b 8
par_read_from_stdin b 9
par_replace_replacementstring ### Test replace {}
par_replace_replacementstring replace curlies
par_replace_replacementstring replace curlies
par_replacement_string_as_part_of_command ### {} as part of the command
par_replacement_string_as_part_of_command /bin/ls
par_replacement_string_as_part_of_command /bin/ls
par_replacement_string_as_part_of_command /bin/ls
par_replacement_string_as_part_of_command /bin/ls
par_replacement_string_as_part_of_command /bin/ls
par_replacement_string_as_part_of_command /bin/ls
par_results ### --results test.csv
par_results a
par_results b
par_results c
par_results_arg_256 ### bug #42089: --results with arg > 256 chars (should be 1 char shorter)
par_results_arg_256 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
par_results_arg_256 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
par_retries_replacement_string 11
par_retries_replacement_string 22
par_retries_replacement_string 22
par_retries_replacement_string 33
par_retries_replacement_string 33
par_retries_replacement_string 33
par_rpl_that_is_substring_of_longer_rpl ### --rpl % that is a substring of longer --rpl %D
par_rpl_that_is_substring_of_longer_rpl a.b/c.d/e.f=a.b/c.d/e.f
par_rpl_that_is_substring_of_longer_rpl a.b/c.d=a.b/c.d
par_rpl_that_is_substring_of_longer_rpl e=e
par_rpl_that_is_substring_of_longer_rpl f=f
par_rpl_that_is_substring_of_longer_rpl a.b/c.d/e.f=a.b/c.d/e.f
par_sem_quote ### sem --quote should not add empty argument
par_sem_quote echo
par_sem_quote
par_shard ### --shard
par_shard OK
par_shard OK
par_shard OK
par_shard OK
par_shard OK
par_shard 10 1
par_shard 10 2
par_shard 10 3
par_shard 10 4
par_shard 10 5
par_shard 10 6
par_shard 10 7
par_shard 10 8
par_shard 10 9
par_shard 9 0
par_shard 9 1
par_shard 9 2
par_shard 9 3
par_shard 9 4
par_shard 9 5
par_shard 9 6
par_shard 9 7
par_shard 9 8
par_shard 9 9
par_shard *** broken
par_shard parallel: Error: --tee requres --jobs to be higher. Try --jobs 0.
par_shard parallel: Error: --tee requres --jobs to be higher. Try --jobs 0.
par_show_limits ### Test --show-limits
par_show_limits Maximal size of command: 131049
par_show_limits Maximal used size of command: 131049
par_show_limits
par_show_limits Execution of will continue now, and it will try to read its input
par_show_limits and run commands; if this is not what you wanted to happen, please
par_show_limits press CTRL-D or CTRL-C
par_show_limits bar
par_show_limits car
par_show_limits far
par_show_limits Maximal size of command: 131049
par_show_limits Maximal used size of command: 100
par_show_limits
par_show_limits Execution of will continue now, and it will try to read its input
par_show_limits and run commands; if this is not what you wanted to happen, please
par_show_limits press CTRL-D or CTRL-C
par_show_limits bar car far
par_slow_pipe_regexp ### bug #53718: --pipe --regexp -N blocks
par_slow_pipe_regexp This should take a few ms, but took more than 2 hours
par_slow_pipe_regexp 980 981 5881
@ -1106,6 +791,17 @@ par_tagstring_pipe bug #50228: --pipe --tagstring broken
par_tagstring_pipe 1 1000 1000 3893
par_tagstring_pipe 2 1000 1000 5000
par_tagstring_pipe 3 1000 1000 5000
par_tagstring_with_d bug #47002: --tagstring with -d \n\n
par_tagstring_with_d 1 ABC
par_tagstring_with_d 1 1
par_tagstring_with_d 1 2
par_tagstring_with_d 1 3
par_tagstring_with_d 2 ABC
par_tagstring_with_d 2 1
par_tagstring_with_d 2 2
par_tagstring_with_d 2 3
par_tagstring_with_d 2 4
par_tagstring_with_d 2
par_tee 1 a 1
par_tee 1 a 1000000 1000000 6888896
par_tee 1 b 2
@ -1150,40 +846,6 @@ par_test_L_context_replace a11b a12b a13b a14b a15b a16b a17b a18b a19b
par_test_L_context_replace ### Test -L context replace
par_test_L_context_replace a1b a2b a3b a4b a5b a6b a7b a8b a9b a10b
par_test_L_context_replace a11b a12b a13b a14b a15b a16b a17b a18b a19b
par_test_X_with_multiple_source ### Test {} multiple times in different commands
par_test_X_with_multiple_source echo 1 2 3 4 5 6 7 8 9 10 ; echo 1 2 3 4 5 6 7 8 9 10
par_test_X_with_multiple_source 1 2 3 4 5 6 7 8 9 10
par_test_X_with_multiple_source 1 2 3 4 5 6 7 8 9 10
par_test_X_with_multiple_source ### Test of -X {1}-{2} with multiple input sources
par_test_X_with_multiple_source a-b
par_test_X_with_multiple_source a-c
par_test_X_with_multiple_source b-c
par_test_X_with_multiple_source a-d
par_test_X_with_multiple_source b-f
par_test_X_with_multiple_source a-d
par_test_X_with_multiple_source a-e
par_test_X_with_multiple_source a-f
par_test_X_with_multiple_source b-d
par_test_X_with_multiple_source b-e
par_test_X_with_multiple_source b-f
par_test_X_with_multiple_source c-d
par_test_X_with_multiple_source c-e
par_test_X_with_multiple_source c-f
par_test_X_with_multiple_source ### Test of -X {}-{.} with multiple input sources
par_test_X_with_multiple_source a-a b-b
par_test_X_with_multiple_source a-a c-c a-a d-d
par_test_X_with_multiple_source b-b c-c b-b d-d
par_test_X_with_multiple_source a-a d-d a-a e-e a-a f-f b-b d-d b-b e-e
par_test_X_with_multiple_source b-b f-f c-c d-d c-c e-e c-c f-f
par_test_X_with_multiple_source a-a d-d
par_test_X_with_multiple_source a-a e-e
par_test_X_with_multiple_source a-a f-f
par_test_X_with_multiple_source b-b d-d
par_test_X_with_multiple_source b-b e-e
par_test_X_with_multiple_source b-b f-f
par_test_X_with_multiple_source c-c d-d
par_test_X_with_multiple_source c-c e-e
par_test_X_with_multiple_source c-c f-f
par_test_r_with_pipe ### Test of -r with --pipe - the first should give an empty line. The second should not.
par_test_r_with_pipe 1
par_test_r_with_pipe 0
@ -1193,6 +855,13 @@ par_test_tty /dev/tty
par_test_tty /dev/tty
par_test_tty /dev/tty
par_test_tty /dev/tty
par_test_zero_args ### Test 0-arguments
par_test_zero_args n0
par_test_zero_args n0
par_test_zero_args L0
par_test_zero_args L0
par_test_zero_args N0
par_test_zero_args N0
par_testquote ash "#&/
par_testquote ash ()*=?'
par_testquote bash "#&/
@ -1233,6 +902,8 @@ par_testquote yash "#&/
par_testquote yash ()*=?'
par_testquote zsh "#&/
par_testquote zsh ()*=?'
par_tmux_command_not_found ### PARALLEL_TMUX not found
par_tmux_command_not_found parallel: Error: not-existing not found in $PATH.
par_total_from_joblog bug #47086: [PATCH] Initialize total_completed from joblog
par_total_from_joblog 0
par_total_from_joblog 1
@ -1242,40 +913,6 @@ par_total_from_joblog parallel: This job failed:
par_total_from_joblog echo 3;exit 1
par_total_from_joblog 4
par_total_from_joblog 5
par_totaljob_repl {##} bug #45841: Replacement string for total no of jobs
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 1
par_totaljob_repl 2
par_totaljob_repl 3
par_totaljob_repl 4
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 1 2 2 2 2 2 2 2
par_totaljob_repl 2 2 2 2 2 2 2 2
par_totaljob_repl 1 3 3 3 3 3 3 3
par_totaljob_repl 2 3 3 3 3 3 3 3
par_totaljob_repl 3 3
par_totaljob_repl 1 15 15
par_totaljob_repl 2 14 14
par_totaljob_repl 3 14 14
par_totaljob_repl 4 14 14
par_totaljob_repl 5 14 14
par_totaljob_repl 6 14 14
par_totaljob_repl 7 14 14
par_totaljob_repl 8 14
par_tricolonplus ### bug #48745: :::+ bug
par_tricolonplus 11 1 21 a aa
par_tricolonplus 11 1 21 b bb
@ -1340,6 +977,15 @@ par_tricolonplus 3 22 b cc
par_tricolonplus 3 23 c aa
par_tricolonplus 3 23 c bb
par_tricolonplus 3 23 c cc
par_verbose_t ### Test --verbose and -t
par_verbose_t echo bar
par_verbose_t echo car
par_verbose_t echo far
par_verbose_t echo bar
par_verbose_t echo car
par_verbose_t echo far
par_version ### Test --version: Version output (just check we get the same amount of lines)
par_version 10
par_wd_3dot_local bug #45993: --wd ... should also work when run locally
par_wd_3dot_local parallel: Error: Cannot change into non-executable dir /bi: No such file or directory
par_wd_3dot_local /bin
@ -1371,144 +1017,8 @@ par_xapply b bb A AA
par_xapply b bb B BB
par_xapply c cc A AA
par_xapply c cc B BB
par_xargs_compat xargs compatibility
par_xargs_compat ### Test -L -l and --max-lines
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat a_b c
par_xargs_compat a_b c
par_xargs_compat ### xargs -L1 echo
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat Lines ending in space should continue on next line
par_xargs_compat ### xargs -L1 echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat ### xargs -L2 echo
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat ### xargs -l echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat ### xargs -l2 echo
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat ### xargs -l1 echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat ### xargs --max-lines=2 echo
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat ### xargs --max-lines echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat ### test too long args
par_xargs_compat parallel: Error: Command line too long (1000005 >= 131049) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_xargs_compat xargs: argument line too long
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat parallel: Error: Command line too long (1000007 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat xargs: argument line too long
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat parallel: Error: Command line too long (1000007 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_xargs_compat ### Test -x
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat parallel: Error: Command line too long (10 >= 10) at input 0: 12345
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat parallel: Error: Command line too long (10 >= 10) at input 0: 12345
par_xargs_compat 1 2
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat xargs: argument line too long
par_xargs_compat 1 2
par_xargs_compat 12
par_xargs_compat 1234
par_xargs_compat 13
par_xargs_compat 14
par_xargs_compat 15
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat 1 2
par_xargs_compat 12
par_xargs_compat 1234
par_xargs_compat 13
par_xargs_compat 14
par_xargs_compat 15
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_compat 1 2
par_xargs_compat 12
par_xargs_compat 1234
par_xargs_compat 13
par_xargs_compat 14
par_xargs_compat 15
par_xargs_compat 3 4
par_xargs_compat 5 6
par_xargs_compat 7 8
par_xargs_compat 9 10
par_xargs_nul_char_in_input bug #47290: xargs: Warning: a NUL character occurred in the input
par_xargs_nul_char_in_input parallel: Warning: A NUL character in the input was replaced with \0.
par_xargs_nul_char_in_input parallel: Warning: NUL cannot be passed through in the argument list.
par_xargs_nul_char_in_input parallel: Warning: Did you mean to use the --null option?
par_xargs_nul_char_in_input foo\0not printed

View file

@ -1,3 +1,21 @@
par_END ### Test -i and --replace: Replace with argument
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END replace
par_END ### Test -E: Artificial end-of-file
par_END include this
par_END include this
par_END ### Test -e and --eof: Artificial end-of-file
par_END include this
par_END include this
par_END include this
par_END include this
par__memleak ### Test memory consumption stays (almost) the same for 30 and 300 jobs
par__memleak should give 1 == true
par__memleak Memory use should not depend very much on the total number of jobs run\n
@ -252,75 +270,134 @@ par_maxlinelen_X_I Chars per line (817788/7): 116826
par_maxlinelen_m_I ### Test max line length -m -I
par_maxlinelen_m_I c78bd0799bc23d8946732f8b3ae3c94e -
par_maxlinelen_m_I Chars per line (697800/6): 116300
par_parset ### test parset
par_parset Put output into $myarray
par_parset 10
par_parset 11
par_parset 12
par_parset 13
par_parset 14
par_parset 15
par_parset Put output into vars "$seq, $pwd, $ls"
par_parset 1
par_parset 2
par_parset 3
par_parset 4
par_parset 5
par_parset 6
par_parset 7
par_parset 8
par_parset 9
par_parset 10
par_parset Put output into vars ($seq, $pwd, $ls):
par_parset 1
par_parset 2
par_parset 3
par_parset 4
par_parset 5
par_parset The commands to run can be an array
par_parset <<joe "double space" cartoon>>
par_parset ~/privat/parallel/testsuite
par_parset You cannot pipe into parset, but must use a tempfile
par_parset 1
par_parset 10
par_parset or process substitution
par_parset 0
par_parset 9
par_parset Commands with newline require -0
par_parset line1
par_parset line2
par_parset2 ### parset into array
par_parset2 foo bar baz
par_parset2 ### parset into vars with comma
par_parset2 foo bar baz
par_parset2 ### parset into vars with space
par_parset2 foo bar baz
par_parset2 ### parset with newlines
par_parset2 1
par_parset2 1
par_parset2 2
par_parset2 1
par_parset2 2
par_parset2 3
par_parset2 ### parset into indexed array vars
par_parset2 foo bar baz
par_parset2 foo bar bar
par_parset2 ### env_parset
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 2
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 2
par_parset2 3
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 bar
par_parset2 bug #52507: parset arr1 -v echo ::: fails
par_parset2 seq 3
par_parset2 1
par_parset2 2
par_parset2 3
par_perlexpr_repl ### {= and =} in different groups separated by space
par_perlexpr_repl b
par_perlexpr_repl b
par_perlexpr_repl bb
par_perlexpr_repl bb
par_perlexpr_repl b{= b
par_perlexpr_repl b{=b
par_perlexpr_repl b {=a
par_perlexpr_repl {=a
par_perlexpr_repl {= a
par_perlexpr_repl {= a =}
par_perlexpr_repl ### bug #45842: Do not evaluate {= =} twice
par_perlexpr_repl 1
par_perlexpr_repl 2
par_perlexpr_repl 3
par_perlexpr_repl 4
par_perlexpr_repl 1
par_perlexpr_repl 2
par_perlexpr_repl 3
par_perlexpr_repl 4
par_perlexpr_repl 1 2
par_perlexpr_repl 3 4
par_perlexpr_repl 5 6
par_perlexpr_repl 7 8
par_perlexpr_repl 9 10
par_perlexpr_repl 11 12
par_perlexpr_repl 13 14
par_perlexpr_repl 15 16
par_perlexpr_repl 17 18
par_perlexpr_repl 19 20
par_perlexpr_repl 21 22
par_perlexpr_repl 23 24
par_perlexpr_repl 1
par_perlexpr_repl 2
par_perlexpr_repl 3
par_perlexpr_repl 4
par_perlexpr_repl 5
par_perlexpr_repl 6
par_perlexpr_repl 7
par_perlexpr_repl 8
par_perlexpr_repl 9
par_perlexpr_repl 10
par_perlexpr_repl 11
par_perlexpr_repl 12
par_perlexpr_repl ### bug #45939: {2} in {= =} fails
par_perlexpr_repl OK
par_perlexpr_repl OK-OK
par_pipe_line_buffer ### --pipe --line-buffer
par_pipe_line_buffer 200 400 1202
par_pipe_line_buffer These must diff: 1
par_pipe_line_buffer_compress ### --pipe --line-buffer --compress
par_pipe_line_buffer_compress 200 400 1202
par_plus_dyn_repl Dynamic replacement strings defined by --plus
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl 9
par_plus_dyn_repl 9
par_plus_dyn_repl 1
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_results_compress 0
par_results_compress 1
par_results_csv bug #: --results csv
@ -505,8 +582,6 @@ par_retries_all_fail 5
par_retries_all_fail 6
par_retries_all_fail 7
par_retries_all_fail 8
par_round_robin_blocks bug #49664: --round-robin does not complete
par_round_robin_blocks 8
par_sem_2jobs ### Test semaphore 2 jobs running simultaneously
par_sem_2jobs job1a 1
par_sem_2jobs job2a 2
@ -541,3 +616,88 @@ par_sockets_cores_threads Threads should complete first on machines with less th
par_tmux_fg bug #50107: --tmux --fg should also write how to access it
par_tmux_fg See output with: tmux -S tmp attach
par_tmux_fg open terminal failed: not a terminal
par_xargs_compat xargs compatibility
par_xargs_compat ### Test -L -l and --max-lines
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat a_b c
par_xargs_compat a_b c
par_xargs_compat ### xargs -L1 echo
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat a_b
par_xargs_compat c
par_xargs_compat Lines ending in space should continue on next line
par_xargs_compat ### xargs -L1 echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat ### xargs -L2 echo
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat ### xargs -l echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat ### xargs -l2 echo
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat ### xargs -l1 echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat ### xargs --max-lines=2 echo
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat a_b c d
par_xargs_compat e
par_xargs_compat ### xargs --max-lines echo
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat a_b c
par_xargs_compat d
par_xargs_compat e
par_xargs_compat ### test too long args
par_xargs_compat parallel: Error: Command line too long (1000005 >= 131049) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
par_xargs_compat xargs: argument line too long
par_xargs_compat environment: line 109: stdsort: command not found
par_xargs_compat environment: line 112: stdsort: command not found
par_xargs_compat environment: line 115: stdsort: command not found
par_xargs_compat ### Test -x
par_xargs_compat environment: line 119: stdsort: command not found
par_xargs_compat environment: line 122: stdsort: command not found
par_xargs_compat environment: line 125: stdsort: command not found
par_xargs_compat environment: line 128: stdsort: command not found
par_xargs_compat environment: line 131: stdsort: command not found
par_xargs_compat environment: line 134: stdsort: command not found

View file

@ -179,82 +179,6 @@ par_null_resume c
par_null_resume A
par_null_resume B
par_null_resume C
par_parset ### test parset
par_parset Put output into $myarray
par_parset 10
par_parset 11
par_parset 12
par_parset 13
par_parset 14
par_parset 15
par_parset Put output into vars "$seq, $pwd, $ls"
par_parset 1
par_parset 2
par_parset 3
par_parset 4
par_parset 5
par_parset 6
par_parset 7
par_parset 8
par_parset 9
par_parset 10
par_parset Put output into vars ($seq, $pwd, $ls):
par_parset 1
par_parset 2
par_parset 3
par_parset 4
par_parset 5
par_parset The commands to run can be an array
par_parset <<joe "double space" cartoon>>
par_parset ~/privat/parallel/testsuite
par_parset You cannot pipe into parset, but must use a tempfile
par_parset 1
par_parset 10
par_parset or process substitution
par_parset 0
par_parset 9
par_parset Commands with newline require -0
par_parset line1
par_parset line2
par_parset2 ### parset into array
par_parset2 foo bar baz
par_parset2 ### parset into vars with comma
par_parset2 foo bar baz
par_parset2 ### parset into vars with space
par_parset2 foo bar baz
par_parset2 ### parset with newlines
par_parset2 1
par_parset2 1
par_parset2 2
par_parset2 1
par_parset2 2
par_parset2 3
par_parset2 ### parset into indexed array vars
par_parset2 foo bar baz
par_parset2 foo bar bar
par_parset2 ### env_parset
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 2
par_parset2 newline1
par_parset2 newline2
par_parset2 1
par_parset2 2
par_parset2 3
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 baz
par_parset2 myecho myvar myarr 1 foo myecho myvar myarr 1 bar myecho myvar myarr 1 bar
par_parset2 bug #52507: parset arr1 -v echo ::: fails
par_parset2 seq 3
par_parset2 1
par_parset2 2
par_parset2 3
par_pipe_compress_blocks ### bug #41482: --pipe --compress blocks at different -j/seq combinations
par_pipe_compress_blocks 1
par_pipe_compress_blocks echo 1-4 + 1-4

View file

@ -1,3 +1,5 @@
par_keeporder_roundrobin bug #50081: --keep-order --round-robin should give predictable results
par_keeporder_roundrobin OK
par_linebuffer_files bug #48658: --linebuffer --files
par_linebuffer_files zstd normal
par_linebuffer_files zstd 100000
@ -152,6 +154,70 @@ par_no_newline_compress tagstring=-k compress=-k
par_no_newline_compress OK
par_no_newline_compress tagstring=-k compress=-k
par_no_newline_compress OK
par_plus_dyn_repl Dynamic replacement strings defined by --plus
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl myval
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAaAdef
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl cAa
par_plus_dyn_repl 9
par_plus_dyn_repl 9
par_plus_dyn_repl 1
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl AaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaA
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl abcAaAghi
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAaAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl AbcAAAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcAaAdef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_plus_dyn_repl abcaaadef
par_race_condition1 ### Test race condition on 8 CPU (my laptop)
par_race_condition1 1
par_race_condition1 2
@ -163,6 +229,8 @@ par_race_condition1 7
par_race_condition1 8
par_race_condition1 9
par_race_condition1 10
par_round_robin_blocks bug #49664: --round-robin does not complete
par_round_robin_blocks 8
par_shellquote ### Test --shellquote in all shells
par_shellquote ash '
par_shellquote ash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ'

View file

@ -37,6 +37,54 @@ par_delay_human_readable c
par_delay_human_readable a
par_delay_human_readable b
par_delay_human_readable c
par_distribute_args_at_EOF ### Test distribute arguments at EOF to 2 jobslots
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
par_distribute_args_at_EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
par_distribute_args_at_EOF 66 67 68 69 70 71 72 73 74 75 76 77 78 79
par_distribute_args_at_EOF 80 81 82 83 84 85 86 87 88 89 90 91 92
par_distribute_args_at_EOF ### Test distribute arguments at EOF to 5 jobslots
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
par_distribute_args_at_EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
par_distribute_args_at_EOF 66 67 68 69 70 71
par_distribute_args_at_EOF 72 73 74 75 76 77
par_distribute_args_at_EOF 78 79 80 81 82 83
par_distribute_args_at_EOF 84 85 86 87 88 89
par_distribute_args_at_EOF 90 91 92
par_distribute_args_at_EOF ### Test distribute arguments at EOF to infinity jobslots
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
par_distribute_args_at_EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
par_distribute_args_at_EOF 66
par_distribute_args_at_EOF 67
par_distribute_args_at_EOF 68
par_distribute_args_at_EOF 69
par_distribute_args_at_EOF 70
par_distribute_args_at_EOF 71
par_distribute_args_at_EOF 72
par_distribute_args_at_EOF 73
par_distribute_args_at_EOF 74
par_distribute_args_at_EOF 75
par_distribute_args_at_EOF 76
par_distribute_args_at_EOF 77
par_distribute_args_at_EOF 78
par_distribute_args_at_EOF 79
par_distribute_args_at_EOF 80
par_distribute_args_at_EOF 81
par_distribute_args_at_EOF 82
par_distribute_args_at_EOF 83
par_distribute_args_at_EOF 84
par_distribute_args_at_EOF 85
par_distribute_args_at_EOF 86
par_distribute_args_at_EOF 87
par_distribute_args_at_EOF 88
par_distribute_args_at_EOF 89
par_distribute_args_at_EOF 90
par_distribute_args_at_EOF 91
par_distribute_args_at_EOF 92
par_distribute_args_at_EOF ### Test -N is not broken by distribution - single line
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9
par_distribute_args_at_EOF ### Test -N is not broken by distribution - two lines
par_distribute_args_at_EOF 1 2 3 4 5 6 7 8 9 10
par_distribute_args_at_EOF 11 12 13 14 15 16 17 18 19
par_do_not_export_PARALLEL_ENV ### Do not export $PARALLEL_ENV to children
par_do_not_export_PARALLEL_ENV Should be 0
par_do_not_export_PARALLEL_ENV 1 0 1
@ -49,7 +97,7 @@ par_exitval_signal exitval=128+6 OK
par_exitval_signal signal OK
par_groupby -N1 3 $_%=2 tsv \t ### test tsv | --colsep \t --groupby 3 $_%=2 -N1
par_groupby -N1 3 $_%=2 tsv \t NewRec
par_groupby -N1 3 $_%=2 tsv \t a1 b1 c1
par_groupby -N1 3 $_%=2 tsv \t a1 b1 C1
par_groupby -N1 3 $_%=2 tsv \t 2 2 2
par_groupby -N1 3 $_%=2 tsv \t 3 2 2
par_groupby -N1 3 $_%=2 tsv \t 3 3 2
@ -59,7 +107,7 @@ par_groupby -N1 3 $_%=2 tsv \t NewRec
par_groupby -N1 3 $_%=2 tsv \t 3 2 3
par_groupby -N1 3 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 $_%=2 -N1
par_groupby -N1 3 $_%=2 ssv \s+ NewRec
par_groupby -N1 3 $_%=2 ssv \s+ a1 b1 c1
par_groupby -N1 3 $_%=2 ssv \s+ a1 b1 C1
par_groupby -N1 3 $_%=2 ssv \s+ 2 2 2
par_groupby -N1 3 $_%=2 ssv \s+ 3 2 2
par_groupby -N1 3 $_%=2 ssv \s+ 3 3 2
@ -69,7 +117,7 @@ par_groupby -N1 3 $_%=2 ssv \s+ NewRec
par_groupby -N1 3 $_%=2 ssv \s+ 3 2 3
par_groupby -N1 3 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 $_%=2 -N1
par_groupby -N1 3 $_%=2 cssv [\s,]+ NewRec
par_groupby -N1 3 $_%=2 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 3 $_%=2 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 3 $_%=2 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby -N1 3 $_%=2 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby -N1 3 $_%=2 cssv [\s,]+ 3 , 3 , 2 ,
@ -79,7 +127,7 @@ par_groupby -N1 3 $_%=2 cssv [\s,]+ NewRec
par_groupby -N1 3 $_%=2 cssv [\s,]+ 3 2 3
par_groupby -N1 3 $_%=2 csv , ### test csv | --colsep , --groupby 3 $_%=2 -N1
par_groupby -N1 3 $_%=2 csv , NewRec
par_groupby -N1 3 $_%=2 csv , a1,b1,c1,
par_groupby -N1 3 $_%=2 csv , a1,b1,C1,
par_groupby -N1 3 $_%=2 csv , 2,2,2,
par_groupby -N1 3 $_%=2 csv , 3,2,2,
par_groupby -N1 3 $_%=2 csv , 3,3,2,
@ -89,7 +137,7 @@ par_groupby -N1 3 $_%=2 csv , NewRec
par_groupby -N1 3 $_%=2 csv , 3,2,3,
par_groupby -N1 3 tsv \t ### test tsv | --colsep \t --groupby 3 -N1
par_groupby -N1 3 tsv \t NewRec
par_groupby -N1 3 tsv \t a1 b1 c1
par_groupby -N1 3 tsv \t a1 b1 C1
par_groupby -N1 3 tsv \t NewRec
par_groupby -N1 3 tsv \t 2 2 2
par_groupby -N1 3 tsv \t 3 2 2
@ -102,7 +150,7 @@ par_groupby -N1 3 tsv \t NewRec
par_groupby -N1 3 tsv \t 3 2 3
par_groupby -N1 3 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 -N1
par_groupby -N1 3 ssv \s+ NewRec
par_groupby -N1 3 ssv \s+ a1 b1 c1
par_groupby -N1 3 ssv \s+ a1 b1 C1
par_groupby -N1 3 ssv \s+ NewRec
par_groupby -N1 3 ssv \s+ 2 2 2
par_groupby -N1 3 ssv \s+ 3 2 2
@ -115,7 +163,7 @@ par_groupby -N1 3 ssv \s+ NewRec
par_groupby -N1 3 ssv \s+ 3 2 3
par_groupby -N1 3 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 -N1
par_groupby -N1 3 cssv [\s,]+ NewRec
par_groupby -N1 3 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 3 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 3 cssv [\s,]+ NewRec
par_groupby -N1 3 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby -N1 3 cssv [\s,]+ 3 , 2 , 2 ,
@ -128,7 +176,7 @@ par_groupby -N1 3 cssv [\s,]+ NewRec
par_groupby -N1 3 cssv [\s,]+ 3 2 3
par_groupby -N1 3 csv , ### test csv | --colsep , --groupby 3 -N1
par_groupby -N1 3 csv , NewRec
par_groupby -N1 3 csv , a1,b1,c1,
par_groupby -N1 3 csv , a1,b1,C1,
par_groupby -N1 3 csv , NewRec
par_groupby -N1 3 csv , 2,2,2,
par_groupby -N1 3 csv , 3,2,2,
@ -141,7 +189,7 @@ par_groupby -N1 3 csv , NewRec
par_groupby -N1 3 csv , 3,2,3,
par_groupby -N1 s/^(.).*/$1/ tsv \t ### test tsv | --colsep \t --groupby s/^(.).*/$1/ -N1
par_groupby -N1 s/^(.).*/$1/ tsv \t NewRec
par_groupby -N1 s/^(.).*/$1/ tsv \t a1 b1 c1
par_groupby -N1 s/^(.).*/$1/ tsv \t a1 b1 C1
par_groupby -N1 s/^(.).*/$1/ tsv \t NewRec
par_groupby -N1 s/^(.).*/$1/ tsv \t 2 2 2
par_groupby -N1 s/^(.).*/$1/ tsv \t NewRec
@ -152,7 +200,7 @@ par_groupby -N1 s/^(.).*/$1/ tsv \t 3 2 2
par_groupby -N1 s/^(.).*/$1/ tsv \t 3 2 3
par_groupby -N1 s/^(.).*/$1/ ssv \s+ ### test ssv | --colsep \s+ --groupby s/^(.).*/$1/ -N1
par_groupby -N1 s/^(.).*/$1/ ssv \s+ NewRec
par_groupby -N1 s/^(.).*/$1/ ssv \s+ a1 b1 c1
par_groupby -N1 s/^(.).*/$1/ ssv \s+ a1 b1 C1
par_groupby -N1 s/^(.).*/$1/ ssv \s+ NewRec
par_groupby -N1 s/^(.).*/$1/ ssv \s+ 2 2 2
par_groupby -N1 s/^(.).*/$1/ ssv \s+ NewRec
@ -163,7 +211,7 @@ par_groupby -N1 s/^(.).*/$1/ ssv \s+ 3 2 2
par_groupby -N1 s/^(.).*/$1/ ssv \s+ 3 2 3
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby s/^(.).*/$1/ -N1
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ NewRec
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ a1, b1, c1,
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ a1, b1, C1,
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ NewRec
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 2 ,2 ,2 ,
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ NewRec
@ -174,7 +222,7 @@ par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby -N1 s/^(.).*/$1/ cssv [\s,]+ 3 2 3
par_groupby -N1 s/^(.).*/$1/ csv , ### test csv | --colsep , --groupby s/^(.).*/$1/ -N1
par_groupby -N1 s/^(.).*/$1/ csv , NewRec
par_groupby -N1 s/^(.).*/$1/ csv , a1,b1,c1,
par_groupby -N1 s/^(.).*/$1/ csv , a1,b1,C1,
par_groupby -N1 s/^(.).*/$1/ csv , NewRec
par_groupby -N1 s/^(.).*/$1/ csv , 2,2,2,
par_groupby -N1 s/^(.).*/$1/ csv , NewRec
@ -183,113 +231,113 @@ par_groupby -N1 s/^(.).*/$1/ csv , 3,3,2,
par_groupby -N1 s/^(.).*/$1/ csv , 3,2,4,
par_groupby -N1 s/^(.).*/$1/ csv , 3,2,2,
par_groupby -N1 s/^(.).*/$1/ csv , 3,2,3,
par_groupby -N1 c1 tsv \t ### test tsv | --colsep \t --groupby c1 -N1
par_groupby -N1 c1 tsv \t NewRec
par_groupby -N1 c1 tsv \t a1 b1 c1
par_groupby -N1 c1 tsv \t 2 2 2
par_groupby -N1 c1 tsv \t 3 2 2
par_groupby -N1 c1 tsv \t 3 3 2
par_groupby -N1 c1 tsv \t NewRec
par_groupby -N1 c1 tsv \t a1 b1 c1
par_groupby -N1 c1 tsv \t 3 2 4
par_groupby -N1 c1 tsv \t NewRec
par_groupby -N1 c1 tsv \t a1 b1 c1
par_groupby -N1 c1 tsv \t 3 2 2
par_groupby -N1 c1 tsv \t NewRec
par_groupby -N1 c1 tsv \t a1 b1 c1
par_groupby -N1 c1 tsv \t 3 2 3
par_groupby -N1 c1 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 -N1
par_groupby -N1 c1 ssv \s+ NewRec
par_groupby -N1 c1 ssv \s+ a1 b1 c1
par_groupby -N1 c1 ssv \s+ 2 2 2
par_groupby -N1 c1 ssv \s+ 3 2 2
par_groupby -N1 c1 ssv \s+ 3 3 2
par_groupby -N1 c1 ssv \s+ NewRec
par_groupby -N1 c1 ssv \s+ a1 b1 c1
par_groupby -N1 c1 ssv \s+ 3 2 4
par_groupby -N1 c1 ssv \s+ NewRec
par_groupby -N1 c1 ssv \s+ a1 b1 c1
par_groupby -N1 c1 ssv \s+ 3 2 2
par_groupby -N1 c1 ssv \s+ NewRec
par_groupby -N1 c1 ssv \s+ a1 b1 c1
par_groupby -N1 c1 ssv \s+ 3 2 3
par_groupby -N1 c1 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 -N1
par_groupby -N1 c1 cssv [\s,]+ NewRec
par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 c1 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby -N1 c1 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby -N1 c1 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby -N1 c1 cssv [\s,]+ NewRec
par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 c1 cssv [\s,]+ 3,,2,,4,,
par_groupby -N1 c1 cssv [\s,]+ NewRec
par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 c1 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby -N1 c1 cssv [\s,]+ NewRec
par_groupby -N1 c1 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 c1 cssv [\s,]+ 3 2 3
par_groupby -N1 c1 csv , ### test csv | --colsep , --groupby c1 -N1
par_groupby -N1 c1 csv , NewRec
par_groupby -N1 c1 csv , a1,b1,c1,
par_groupby -N1 c1 csv , 2,2,2,
par_groupby -N1 c1 csv , 3,2,2,
par_groupby -N1 c1 csv , 3,3,2,
par_groupby -N1 c1 csv , NewRec
par_groupby -N1 c1 csv , a1,b1,c1,
par_groupby -N1 c1 csv , 3,2,4,
par_groupby -N1 c1 csv , NewRec
par_groupby -N1 c1 csv , a1,b1,c1,
par_groupby -N1 c1 csv , 3,2,2,
par_groupby -N1 c1 csv , NewRec
par_groupby -N1 c1 csv , a1,b1,c1,
par_groupby -N1 c1 csv , 3,2,3,
par_groupby -N1 c1 $_%=2 tsv \t ### test tsv | --colsep \t --groupby c1 $_%=2 -N1
par_groupby -N1 c1 $_%=2 tsv \t NewRec
par_groupby -N1 c1 $_%=2 tsv \t a1 b1 c1
par_groupby -N1 c1 $_%=2 tsv \t 2 2 2
par_groupby -N1 c1 $_%=2 tsv \t 3 2 2
par_groupby -N1 c1 $_%=2 tsv \t 3 3 2
par_groupby -N1 c1 $_%=2 tsv \t 3 2 4
par_groupby -N1 c1 $_%=2 tsv \t 3 2 2
par_groupby -N1 c1 $_%=2 tsv \t NewRec
par_groupby -N1 c1 $_%=2 tsv \t a1 b1 c1
par_groupby -N1 c1 $_%=2 tsv \t 3 2 3
par_groupby -N1 c1 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 $_%=2 -N1
par_groupby -N1 c1 $_%=2 ssv \s+ NewRec
par_groupby -N1 c1 $_%=2 ssv \s+ a1 b1 c1
par_groupby -N1 c1 $_%=2 ssv \s+ 2 2 2
par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 2
par_groupby -N1 c1 $_%=2 ssv \s+ 3 3 2
par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 4
par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 2
par_groupby -N1 c1 $_%=2 ssv \s+ NewRec
par_groupby -N1 c1 $_%=2 ssv \s+ a1 b1 c1
par_groupby -N1 c1 $_%=2 ssv \s+ 3 2 3
par_groupby -N1 c1 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 $_%=2 -N1
par_groupby -N1 c1 $_%=2 cssv [\s,]+ NewRec
par_groupby -N1 c1 $_%=2 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 c1 $_%=2 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3,,2,,4,,
par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby -N1 c1 $_%=2 cssv [\s,]+ NewRec
par_groupby -N1 c1 $_%=2 cssv [\s,]+ a1, b1, c1,
par_groupby -N1 c1 $_%=2 cssv [\s,]+ 3 2 3
par_groupby -N1 c1 $_%=2 csv , ### test csv | --colsep , --groupby c1 $_%=2 -N1
par_groupby -N1 c1 $_%=2 csv , NewRec
par_groupby -N1 c1 $_%=2 csv , a1,b1,c1,
par_groupby -N1 c1 $_%=2 csv , 2,2,2,
par_groupby -N1 c1 $_%=2 csv , 3,2,2,
par_groupby -N1 c1 $_%=2 csv , 3,3,2,
par_groupby -N1 c1 $_%=2 csv , 3,2,4,
par_groupby -N1 c1 $_%=2 csv , 3,2,2,
par_groupby -N1 c1 $_%=2 csv , NewRec
par_groupby -N1 c1 $_%=2 csv , a1,b1,c1,
par_groupby -N1 c1 $_%=2 csv , 3,2,3,
par_groupby -N1 C1 tsv \t ### test tsv | --colsep \t --groupby C1 -N1
par_groupby -N1 C1 tsv \t NewRec
par_groupby -N1 C1 tsv \t a1 b1 C1
par_groupby -N1 C1 tsv \t 2 2 2
par_groupby -N1 C1 tsv \t 3 2 2
par_groupby -N1 C1 tsv \t 3 3 2
par_groupby -N1 C1 tsv \t NewRec
par_groupby -N1 C1 tsv \t a1 b1 C1
par_groupby -N1 C1 tsv \t 3 2 4
par_groupby -N1 C1 tsv \t NewRec
par_groupby -N1 C1 tsv \t a1 b1 C1
par_groupby -N1 C1 tsv \t 3 2 2
par_groupby -N1 C1 tsv \t NewRec
par_groupby -N1 C1 tsv \t a1 b1 C1
par_groupby -N1 C1 tsv \t 3 2 3
par_groupby -N1 C1 ssv \s+ ### test ssv | --colsep \s+ --groupby C1 -N1
par_groupby -N1 C1 ssv \s+ NewRec
par_groupby -N1 C1 ssv \s+ a1 b1 C1
par_groupby -N1 C1 ssv \s+ 2 2 2
par_groupby -N1 C1 ssv \s+ 3 2 2
par_groupby -N1 C1 ssv \s+ 3 3 2
par_groupby -N1 C1 ssv \s+ NewRec
par_groupby -N1 C1 ssv \s+ a1 b1 C1
par_groupby -N1 C1 ssv \s+ 3 2 4
par_groupby -N1 C1 ssv \s+ NewRec
par_groupby -N1 C1 ssv \s+ a1 b1 C1
par_groupby -N1 C1 ssv \s+ 3 2 2
par_groupby -N1 C1 ssv \s+ NewRec
par_groupby -N1 C1 ssv \s+ a1 b1 C1
par_groupby -N1 C1 ssv \s+ 3 2 3
par_groupby -N1 C1 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby C1 -N1
par_groupby -N1 C1 cssv [\s,]+ NewRec
par_groupby -N1 C1 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 C1 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby -N1 C1 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby -N1 C1 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby -N1 C1 cssv [\s,]+ NewRec
par_groupby -N1 C1 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 C1 cssv [\s,]+ 3,,2,,4,,
par_groupby -N1 C1 cssv [\s,]+ NewRec
par_groupby -N1 C1 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 C1 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby -N1 C1 cssv [\s,]+ NewRec
par_groupby -N1 C1 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 C1 cssv [\s,]+ 3 2 3
par_groupby -N1 C1 csv , ### test csv | --colsep , --groupby C1 -N1
par_groupby -N1 C1 csv , NewRec
par_groupby -N1 C1 csv , a1,b1,C1,
par_groupby -N1 C1 csv , 2,2,2,
par_groupby -N1 C1 csv , 3,2,2,
par_groupby -N1 C1 csv , 3,3,2,
par_groupby -N1 C1 csv , NewRec
par_groupby -N1 C1 csv , a1,b1,C1,
par_groupby -N1 C1 csv , 3,2,4,
par_groupby -N1 C1 csv , NewRec
par_groupby -N1 C1 csv , a1,b1,C1,
par_groupby -N1 C1 csv , 3,2,2,
par_groupby -N1 C1 csv , NewRec
par_groupby -N1 C1 csv , a1,b1,C1,
par_groupby -N1 C1 csv , 3,2,3,
par_groupby -N1 C1 $_%=2 tsv \t ### test tsv | --colsep \t --groupby C1 $_%=2 -N1
par_groupby -N1 C1 $_%=2 tsv \t NewRec
par_groupby -N1 C1 $_%=2 tsv \t a1 b1 C1
par_groupby -N1 C1 $_%=2 tsv \t 2 2 2
par_groupby -N1 C1 $_%=2 tsv \t 3 2 2
par_groupby -N1 C1 $_%=2 tsv \t 3 3 2
par_groupby -N1 C1 $_%=2 tsv \t 3 2 4
par_groupby -N1 C1 $_%=2 tsv \t 3 2 2
par_groupby -N1 C1 $_%=2 tsv \t NewRec
par_groupby -N1 C1 $_%=2 tsv \t a1 b1 C1
par_groupby -N1 C1 $_%=2 tsv \t 3 2 3
par_groupby -N1 C1 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby C1 $_%=2 -N1
par_groupby -N1 C1 $_%=2 ssv \s+ NewRec
par_groupby -N1 C1 $_%=2 ssv \s+ a1 b1 C1
par_groupby -N1 C1 $_%=2 ssv \s+ 2 2 2
par_groupby -N1 C1 $_%=2 ssv \s+ 3 2 2
par_groupby -N1 C1 $_%=2 ssv \s+ 3 3 2
par_groupby -N1 C1 $_%=2 ssv \s+ 3 2 4
par_groupby -N1 C1 $_%=2 ssv \s+ 3 2 2
par_groupby -N1 C1 $_%=2 ssv \s+ NewRec
par_groupby -N1 C1 $_%=2 ssv \s+ a1 b1 C1
par_groupby -N1 C1 $_%=2 ssv \s+ 3 2 3
par_groupby -N1 C1 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby C1 $_%=2 -N1
par_groupby -N1 C1 $_%=2 cssv [\s,]+ NewRec
par_groupby -N1 C1 $_%=2 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 C1 $_%=2 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby -N1 C1 $_%=2 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby -N1 C1 $_%=2 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby -N1 C1 $_%=2 cssv [\s,]+ 3,,2,,4,,
par_groupby -N1 C1 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby -N1 C1 $_%=2 cssv [\s,]+ NewRec
par_groupby -N1 C1 $_%=2 cssv [\s,]+ a1, b1, C1,
par_groupby -N1 C1 $_%=2 cssv [\s,]+ 3 2 3
par_groupby -N1 C1 $_%=2 csv , ### test csv | --colsep , --groupby C1 $_%=2 -N1
par_groupby -N1 C1 $_%=2 csv , NewRec
par_groupby -N1 C1 $_%=2 csv , a1,b1,C1,
par_groupby -N1 C1 $_%=2 csv , 2,2,2,
par_groupby -N1 C1 $_%=2 csv , 3,2,2,
par_groupby -N1 C1 $_%=2 csv , 3,3,2,
par_groupby -N1 C1 $_%=2 csv , 3,2,4,
par_groupby -N1 C1 $_%=2 csv , 3,2,2,
par_groupby -N1 C1 $_%=2 csv , NewRec
par_groupby -N1 C1 $_%=2 csv , a1,b1,C1,
par_groupby -N1 C1 $_%=2 csv , 3,2,3,
par_groupby --block 20 3 $_%=2 tsv \t ### test tsv | --colsep \t --groupby 3 $_%=2 --block 20
par_groupby --block 20 3 $_%=2 tsv \t NewRec
par_groupby --block 20 3 $_%=2 tsv \t a1 b1 c1
par_groupby --block 20 3 $_%=2 tsv \t a1 b1 C1
par_groupby --block 20 3 $_%=2 tsv \t 2 2 2
par_groupby --block 20 3 $_%=2 tsv \t 3 2 2
par_groupby --block 20 3 $_%=2 tsv \t 3 3 2
@ -303,7 +351,7 @@ par_groupby --block 20 3 $_%=2 tsv \t parallel: Warning: A record was longer tha
par_groupby --block 20 3 $_%=2 tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 3 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 $_%=2 --block 20
par_groupby --block 20 3 $_%=2 ssv \s+ NewRec
par_groupby --block 20 3 $_%=2 ssv \s+ a1 b1 c1
par_groupby --block 20 3 $_%=2 ssv \s+ a1 b1 C1
par_groupby --block 20 3 $_%=2 ssv \s+ 2 2 2
par_groupby --block 20 3 $_%=2 ssv \s+ 3 2 2
par_groupby --block 20 3 $_%=2 ssv \s+ 3 3 2
@ -318,7 +366,7 @@ par_groupby --block 20 3 $_%=2 ssv \s+ parallel: Warning: A record was longer th
par_groupby --block 20 3 $_%=2 ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 3 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 $_%=2 --block 20
par_groupby --block 20 3 $_%=2 cssv [\s,]+ NewRec
par_groupby --block 20 3 $_%=2 cssv [\s,]+ a1, b1, c1,
par_groupby --block 20 3 $_%=2 cssv [\s,]+ a1, b1, C1,
par_groupby --block 20 3 $_%=2 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby --block 20 3 $_%=2 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby --block 20 3 $_%=2 cssv [\s,]+ 3 , 3 , 2 ,
@ -333,7 +381,7 @@ par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longe
par_groupby --block 20 3 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 87. Increasing to --blocksize 115.
par_groupby --block 20 3 $_%=2 csv , ### test csv | --colsep , --groupby 3 $_%=2 --block 20
par_groupby --block 20 3 $_%=2 csv , NewRec
par_groupby --block 20 3 $_%=2 csv , a1,b1,c1,
par_groupby --block 20 3 $_%=2 csv , a1,b1,C1,
par_groupby --block 20 3 $_%=2 csv , 2,2,2,
par_groupby --block 20 3 $_%=2 csv , 3,2,2,
par_groupby --block 20 3 $_%=2 csv , 3,3,2,
@ -347,7 +395,7 @@ par_groupby --block 20 3 $_%=2 csv , parallel: Warning: A record was longer than
par_groupby --block 20 3 $_%=2 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 3 tsv \t ### test tsv | --colsep \t --groupby 3 --block 20
par_groupby --block 20 3 tsv \t NewRec
par_groupby --block 20 3 tsv \t a1 b1 c1
par_groupby --block 20 3 tsv \t a1 b1 C1
par_groupby --block 20 3 tsv \t NewRec
par_groupby --block 20 3 tsv \t 2 2 2
par_groupby --block 20 3 tsv \t 3 2 2
@ -363,7 +411,7 @@ par_groupby --block 20 3 tsv \t parallel: Warning: A record was longer than 37.
par_groupby --block 20 3 tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 3 ssv \s+ ### test ssv | --colsep \s+ --groupby 3 --block 20
par_groupby --block 20 3 ssv \s+ NewRec
par_groupby --block 20 3 ssv \s+ a1 b1 c1
par_groupby --block 20 3 ssv \s+ a1 b1 C1
par_groupby --block 20 3 ssv \s+ NewRec
par_groupby --block 20 3 ssv \s+ 2 2 2
par_groupby --block 20 3 ssv \s+ 3 2 2
@ -380,7 +428,7 @@ par_groupby --block 20 3 ssv \s+ parallel: Warning: A record was longer than 50.
par_groupby --block 20 3 ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 3 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby 3 --block 20
par_groupby --block 20 3 cssv [\s,]+ NewRec
par_groupby --block 20 3 cssv [\s,]+ a1, b1, c1,
par_groupby --block 20 3 cssv [\s,]+ a1, b1, C1,
par_groupby --block 20 3 cssv [\s,]+ NewRec
par_groupby --block 20 3 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby --block 20 3 cssv [\s,]+ 3 , 2 , 2 ,
@ -397,7 +445,7 @@ par_groupby --block 20 3 cssv [\s,]+ parallel: Warning: A record was longer than
par_groupby --block 20 3 cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 3 csv , ### test csv | --colsep , --groupby 3 --block 20
par_groupby --block 20 3 csv , NewRec
par_groupby --block 20 3 csv , a1,b1,c1,
par_groupby --block 20 3 csv , a1,b1,C1,
par_groupby --block 20 3 csv , NewRec
par_groupby --block 20 3 csv , 2,2,2,
par_groupby --block 20 3 csv , 3,2,2,
@ -413,7 +461,7 @@ par_groupby --block 20 3 csv , parallel: Warning: A record was longer than 37. I
par_groupby --block 20 3 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 s/^(.).*/$1/ tsv \t ### test tsv | --colsep \t --groupby s/^(.).*/$1/ --block 20
par_groupby --block 20 s/^(.).*/$1/ tsv \t NewRec
par_groupby --block 20 s/^(.).*/$1/ tsv \t a1 b1 c1
par_groupby --block 20 s/^(.).*/$1/ tsv \t a1 b1 C1
par_groupby --block 20 s/^(.).*/$1/ tsv \t NewRec
par_groupby --block 20 s/^(.).*/$1/ tsv \t 2 2 2
par_groupby --block 20 s/^(.).*/$1/ tsv \t NewRec
@ -428,7 +476,7 @@ par_groupby --block 20 s/^(.).*/$1/ tsv \t parallel: Warning: A record was longe
par_groupby --block 20 s/^(.).*/$1/ tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ ### test ssv | --colsep \s+ --groupby s/^(.).*/$1/ --block 20
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ NewRec
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ a1 b1 c1
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ a1 b1 C1
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ NewRec
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ 2 2 2
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ NewRec
@ -444,7 +492,7 @@ par_groupby --block 20 s/^(.).*/$1/ ssv \s+ parallel: Warning: A record was long
par_groupby --block 20 s/^(.).*/$1/ ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby s/^(.).*/$1/ --block 20
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ NewRec
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ a1, b1, c1,
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ a1, b1, C1,
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ NewRec
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ 2 ,2 ,2 ,
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ NewRec
@ -460,7 +508,7 @@ par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ parallel: Warning: A record was
par_groupby --block 20 s/^(.).*/$1/ cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 s/^(.).*/$1/ csv , ### test csv | --colsep , --groupby s/^(.).*/$1/ --block 20
par_groupby --block 20 s/^(.).*/$1/ csv , NewRec
par_groupby --block 20 s/^(.).*/$1/ csv , a1,b1,c1,
par_groupby --block 20 s/^(.).*/$1/ csv , a1,b1,C1,
par_groupby --block 20 s/^(.).*/$1/ csv , NewRec
par_groupby --block 20 s/^(.).*/$1/ csv , 2,2,2,
par_groupby --block 20 s/^(.).*/$1/ csv , NewRec
@ -473,134 +521,163 @@ par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer
par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 s/^(.).*/$1/ csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 c1 tsv \t ### test tsv | --colsep \t --groupby c1 --block 20
par_groupby --block 20 c1 tsv \t NewRec
par_groupby --block 20 c1 tsv \t a1 b1 c1
par_groupby --block 20 c1 tsv \t 2 2 2
par_groupby --block 20 c1 tsv \t 3 2 2
par_groupby --block 20 c1 tsv \t 3 3 2
par_groupby --block 20 c1 tsv \t NewRec
par_groupby --block 20 c1 tsv \t a1 b1 c1
par_groupby --block 20 c1 tsv \t 3 2 4
par_groupby --block 20 c1 tsv \t NewRec
par_groupby --block 20 c1 tsv \t a1 b1 c1
par_groupby --block 20 c1 tsv \t 3 2 2
par_groupby --block 20 c1 tsv \t NewRec
par_groupby --block 20 c1 tsv \t a1 b1 c1
par_groupby --block 20 c1 tsv \t 3 2 3
par_groupby --block 20 c1 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 --block 20
par_groupby --block 20 c1 ssv \s+ NewRec
par_groupby --block 20 c1 ssv \s+ a1 b1 c1
par_groupby --block 20 c1 ssv \s+ 2 2 2
par_groupby --block 20 c1 ssv \s+ 3 2 2
par_groupby --block 20 c1 ssv \s+ 3 3 2
par_groupby --block 20 c1 ssv \s+ NewRec
par_groupby --block 20 c1 ssv \s+ a1 b1 c1
par_groupby --block 20 c1 ssv \s+ 3 2 4
par_groupby --block 20 c1 ssv \s+ NewRec
par_groupby --block 20 c1 ssv \s+ a1 b1 c1
par_groupby --block 20 c1 ssv \s+ 3 2 2
par_groupby --block 20 c1 ssv \s+ NewRec
par_groupby --block 20 c1 ssv \s+ a1 b1 c1
par_groupby --block 20 c1 ssv \s+ 3 2 3
par_groupby --block 20 c1 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 --block 20
par_groupby --block 20 c1 cssv [\s,]+ NewRec
par_groupby --block 20 c1 cssv [\s,]+ a1, b1, c1,
par_groupby --block 20 c1 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby --block 20 c1 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby --block 20 c1 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby --block 20 c1 cssv [\s,]+ NewRec
par_groupby --block 20 c1 cssv [\s,]+ a1, b1, c1,
par_groupby --block 20 c1 cssv [\s,]+ 3,,2,,4,,
par_groupby --block 20 c1 cssv [\s,]+ NewRec
par_groupby --block 20 c1 cssv [\s,]+ a1, b1, c1,
par_groupby --block 20 c1 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby --block 20 c1 cssv [\s,]+ 3 2 3
par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 c1 csv , ### test csv | --colsep , --groupby c1 --block 20
par_groupby --block 20 c1 csv , NewRec
par_groupby --block 20 c1 csv , a1,b1,c1,
par_groupby --block 20 c1 csv , 2,2,2,
par_groupby --block 20 c1 csv , 3,2,2,
par_groupby --block 20 c1 csv , 3,3,2,
par_groupby --block 20 c1 csv , NewRec
par_groupby --block 20 c1 csv , a1,b1,c1,
par_groupby --block 20 c1 csv , 3,2,4,
par_groupby --block 20 c1 csv , NewRec
par_groupby --block 20 c1 csv , a1,b1,c1,
par_groupby --block 20 c1 csv , 3,2,2,
par_groupby --block 20 c1 csv , NewRec
par_groupby --block 20 c1 csv , a1,b1,c1,
par_groupby --block 20 c1 csv , 3,2,3,
par_groupby --block 20 c1 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 $_%=2 tsv \t ### test tsv | --colsep \t --groupby c1 $_%=2 --block 20
par_groupby --block 20 c1 $_%=2 tsv \t NewRec
par_groupby --block 20 c1 $_%=2 tsv \t a1 b1 c1
par_groupby --block 20 c1 $_%=2 tsv \t 2 2 2
par_groupby --block 20 c1 $_%=2 tsv \t 3 2 2
par_groupby --block 20 c1 $_%=2 tsv \t 3 3 2
par_groupby --block 20 c1 $_%=2 tsv \t 3 2 4
par_groupby --block 20 c1 $_%=2 tsv \t 3 2 2
par_groupby --block 20 c1 $_%=2 tsv \t 3 2 3
par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 $_%=2 tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 c1 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby c1 $_%=2 --block 20
par_groupby --block 20 c1 $_%=2 ssv \s+ NewRec
par_groupby --block 20 c1 $_%=2 ssv \s+ a1 b1 c1
par_groupby --block 20 c1 $_%=2 ssv \s+ 2 2 2
par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 2
par_groupby --block 20 c1 $_%=2 ssv \s+ 3 3 2
par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 4
par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 2
par_groupby --block 20 c1 $_%=2 ssv \s+ 3 2 3
par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 c1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby c1 $_%=2 --block 20
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ NewRec
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ a1, b1, c1,
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3,,2,,4,,
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ 3 2 3
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 c1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 87. Increasing to --blocksize 115.
par_groupby --block 20 c1 $_%=2 csv , ### test csv | --colsep , --groupby c1 $_%=2 --block 20
par_groupby --block 20 c1 $_%=2 csv , NewRec
par_groupby --block 20 c1 $_%=2 csv , a1,b1,c1,
par_groupby --block 20 c1 $_%=2 csv , 2,2,2,
par_groupby --block 20 c1 $_%=2 csv , 3,2,2,
par_groupby --block 20 c1 $_%=2 csv , 3,3,2,
par_groupby --block 20 c1 $_%=2 csv , 3,2,4,
par_groupby --block 20 c1 $_%=2 csv , 3,2,2,
par_groupby --block 20 c1 $_%=2 csv , 3,2,3,
par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 c1 $_%=2 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_keeporder_roundrobin bug #50081: --keep-order --round-robin should give predictable results
par_keeporder_roundrobin OK
par_groupby --block 20 C1 tsv \t ### test tsv | --colsep \t --groupby C1 --block 20
par_groupby --block 20 C1 tsv \t NewRec
par_groupby --block 20 C1 tsv \t a1 b1 C1
par_groupby --block 20 C1 tsv \t 2 2 2
par_groupby --block 20 C1 tsv \t 3 2 2
par_groupby --block 20 C1 tsv \t 3 3 2
par_groupby --block 20 C1 tsv \t NewRec
par_groupby --block 20 C1 tsv \t a1 b1 C1
par_groupby --block 20 C1 tsv \t 3 2 4
par_groupby --block 20 C1 tsv \t NewRec
par_groupby --block 20 C1 tsv \t a1 b1 C1
par_groupby --block 20 C1 tsv \t 3 2 2
par_groupby --block 20 C1 tsv \t NewRec
par_groupby --block 20 C1 tsv \t a1 b1 C1
par_groupby --block 20 C1 tsv \t 3 2 3
par_groupby --block 20 C1 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 ssv \s+ ### test ssv | --colsep \s+ --groupby C1 --block 20
par_groupby --block 20 C1 ssv \s+ NewRec
par_groupby --block 20 C1 ssv \s+ a1 b1 C1
par_groupby --block 20 C1 ssv \s+ 2 2 2
par_groupby --block 20 C1 ssv \s+ 3 2 2
par_groupby --block 20 C1 ssv \s+ 3 3 2
par_groupby --block 20 C1 ssv \s+ NewRec
par_groupby --block 20 C1 ssv \s+ a1 b1 C1
par_groupby --block 20 C1 ssv \s+ 3 2 4
par_groupby --block 20 C1 ssv \s+ NewRec
par_groupby --block 20 C1 ssv \s+ a1 b1 C1
par_groupby --block 20 C1 ssv \s+ 3 2 2
par_groupby --block 20 C1 ssv \s+ NewRec
par_groupby --block 20 C1 ssv \s+ a1 b1 C1
par_groupby --block 20 C1 ssv \s+ 3 2 3
par_groupby --block 20 C1 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby C1 --block 20
par_groupby --block 20 C1 cssv [\s,]+ NewRec
par_groupby --block 20 C1 cssv [\s,]+ a1, b1, C1,
par_groupby --block 20 C1 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby --block 20 C1 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby --block 20 C1 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby --block 20 C1 cssv [\s,]+ NewRec
par_groupby --block 20 C1 cssv [\s,]+ a1, b1, C1,
par_groupby --block 20 C1 cssv [\s,]+ 3,,2,,4,,
par_groupby --block 20 C1 cssv [\s,]+ NewRec
par_groupby --block 20 C1 cssv [\s,]+ a1, b1, C1,
par_groupby --block 20 C1 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby --block 20 C1 cssv [\s,]+ 3 2 3
par_groupby --block 20 C1 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 C1 csv , ### test csv | --colsep , --groupby C1 --block 20
par_groupby --block 20 C1 csv , NewRec
par_groupby --block 20 C1 csv , a1,b1,C1,
par_groupby --block 20 C1 csv , 2,2,2,
par_groupby --block 20 C1 csv , 3,2,2,
par_groupby --block 20 C1 csv , 3,3,2,
par_groupby --block 20 C1 csv , NewRec
par_groupby --block 20 C1 csv , a1,b1,C1,
par_groupby --block 20 C1 csv , 3,2,4,
par_groupby --block 20 C1 csv , NewRec
par_groupby --block 20 C1 csv , a1,b1,C1,
par_groupby --block 20 C1 csv , 3,2,2,
par_groupby --block 20 C1 csv , NewRec
par_groupby --block 20 C1 csv , a1,b1,C1,
par_groupby --block 20 C1 csv , 3,2,3,
par_groupby --block 20 C1 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 $_%=2 tsv \t ### test tsv | --colsep \t --groupby C1 $_%=2 --block 20
par_groupby --block 20 C1 $_%=2 tsv \t NewRec
par_groupby --block 20 C1 $_%=2 tsv \t a1 b1 C1
par_groupby --block 20 C1 $_%=2 tsv \t 2 2 2
par_groupby --block 20 C1 $_%=2 tsv \t 3 2 2
par_groupby --block 20 C1 $_%=2 tsv \t 3 3 2
par_groupby --block 20 C1 $_%=2 tsv \t 3 2 4
par_groupby --block 20 C1 $_%=2 tsv \t 3 2 2
par_groupby --block 20 C1 $_%=2 tsv \t 3 2 3
par_groupby --block 20 C1 $_%=2 tsv \t parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 $_%=2 tsv \t parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 $_%=2 tsv \t parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 $_%=2 tsv \t parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 C1 $_%=2 ssv \s+ ### test ssv | --colsep \s+ --groupby C1 $_%=2 --block 20
par_groupby --block 20 C1 $_%=2 ssv \s+ NewRec
par_groupby --block 20 C1 $_%=2 ssv \s+ a1 b1 C1
par_groupby --block 20 C1 $_%=2 ssv \s+ 2 2 2
par_groupby --block 20 C1 $_%=2 ssv \s+ 3 2 2
par_groupby --block 20 C1 $_%=2 ssv \s+ 3 3 2
par_groupby --block 20 C1 $_%=2 ssv \s+ 3 2 4
par_groupby --block 20 C1 $_%=2 ssv \s+ 3 2 2
par_groupby --block 20 C1 $_%=2 ssv \s+ 3 2 3
par_groupby --block 20 C1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 C1 $_%=2 ssv \s+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ ### test cssv | --colsep [\s,]+ --groupby C1 $_%=2 --block 20
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ NewRec
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ a1, b1, C1,
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ 2 ,2 ,2 ,
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ 3 , 2 , 2 ,
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ 3 , 3 , 2 ,
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ 3,,2,,4,,
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ 3 ,,, 2 ,,, 2 ,,,
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ 3 2 3
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 66. Increasing to --blocksize 87.
par_groupby --block 20 C1 $_%=2 cssv [\s,]+ parallel: Warning: A record was longer than 87. Increasing to --blocksize 115.
par_groupby --block 20 C1 $_%=2 csv , ### test csv | --colsep , --groupby C1 $_%=2 --block 20
par_groupby --block 20 C1 $_%=2 csv , NewRec
par_groupby --block 20 C1 $_%=2 csv , a1,b1,C1,
par_groupby --block 20 C1 $_%=2 csv , 2,2,2,
par_groupby --block 20 C1 $_%=2 csv , 3,2,2,
par_groupby --block 20 C1 $_%=2 csv , 3,3,2,
par_groupby --block 20 C1 $_%=2 csv , 3,2,4,
par_groupby --block 20 C1 $_%=2 csv , 3,2,2,
par_groupby --block 20 C1 $_%=2 csv , 3,2,3,
par_groupby --block 20 C1 $_%=2 csv , parallel: Warning: A record was longer than 20. Increasing to --blocksize 27.
par_groupby --block 20 C1 $_%=2 csv , parallel: Warning: A record was longer than 27. Increasing to --blocksize 37.
par_groupby --block 20 C1 $_%=2 csv , parallel: Warning: A record was longer than 37. Increasing to --blocksize 50.
par_groupby --block 20 C1 $_%=2 csv , parallel: Warning: A record was longer than 50. Increasing to --blocksize 66.
par_jobslot_repl bug #46232: {%} with --bar/--eta/--shuf or --halt xx% broken
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl bug #46231: {%} with --pipepart broken. Should give 1+2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_jobslot_repl 2
par_jobslot_repl 1
par_kill_hup ### Are children killed if GNU Parallel receives HUP? There should be no sleep at the end
par_kill_hup bash-+-perl---2*[bash---sleep]
par_kill_hup `-pstree
@ -620,6 +697,37 @@ par_kill_term bash---pstree
par_lb_mem_usage 1
par_lb_mem_usage 1
par_lb_mem_usage 2
par_maxargs ### Test -n and --max-args: Max number of args per line (only with -X and -m)
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1 line 1
par_maxargs line 2
par_maxargs line 1
par_maxargs line 2
par_maxargs line 3
par_maxargs line 1 line 1
par_maxargs line 2
par_multiline_commands bug #50781: joblog format with multiline commands
par_multiline_commands 1
par_multiline_commands finish 1
@ -635,11 +743,6 @@ par_nice Check that --nice works
par_nice load_10
par_nice bzip2 18
par_nice bzip2 18
par_pipe_unneeded_procs ### Test bug #34241: --pipe should not spawn unneeded processes
par_pipe_unneeded_procs 1
par_pipe_unneeded_procs 2
par_pipe_unneeded_procs 3
par_pipe_unneeded_procs o
par_pipepart_block ### --pipepart --block -# (# < 0)
par_pipepart_block 1
par_pipepart_block 2
@ -687,9 +790,6 @@ par_pipepart_block 17-20
par_pipepart_block 18-20
par_pipepart_block 19-20
par_pipepart_block 20-20
par_results_arg_256 ### bug #42089: --results with arg > 256 chars (should be 1 char shorter)
par_results_arg_256 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456
par_results_arg_256 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345
par_resume_failed_k ### bug #38299: --resume-failed -k
par_resume_failed_k job1 val 0
par_resume_failed_k job2 val 1
@ -719,6 +819,34 @@ par_resume_k try 2 = nothing
par_resume_k two extra
par_resume_k job6id
par_resume_k job7id
par_shard ### --shard
par_shard OK
par_shard OK
par_shard OK
par_shard OK
par_shard OK
par_shard 10 1
par_shard 10 2
par_shard 10 3
par_shard 10 4
par_shard 10 5
par_shard 10 6
par_shard 10 7
par_shard 10 8
par_shard 10 9
par_shard 9 0
par_shard 9 1
par_shard 9 2
par_shard 9 3
par_shard 9 4
par_shard 9 5
par_shard 9 6
par_shard 9 7
par_shard 9 8
par_shard 9 9
par_shard *** broken
par_shard parallel: Error: --tee requres --jobs to be higher. Try --jobs 0.
par_shard parallel: Error: --tee requres --jobs to be higher. Try --jobs 0.
par_slow_args_generation ### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834
par_slow_args_generation 1
par_slow_args_generation 2
@ -734,8 +862,76 @@ par_sqlworker_hostname host
par_sqlworker_hostname <hostname>
par_sqlworker_hostname <hostname>
par_sqlworker_hostname <hostname>
par_test_X_with_multiple_source ### Test {} multiple times in different commands
par_test_X_with_multiple_source echo 1 2 3 4 5 6 7 8 9 10 ; echo 1 2 3 4 5 6 7 8 9 10
par_test_X_with_multiple_source 1 2 3 4 5 6 7 8 9 10
par_test_X_with_multiple_source 1 2 3 4 5 6 7 8 9 10
par_test_X_with_multiple_source ### Test of -X {1}-{2} with multiple input sources
par_test_X_with_multiple_source a-b
par_test_X_with_multiple_source a-c
par_test_X_with_multiple_source b-c
par_test_X_with_multiple_source a-d
par_test_X_with_multiple_source b-f
par_test_X_with_multiple_source a-d
par_test_X_with_multiple_source a-e
par_test_X_with_multiple_source a-f
par_test_X_with_multiple_source b-d
par_test_X_with_multiple_source b-e
par_test_X_with_multiple_source b-f
par_test_X_with_multiple_source c-d
par_test_X_with_multiple_source c-e
par_test_X_with_multiple_source c-f
par_test_X_with_multiple_source ### Test of -X {}-{.} with multiple input sources
par_test_X_with_multiple_source a-a b-b
par_test_X_with_multiple_source a-a c-c a-a d-d
par_test_X_with_multiple_source b-b c-c b-b d-d
par_test_X_with_multiple_source a-a d-d a-a e-e a-a f-f b-b d-d b-b e-e
par_test_X_with_multiple_source b-b f-f c-c d-d c-c e-e c-c f-f
par_test_X_with_multiple_source a-a d-d
par_test_X_with_multiple_source a-a e-e
par_test_X_with_multiple_source a-a f-f
par_test_X_with_multiple_source b-b d-d
par_test_X_with_multiple_source b-b e-e
par_test_X_with_multiple_source b-b f-f
par_test_X_with_multiple_source c-c d-d
par_test_X_with_multiple_source c-c e-e
par_test_X_with_multiple_source c-c f-f
par_test_diff_roundrobin_k ### test there is difference on -k
par_test_diff_roundrobin_k OK
par_totaljob_repl {##} bug #45841: Replacement string for total no of jobs
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 1
par_totaljob_repl 2
par_totaljob_repl 3
par_totaljob_repl 4
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 10
par_totaljob_repl 1 2 2 2 2 2 2 2
par_totaljob_repl 2 2 2 2 2 2 2 2
par_totaljob_repl 1 3 3 3 3 3 3 3
par_totaljob_repl 2 3 3 3 3 3 3 3
par_totaljob_repl 3 3
par_totaljob_repl 1 15 15
par_totaljob_repl 2 14 14
par_totaljob_repl 3 14 14
par_totaljob_repl 4 14 14
par_totaljob_repl 5 14 14
par_totaljob_repl 6 14 14
par_totaljob_repl 7 14 14
par_totaljob_repl 8 14
par_wrong_slot_rpl_resume ### bug #47644: Wrong slot number replacement when resuming
par_wrong_slot_rpl_resume 1 0
par_wrong_slot_rpl_resume 2 1

View file

@ -1,6 +1,6 @@
### Test $TMPDIR
More than 1 MB gone. Good!
### Test --tmpdir
More than 1 MB gone. Good!
### Test $TMPDIR
More than 1 MB gone. Good!
### Test $TMPDIR and --tmpdir
More than 1 MB gone. Good!

View file

@ -61,7 +61,7 @@ echo '### Check that 4 processes are really used'
echo '### --version must have higher priority than retired options'
### --version must have higher priority than retired options
$NICEPAR --version -g -Y -U -W -T | tail
GNU parallel 20190422
GNU parallel 20190504
Copyright (C) 2007-2019 Ole Tange and Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.

View file

@ -1,4 +1,4 @@
MAXTIME=50 RETRIES=3 MAXPROC=100 MAXINNERPROC=3
MAXTIME=50 RETRIES=3 MAXPROC=84 MAXINNERPROC=3
### Filter out working servers
1d0
< openstep
@ -6,12 +6,11 @@ MAXTIME=50 RETRIES=3 MAXPROC=100 MAXINNERPROC=3
< alpha
7d4
< syllable
28,29d24
28,33d24
< dragonfly
< vax
31,34d25
< minix
33,34d25
< hurd
< beaglebone
< cubieboard2
### Copy commands to servers
@ -39,7 +38,6 @@ bin/parallel netbsd copy netbsd bin/parallel parallel
bin/parallel openbsd copy openbsd bin/parallel parallel
bin/parallel freebsd copy freebsd bin/parallel parallel
bin/parallel debian copy debian bin/parallel parallel
bin/parallel hurd copy hurd bin/parallel parallel
bin/parallel minix copy minix bin/parallel parallel
bin/env_parallel qnx copy qnx bin/env_parallel env_parallel
bin/env_parallel pidora copy pidora bin/env_parallel env_parallel
@ -65,7 +63,6 @@ bin/env_parallel netbsd copy netbsd bin/env_parallel env_parallel
bin/env_parallel openbsd copy openbsd bin/env_parallel env_parallel
bin/env_parallel freebsd copy freebsd bin/env_parallel env_parallel
bin/env_parallel debian copy debian bin/env_parallel env_parallel
bin/env_parallel hurd copy hurd bin/env_parallel env_parallel
bin/env_parallel minix copy minix bin/env_parallel env_parallel
bin/env_parallel.ash qnx copy qnx bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash pidora copy pidora bin/env_parallel.ash env_parallel.ash
@ -91,7 +88,6 @@ bin/env_parallel.ash netbsd copy netbsd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash openbsd copy openbsd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash freebsd copy freebsd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash debian copy debian bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash hurd copy hurd bin/env_parallel.ash env_parallel.ash
bin/env_parallel.ash minix copy minix bin/env_parallel.ash env_parallel.ash
bin/env_parallel.bash qnx copy qnx bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash pidora copy pidora bin/env_parallel.bash env_parallel.bash
@ -117,7 +113,6 @@ bin/env_parallel.bash netbsd copy netbsd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash openbsd copy openbsd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash freebsd copy freebsd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash debian copy debian bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash hurd copy hurd bin/env_parallel.bash env_parallel.bash
bin/env_parallel.bash minix copy minix bin/env_parallel.bash env_parallel.bash
bin/env_parallel.csh qnx copy qnx bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh pidora copy pidora bin/env_parallel.csh env_parallel.csh
@ -143,7 +138,6 @@ bin/env_parallel.csh netbsd copy netbsd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh openbsd copy openbsd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh freebsd copy freebsd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh debian copy debian bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh hurd copy hurd bin/env_parallel.csh env_parallel.csh
bin/env_parallel.csh minix copy minix bin/env_parallel.csh env_parallel.csh
bin/env_parallel.dash qnx copy qnx bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash pidora copy pidora bin/env_parallel.dash env_parallel.dash
@ -169,7 +163,6 @@ bin/env_parallel.dash netbsd copy netbsd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash openbsd copy openbsd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash freebsd copy freebsd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash debian copy debian bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash hurd copy hurd bin/env_parallel.dash env_parallel.dash
bin/env_parallel.dash minix copy minix bin/env_parallel.dash env_parallel.dash
bin/env_parallel.fish qnx copy qnx bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish pidora copy pidora bin/env_parallel.fish env_parallel.fish
@ -195,7 +188,6 @@ bin/env_parallel.fish netbsd copy netbsd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish openbsd copy openbsd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish freebsd copy freebsd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish debian copy debian bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish hurd copy hurd bin/env_parallel.fish env_parallel.fish
bin/env_parallel.fish minix copy minix bin/env_parallel.fish env_parallel.fish
bin/env_parallel.ksh qnx copy qnx bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh pidora copy pidora bin/env_parallel.ksh env_parallel.ksh
@ -221,7 +213,6 @@ bin/env_parallel.ksh netbsd copy netbsd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh openbsd copy openbsd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh freebsd copy freebsd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh debian copy debian bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh hurd copy hurd bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.ksh minix copy minix bin/env_parallel.ksh env_parallel.ksh
bin/env_parallel.mksh qnx copy qnx bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh pidora copy pidora bin/env_parallel.mksh env_parallel.mksh
@ -247,7 +238,6 @@ bin/env_parallel.mksh netbsd copy netbsd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh openbsd copy openbsd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh freebsd copy freebsd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh debian copy debian bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh hurd copy hurd bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.mksh minix copy minix bin/env_parallel.mksh env_parallel.mksh
bin/env_parallel.pdksh qnx copy qnx bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh pidora copy pidora bin/env_parallel.pdksh env_parallel.pdksh
@ -273,7 +263,6 @@ bin/env_parallel.pdksh netbsd copy netbsd bin/env_parallel.pdksh env_parallel.pd
bin/env_parallel.pdksh openbsd copy openbsd bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh freebsd copy freebsd bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh debian copy debian bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh hurd copy hurd bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.pdksh minix copy minix bin/env_parallel.pdksh env_parallel.pdksh
bin/env_parallel.sh qnx copy qnx bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh pidora copy pidora bin/env_parallel.sh env_parallel.sh
@ -299,7 +288,6 @@ bin/env_parallel.sh netbsd copy netbsd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh openbsd copy openbsd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh freebsd copy freebsd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh debian copy debian bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh hurd copy hurd bin/env_parallel.sh env_parallel.sh
bin/env_parallel.sh minix copy minix bin/env_parallel.sh env_parallel.sh
bin/env_parallel.tcsh qnx copy qnx bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh pidora copy pidora bin/env_parallel.tcsh env_parallel.tcsh
@ -325,7 +313,6 @@ bin/env_parallel.tcsh netbsd copy netbsd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh openbsd copy openbsd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh freebsd copy freebsd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh debian copy debian bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh hurd copy hurd bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.tcsh minix copy minix bin/env_parallel.tcsh env_parallel.tcsh
bin/env_parallel.zsh qnx copy qnx bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh pidora copy pidora bin/env_parallel.zsh env_parallel.zsh
@ -351,7 +338,6 @@ bin/env_parallel.zsh netbsd copy netbsd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh openbsd copy openbsd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh freebsd copy freebsd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh debian copy debian bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh hurd copy hurd bin/env_parallel.zsh env_parallel.zsh
bin/env_parallel.zsh minix copy minix bin/env_parallel.zsh env_parallel.zsh
bin/parcat qnx copy qnx bin/parcat parcat
bin/parcat pidora copy pidora bin/parcat parcat
@ -377,7 +363,6 @@ bin/parcat netbsd copy netbsd bin/parcat parcat
bin/parcat openbsd copy openbsd bin/parcat parcat
bin/parcat freebsd copy freebsd bin/parcat parcat
bin/parcat debian copy debian bin/parcat parcat
bin/parcat hurd copy hurd bin/parcat parcat
bin/parcat minix copy minix bin/parcat parcat
Done copying
@ -395,7 +380,6 @@ debian-ppc Works on debian-ppc
freebsd Syntax error: Bad fd number
hpux Works on hpux64
hpux-ia64 Works on hpux-ia64
hurd Works on hurd
macosx Works on macosx.polarhome.com
mandriva Works on mandriva.polarhome.com
miros Works on miros.polarhome.com
@ -411,7 +395,6 @@ redhat Works on redhat.polarhome.com
scosysv Works on scosysv.polarhome.com
solaris Works on solaris
solaris-x86 Works on solaris-x86
sshwithpass minix Works on minix
suse Works on suse
tru64 Works on tru64.polarhome.com
ubuntu Works on ubuntu
@ -438,8 +421,6 @@ hpux 1
hpux 1
hpux-ia64 1
hpux-ia64 1
hurd
hurd 1
macosx 2
macosx 2
mandriva 1
@ -469,8 +450,6 @@ solaris
solaris 2
solaris-x86
solaris-x86 1
sshwithpass minix 1
sshwithpass minix 1
suse 1
suse 1
tru64 1
@ -493,8 +472,6 @@ hpux 1
hpux 1
hpux-ia64 2
hpux-ia64 1
hurd 1
hurd 1
macosx 2
macosx 2
mandriva 1
@ -524,8 +501,6 @@ solaris 2
solaris 2
solaris-x86 1
solaris-x86 1
sshwithpass minix 1
sshwithpass minix 1
suse 1
suse 1
tru64 1
@ -559,8 +534,6 @@ hpux OK readonly tmp
hpux-ia64 Error in tempfile() using /XXXXXXXX.arg: Parent directory (/) is not writable
hpux-ia64 at /home/t/tange/bin/parallel line 0000
hpux-ia64 OK readonly tmp
hurd Error in tempfile() using template /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000.
hurd OK readonly tmp
macosx Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /Users/tange/bin/parallel line 0000
macosx OK readonly tmp
mandriva Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000
@ -592,7 +565,6 @@ solaris at /home/t/tange/bin/parallel line 0000
solaris OK readonly tmp
solaris-x86 Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/tange/bin/parallel line 0000
solaris-x86 OK readonly tmp
sshwithpass minix OKreadonlytmp
suse Error in tempfile() using /XXXXXXXX.arg: Could not create temp file /XXXXXXXX.arg: Permission denied at /home/t/tange/bin/parallel line 0000.
suse OK readonly tmp
tru64 Error in tempfile() using /XXXXXXXX.arg: Parent directory (/) is not writable
@ -618,16 +590,6 @@ unixware UX:sh (/bin/sh): ERROR: source: Not found
### Does exporting a bash function make parallel fail?
If login shell is not bash compatible it fails
cat <(echo bash only A)
cat <(echo bash only A)
bin/parallel funcA ::: 1
bin/parallel funcA ::: 1
export -f funcA;
export -f funcA;
funcA() {
funcA() {
}
}
aix bash only A
aix test funcA
centos bash only A
@ -641,8 +603,6 @@ hpux bash only A
hpux test funcA
hpux-ia64 bash only A
hpux-ia64 test funcA
hurd bash only A
hurd test funcA
macosx bash only A
macosx test funcA
mandriva bash only A
@ -672,7 +632,6 @@ solaris bash only A
solaris test funcA
solaris-x86 bash only A
solaris-x86 test funcA
sshwithpass minix test funcA
suse bash only A
suse test funcA
tru64 bash only A
@ -715,8 +674,6 @@ hpux test funcB
hpux bash only B
hpux-ia64 test funcB
hpux-ia64 bash only B
hurd test funcB
hurd bash only B
macosx test funcB
macosx bash only B
mandriva test funcB
@ -745,7 +702,6 @@ solaris test funcB
solaris bash only B
solaris-x86 test funcB
solaris-x86 bash only B
sshwithpass minix test funcB
suse test funcB
suse bash only B
tru64 test funcB
@ -835,17 +791,6 @@ hpux-ia64 /home/t/tange/.cshrc
hpux-ia64 /home/t/tange/.tcshrc
hpux-ia64 install-OK
hpux-ia64 bin/env_parallel: line 33: /home/t/tange/.cshrc: Permission denied
hurd Installed env_parallel in:
hurd /home/t/tange/.bashrc
hurd /home/t/tange/.shrc
hurd /home/t/tange/.zshenv
hurd /home/t/tange/.config/fish/config.fish
hurd /home/t/tange/.kshrc
hurd /home/t/tange/.mkshrc
hurd /home/t/tange/.profile
hurd /home/t/tange/.cshrc
hurd /home/t/tange/.tcshrc
hurd install-OK
macosx Installed env_parallel in:
macosx /Users/tange/.bashrc
macosx /Users/tange/.shrc
@ -990,17 +935,6 @@ solaris-x86 /home/tange/.profile
solaris-x86 /home/tange/.cshrc
solaris-x86 /home/tange/.tcshrc
solaris-x86 install-OK
sshwithpass minix Installed env_parallel in:
sshwithpass minix /home/t/tange/.bashrc
sshwithpass minix /home/t/tange/.shrc
sshwithpass minix /home/t/tange/.zshenv
sshwithpass minix /home/t/tange/.config/fish/config.fish
sshwithpass minix /home/t/tange/.kshrc
sshwithpass minix /home/t/tange/.mkshrc
sshwithpass minix /home/t/tange/.profile
sshwithpass minix /home/t/tange/.cshrc
sshwithpass minix /home/t/tange/.tcshrc
sshwithpass minix install-OK
suse Installed env_parallel in:
suse /home/t/tange/.bashrc
suse /home/t/tange/.shrc
@ -1053,7 +987,6 @@ debian-ppc env_parallel run-OK
freebsd Syntax error: Bad fd number
hpux env_parallel run-OK
hpux-ia64 env_parallel run-OK
hurd env_parallel run-OK
macosx env_parallel run-OK
mandriva env_parallel run-OK
miros env_parallel run-OK
@ -1073,7 +1006,6 @@ redhat env_parallel run-OK
scosysv env_parallel run-OK
solaris env_parallel run-OK
solaris-x86 env_parallel run-OK
sshwithpass minix env_parallel run-OK
suse env_parallel run-OK
tru64 env_parallel run-OK
ubuntu env_parallel run-OK
@ -1086,7 +1018,6 @@ debian-ppc reading from process substitution OK
freebsd Syntax error: "(" unexpected (expecting word)
hpux reading from process substitution OK
hpux-ia64 reading from process substitution OK
hurd reading from process substitution OK
macosx reading from process substitution OK
mandriva reading from process substitution OK
miros reading from process substitution OK
@ -1102,7 +1033,6 @@ redhat reading from process substitution OK
scosysv reading from process substitution OK
solaris reading from process substitution OK
solaris-x86 reading from process substitution OK
sshwithpass minix reading from process substitution OK
suse reading from process substitution OK
tru64 reading from process substitution OK
ubuntu reading from process substitution OK
@ -1132,8 +1062,6 @@ hpux ### Test if empty command name in process list causes problems
hpux OK_with_empty_cmd
hpux-ia64 ### Test if empty command name in process list causes problems
hpux-ia64 OK_with_empty_cmd
hurd ### Test if empty command name in process list causes problems
hurd OK_with_empty_cmd
macosx ### Test if empty command name in process list causes problems
macosx OK_with_empty_cmd
mandriva ### Test if empty command name in process list causes problems
@ -1162,7 +1090,6 @@ solaris ### Test if empty command name in process list causes problems
solaris OK_with_empty_cmd
solaris-x86 ### Test if empty command name in process list causes problems
solaris-x86 OK_with_empty_cmd
sshwithpass minix ### Test if empty command name in process list causes problems
suse ### Test if empty command name in process list causes problems
suse OK_with_empty_cmd
tru64 ### Test if empty command name in process list causes problems
@ -1189,7 +1116,6 @@ debian-ppc 1 2 1 2 3 1 2 3 4
freebsd Syntax error: Bad fd number
hpux
hpux-ia64 1 2 1 2 3 1 2 3 4
hurd 1 2 1 2 3 1 2 3 4
macosx 1 2 1 2 3 1 2 3 4
mandriva 1 2 1 2 3 1 2 3 4
miros 1 2 1 2 3 1 2 3 4
@ -1207,7 +1133,6 @@ redhat 1 2 1 2 3 1 2 3 4
scosysv 1 2 1 2 3 1 2 3 4
solaris 1 2 1 2 3 1 2 3 4
solaris-x86 1 2 1 2 3 1 2 3 4
sshwithpass minix 1 2 1 2 3 1 2 3 4
suse 1 2 1 2 3 1 2 3 4
tru64 1 2 1 2 3 1 2 3 4
ubuntu 1 2 1 2 3 1 2 3 4
@ -1221,7 +1146,6 @@ debian-ppc 2 2 3 2 3 4
freebsd Syntax error: Bad fd number
hpux
hpux-ia64 1 2 1 2 1 2
hurd 2 2 3 2 3 4
macosx 2 2 3 2 3 4
mandriva 2 2 3 2 3 4
miros 1 2 1 2 1 2
@ -1243,7 +1167,6 @@ redhat 2 2 3 2 3 4
scosysv 2 2 3 2 3 4
solaris 1 2 1 2 1 2
solaris-x86 2 2 3 2 3 4
sshwithpass minix 2 2 3 2 3 4
suse 2 2 3 2 3 4
tru64 2 2 3 2 3 4
ubuntu 2 2 3 2 3 4
@ -1268,7 +1191,6 @@ debian-ppc 1 2,1 2 3,1 2 3 4
freebsd Syntax error: Bad fd number
hpux ,,
hpux-ia64 1 2,1 2 3,1 2 3 4
hurd 1 2,1 2 3,1 2 3 4
macosx 1 2,1 2 3,1 2 3 4
mandriva 1 2,1 2 3,1 2 3 4
miros 1 2,1 2 3,1 2 3 4
@ -1286,7 +1208,6 @@ redhat 1 2,1 2 3,1 2 3 4
scosysv 1 2,1 2 3,1 2 3 4
solaris 1 2,1 2 3,1 2 3 4
solaris-x86 1 2,1 2 3,1 2 3 4
sshwithpass minix 1 2,1 2 3,1 2 3 4
suse 1 2,1 2 3,1 2 3 4
tru64 1 2,1 2 3,1 2 3 4
ubuntu 1 2,1 2 3,1 2 3 4
@ -1300,7 +1221,6 @@ debian-ppc 2,2 3,2 3 4
freebsd Syntax error: Bad fd number
hpux ,,
hpux-ia64 1 2,1 2,1 2
hurd 2,2 3,2 3 4
macosx 2,2 3,2 3 4
mandriva 2,2 3,2 3 4
miros 1 2,1 2,1 2
@ -1322,7 +1242,6 @@ redhat 2,2 3,2 3 4
scosysv 2,2 3,2 3 4
solaris 1 2,1 2,1 2
solaris-x86 2,2 3,2 3 4
sshwithpass minix 2,2 3,2 3 4
suse 2,2 3,2 3 4
tru64 2,2 3,2 3 4
ubuntu 2,2 3,2 3 4

View file

@ -1,7 +1,15 @@
### test parallel_tutorial
fetch -o - http://pi.dk/3) | bash
fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh
12345678 3374ec53 bacb199b 245af2dd a86df6c9
$ md5sum install.sh
029a9ac0 6e8b5bc6 052eac57 b2c3c9ca
$ sha512sum install.sh
40f53af6 9e20dae5 713ba06c f517006d 9897747b ed8a4694 b1acba1b 1464beb4
60055629 3f2356f3 3e9c4e3c 76e3f3af a9db4b32 bd33322b 975696fc e6b23cfb
$ bash install.sh
/bin/bash: -c: line 0: syntax error near unexpected token `)'
/bin/bash: -c: line 0: ` fetch -o - http://pi.dk/3) | bash'
/bin/bash: -c: line 0: ` fetch -o - http://pi.dk/3 ) > install.sh'
parallel -k echo ::: A B C > abc-file
parallel -k echo ::: D E F > def-file