From dae4f4b7ca19b6d53b1a7d3c97538091312470b4 Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Fri, 27 Jan 2017 23:15:25 +0100 Subject: [PATCH] parallel: If --results {replstr} ends in /: save in dir. Otherwise save as file. --- doc/release_new_version | 32 +- src/parallel | 62 ++-- src/parallel.pod | 130 +++---- src/parallel_design.pod | 4 + testsuite/tests-to-run/parallel-local-0.3s.sh | 55 --- testsuite/tests-to-run/parallel-local-1s.sh | 87 +++++ testsuite/wanted-results/parallel-local-0.3s | 315 ---------------- testsuite/wanted-results/parallel-local-1s | 340 ++++++++++++++++++ 8 files changed, 544 insertions(+), 481 deletions(-) diff --git a/doc/release_new_version b/doc/release_new_version index 24be1db7..5022af4e 100644 --- a/doc/release_new_version +++ b/doc/release_new_version @@ -208,44 +208,22 @@ file:///home/tange/privat/parallel/doc/release_new_version from:tange@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org -Subject: GNU Parallel 20170122 ('George Michael') released <<[stable]>> +Subject: GNU Parallel 20170222 ('<<>>') released <<[stable]>> -GNU Parallel 20170122 ('George Michael') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/ +GNU Parallel 20170222 ('<<>>') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/ <> Haiku of the month: - Speed is good for you - Multi speed is better still - Use GNU Parallel + <<>> -- Ole Tange New in this release: -* sql now uses a temporary credentials file for MySQL to avoid warning. +http://workshop2016.iwslt.org/downloads/IWSLT_2016_paper_27.pdf +http://aip.scitation.org/doi/full/10.1063/1.4974021 -* --sqlmaster and --sqlworker have been reworked. - -* --sqlworker only reads from the DBURL: any command and any arguments are ignored. - -* --sqlmaster +DBURL will append commands to the DBURL and not erase the table. - -* If --results contain a replacement string, no tree structure with args will be generated. - -* --fg --tmux or --fg --tmuxpane will connect to the tmux. - -* GNU Parallel was cited in: Fast, Automated Indoor Light Detection, Classification, and Measurement https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-212.pdf - -* GNU Parallel was cited in: Unbiased RNA Shotgun Metagenomics in Social and Solitary Wild Bees Detects Associations with Eukaryote Parasites and New Viruses http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0168456 - -* GNU Parallel was cited in: Almost Event-Rate Independent Monitoring of Metric Temporal Logic http://people.inf.ethz.ch/trayteld/papers/tacas17-aerial/aerial.pdf - -* 使用GNU parallel命令并行预处理数据https://blog.razrlele.com/p/1843 - -* GNU Parallel as a queuing system: http://puntoblogspot.blogspot.com/2017/01/gnu-parallel-as-queuing-system.html - -* AWS re:Invent 2016: Deep Dive on Amazon Elastic File System (STG202) slide 45 http://www.slideshare.net/AmazonWebServices/aws-reinvent-2016-deep-dive-on-amazon-elastic-file-system-stg202 and https://youtu.be/PlTuJx4VnGw?t=30m16s * <> diff --git a/src/parallel b/src/parallel index 0ad5d08f..3df82da9 100755 --- a/src/parallel +++ b/src/parallel @@ -6544,9 +6544,24 @@ sub openoutputfiles { my ($outfhw, $errfhw, $outname, $errname); if($opt::results and not $Global::csv) { - my $dir = $self->{'commandline'}->resultsdir(); - # prefix/name1/val1/name2/val2/seq - my $seqname = "$dir/seq"; + my $out = $self->{'commandline'}->results_out(); + my $seqname; + if($out eq $opt::results or $out =~ m:/$:) { + # $opt::results = simple string or ending in / + # => $out is a dir/ + # prefix/name1/val1/name2/val2/seq + $seqname = $out."seq"; + # prefix/name1/val1/name2/val2/stdout + $outname = $out."stdout"; + # prefix/name1/val1/name2/val2/stderr + $errname = $out."stderr"; + } else { + # $opt::results = replacement string not ending in / + # => $out is a file + $outname = $out; + $errname = "$out.err"; + $seqname = "$out.seq"; + } my $seqfhw; if(not open($seqfhw, "+>", $seqname)) { ::error("Cannot write to `$seqname'."); @@ -6554,14 +6569,10 @@ sub openoutputfiles { } print $seqfhw $self->seq(); close $seqfhw; - # prefix/name1/val1/name2/val2/stdout - $outname = "$dir/stdout"; if(not open($outfhw, "+>", $outname)) { ::error("Cannot write to `$outname'."); ::wait_and_exit(255); } - # prefix/name1/val1/name2/val2/stderr - $errname = "$dir/stderr"; if(not open($errfhw, "+>", $errname)) { ::error("Cannot write to `$errname'."); ::wait_and_exit(255); @@ -8037,9 +8048,9 @@ sub is_already_in_results { # Returns: # $job_already_run = bool whether there is output for this or not my $job = $_[0]; - my $dir = $job->{'commandline'}->resultsdir(); - ::debug("run", "Test $dir/stdout", -e "$dir/stdout", "\n"); - return -e "$dir/stdout"; + my $out = $job->{'commandline'}->results_out(); + ::debug("run", "Test ${out}stdout", -e "${out}stdout", "\n"); + return(-e $out."stdout" or -f $out); } sub is_already_in_joblog { @@ -8905,7 +8916,7 @@ sub args_as_string { map { @$_ } @{$self->{'arg_list'}}); } -sub resultsdir { +sub results_out { sub max_file_name_length { # Figure out the max length of a subdir # TODO and the max total length @@ -8945,13 +8956,13 @@ sub resultsdir { } my $self = shift; - my $dir = $self->replace_placeholders([$opt::results],0,0); - if($dir eq $opt::results) { + my $out = $self->replace_placeholders([$opt::results],0,0); + if($out eq $opt::results) { # $opt::results simple string: Append args_as_dirname my $args_as_dirname = $self->args_as_dirname(); # Output in: prefix/name1/val1/name2/val2/stdout - $dir = $opt::results."/".$args_as_dirname; - if(-d $dir or eval{ File::Path::mkpath($dir); }) { + $out = $opt::results."/".$args_as_dirname; + if(-d $out or eval{ File::Path::mkpath($out); }) { # OK } else { # mkpath failed: Argument probably too long. @@ -8960,18 +8971,25 @@ sub resultsdir { max_file_name_length($opt::results); $args_as_dirname = $self->args_as_dirname(); # prefix/name1/val1/name2/val2/ - $dir = $opt::results."/".$args_as_dirname; - File::Path::mkpath($dir); + $out = $opt::results."/".$args_as_dirname; + File::Path::mkpath($out); } + $out .="/"; } else { - if(-d $dir or eval{ File::Path::mkpath($dir); }) { - # OK + if($out =~ m:/$:) { + # / = dir + if(-d $out or eval{ File::Path::mkpath($out); }) { + # OK + } else { + ::error("Cannot make dir '$out'."); + ::wait_and_exit(255); + } } else { - ::error("Cannot make dir '$dir'."); - ::wait_and_exit(255); + $out =~ m:(.*)/:; + File::Path::mkpath($1); } } - return $dir; + return $out; } sub args_as_dirname { diff --git a/src/parallel.pod b/src/parallel.pod index 5f9694c9..34c258ea 100644 --- a/src/parallel.pod +++ b/src/parallel.pod @@ -1448,54 +1448,21 @@ it to the command. Only used with B<--pipe>. -=item B<--results> I (beta testing) +=item B<--results> I (alpha testing) -=item B<--res> I (beta testing) +=item B<--res> I (alpha testing) Save the output into files. -B +B -If I ends in B<.csv>/B<.tsv> the output will be a CSV-file -named I. - -B<.csv> gives a comma separated value file. B<.tsv> gives a TAB -separated value file. - -B<-.csv>/B<-.tsv> are special: It will give the file on stdout -(standard output). - - -B - -If I does not end in B<.csv>/B<.tsv> will be treated as a dir. - -If I contains replacement strings output files will be stored in -the resulting dir. - -E.g. - - parallel --results my_{} echo ::: foo bar baz - -will generate the files: - - my_bar/seq - my_bar/stderr - my_bar/stdout - my_baz/seq - my_baz/stderr - my_baz/stdout - my_foo/seq - my_foo/stderr - my_foo/stdout - -If I does not contain replacement strings the files will be -stored in a directory tree rooted at I. Within this directory -tree, each command will result in three files: I//stdout -and I//stderr, I//seq, where is a -sequence of directories representing the header of the input source -(if using B<--header :>) or the number of the input source and -corresponding values. +If I does not contain replacement strings and does not end in +B<.csv/.tsv>, the output will be stored in a directory tree rooted at +I. Within this directory tree, each command will result in +three files: I//stdout and I//stderr, +I//seq, where is a sequence of directories +representing the header of the input source (if using B<--header :>) +or the number of the input source and corresponding values. E.g: @@ -1536,26 +1503,64 @@ will generate the files: foo/1/I/2/IIII/stderr foo/1/I/2/IIII/stdout -and - parallel --results foo-{1} echo {1} {2} ::: I II ::: III IIII +B + +If I ends in B<.csv>/B<.tsv> the output will be a CSV-file +named I. + +B<.csv> gives a comma separated value file. B<.tsv> gives a TAB +separated value file. + +B<-.csv>/B<-.tsv> are special: It will give the file on stdout +(standard output). + + +B + +If I contains a replacement string and the replaced result does +not end in /, then the standard output will be stored in a file named +by this result. Standard error will be stored in the same file name +with '.err' added, and the sequence number will be stored in the same +file name with '.seq' added. + +E.g. + + parallel --results my_{} echo ::: foo bar baz will generate the files: - foo-I/1/I/2/IIII/seq - foo-I/1/I/2/IIII/stderr - foo-I/1/I/2/IIII/stdout - foo-I/1/I/2/III/seq - foo-I/1/I/2/III/stderr - foo-I/1/I/2/III/stdout - foo-II/1/II/2/IIII/seq - foo-II/1/II/2/IIII/stderr - foo-II/1/II/2/IIII/stdout - foo-II/1/II/2/III/seq - foo-II/1/II/2/III/stderr - foo-II/1/II/2/III/stdout + my_bar + my_bar.err + my_bar.seq + my_baz + my_baz.err + my_baz.seq + my_foo + my_foo.err + my_foo.seq -If you do not want the dir structure, try B<--files> B<--tag> instead. + +B + +If I contains a replacement string and the replaced result ends +in /, then output files will be stored in the resulting dir. + +E.g. + + parallel --results my_{}/ echo ::: foo bar baz + +will generate the files: + + my_bar/seq + my_bar/stderr + my_bar/stdout + my_baz/seq + my_baz/stderr + my_baz/stdout + my_foo/seq + my_foo/stderr + my_foo/stdout See also B<--files>, B<--tag>, B<--header>, B<--joblog>. @@ -1994,11 +1999,11 @@ I seconds after starting each ssh. I can be less than 1 seconds. -=item B<-S> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]> +=item B<-S> I<[@hostgroups/][ncores/]sshlogin[,[@hostgroups/][ncores/]sshlogin[,...]]> =item B<-S> I<@hostgroup> -=item B<--sshlogin> I<[@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]> +=item B<--sshlogin> I<[@hostgroups/][ncores/]sshlogin[,[@hostgroups/][ncores/]sshlogin[,...]]> =item B<--sshlogin> I<@hostgroup> @@ -2014,8 +2019,9 @@ hostgroup will be used. Multiple I<@hostgroup> can be given. GNU B will determine the number of CPU cores on the remote computers and run the number of jobs as specified by B<-j>. If the -number I is given GNU B will use this number for -number of CPU cores on the host. Normally I will not be needed. +number I is given GNU B will use this number for +number of CPU cores on the host. Normally I will not be +needed. An I is of the form: diff --git a/src/parallel_design.pod b/src/parallel_design.pod index 11798e60..69a81a75 100644 --- a/src/parallel_design.pod +++ b/src/parallel_design.pod @@ -765,6 +765,10 @@ simply executes according to Seq number. =head2 Buffering on disk +GNU B buffers output, because if output is not buffered you +have to be ridiculously careful on sizes to avoid mixing of outputs +(see excellent example on https://catern.com/posts/pipes.html). + GNU B buffers on disk in $TMPDIR using files, that are removed as soon as they are created, but which are kept open. So even if GNU B is killed by a power outage, there will be no files diff --git a/testsuite/tests-to-run/parallel-local-0.3s.sh b/testsuite/tests-to-run/parallel-local-0.3s.sh index 57b61f34..99a4ba3e 100644 --- a/testsuite/tests-to-run/parallel-local-0.3s.sh +++ b/testsuite/tests-to-run/parallel-local-0.3s.sh @@ -518,42 +518,6 @@ echo '### Test bugfix if no command given' echo '**' -echo "### Test --results" - mkdir -p /tmp/parallel_results_test; - parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII; - ls /tmp/parallel_results_test/testA/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testA* - -echo "### Test --res" - mkdir -p /tmp/parallel_results_test; - parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII; - ls /tmp/parallel_results_test/testD/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testD* - -echo "### Test --result" - mkdir -p /tmp/parallel_results_test; - parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII; - ls /tmp/parallel_results_test/testE/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testE* - -echo "### Test --results --header :" - mkdir -p /tmp/parallel_results_test; - parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII; - ls /tmp/parallel_results_test/testB/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testB* - -echo "### Test --results --header : named - a/b swapped" - mkdir -p /tmp/parallel_results_test; - parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II; - ls /tmp/parallel_results_test/testC/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testC* - -echo "### Test --results --header : piped" - mkdir -p /tmp/parallel_results_test; - (echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true; - find /tmp/parallel_results_test/testF/*/*/* | sort; rm -rf /tmp/parallel_results_test/testF* - -echo "### Test --results --header : piped - non-existing column header" - mkdir -p /tmp/parallel_results_test; - (printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testG true; find /tmp/parallel_results_test/testG/ | sort; rm -rf /tmp/parallel_results_test/testG* - -echo '**' - echo "bug #34958: --pipe with record size measured in lines" seq 10 | parallel -k --pipe -l 4 cat\;echo bug 34958-2 @@ -693,25 +657,6 @@ par_python_children() { \""import os; f = os.popen('uname -p'); output = f.read(); rc = f.close()"\" } -par_result_replace() { - echo '### bug #49983: --results with {1}' - parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz - find /tmp/par_*_49983 | sort - rm -rf /tmp/par_*_49983 - parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz ::: A B C - find /tmp/par_*_49983 | sort - rm -rf /tmp/par_*_49983 - parallel --results /tmp/par_{1}-{2}_49983 -k echo ::: foo bar baz ::: A B C - find /tmp/par_*_49983 | sort - rm -rf /tmp/par_*_49983 - parallel --results /tmp/par__49983 -k echo ::: foo bar baz ::: A B C - find /tmp/par_*_49983 | sort - rm -rf /tmp/par_*_49983 - parallel --results /tmp/par__49983 --header : -k echo ::: foo bar baz ::: A B C - find /tmp/par_*_49983 | sort - rm -rf /tmp/par_*_49983 -} - par_pipepart_block_bigger_2G() { echo '### Test that --pipepart can have blocks > 2GB' tmp=$(mktemp) diff --git a/testsuite/tests-to-run/parallel-local-1s.sh b/testsuite/tests-to-run/parallel-local-1s.sh index 5003cd0c..2063802a 100644 --- a/testsuite/tests-to-run/parallel-local-1s.sh +++ b/testsuite/tests-to-run/parallel-local-1s.sh @@ -112,3 +112,90 @@ echo "### Test -m -I"; EOF + +par_failing_compressor() { + echo 'Compress with failing (de)compressor' + echo 'Test --tag/--line-buffer/--files in all combinations' + echo 'Test working/failing compressor/decompressor in all combinations' + echo '(-k is used as a dummy argument)' + + stdout parallel -vk --header : --argsep ,,, \ + parallel -k {tag} {lb} {files} --compress --compress-program {comp} --decompress-program {decomp} echo ::: C={comp},D={decomp} \ + ,,, tag --tag -k \ + ,,, lb --line-buffer -k \ + ,,, files --files -k \ + ,,, comp 'cat;true' 'cat;false' \ + ,,, decomp 'cat;true' 'cat;false' | + perl -pe 's:/par......par:/tmpfile:' +} + +par_result() { + echo "### Test --results" + mkdir -p /tmp/parallel_results_test + parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII + ls /tmp/parallel_results_test/testA/*/*/*/*/* + rm -rf /tmp/parallel_results_test/testA* + + echo "### Test --res" + mkdir -p /tmp/parallel_results_test + parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII + ls /tmp/parallel_results_test/testD/*/*/*/*/* + rm -rf /tmp/parallel_results_test/testD* + + echo "### Test --result" + mkdir -p /tmp/parallel_results_test + parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII + ls /tmp/parallel_results_test/testE/*/*/*/*/* + rm -rf /tmp/parallel_results_test/testE* + + echo "### Test --results --header :" + mkdir -p /tmp/parallel_results_test + parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII + ls /tmp/parallel_results_test/testB/*/*/*/*/* + rm -rf /tmp/parallel_results_test/testB* + + echo "### Test --results --header : named - a/b swapped" + mkdir -p /tmp/parallel_results_test + parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II + ls /tmp/parallel_results_test/testC/*/*/*/*/* + rm -rf /tmp/parallel_results_test/testC* + + echo "### Test --results --header : piped" + mkdir -p /tmp/parallel_results_test + (echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true + find /tmp/parallel_results_test/testF/*/*/* | sort + rm -rf /tmp/parallel_results_test/testF* + + echo "### Test --results --header : piped - non-existing column header" + mkdir -p /tmp/parallel_results_test + (printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | + parallel --header : --result /tmp/parallel_results_test/testG true + find /tmp/parallel_results_test/testG/ | sort + rm -rf /tmp/parallel_results_test/testG* +} + +par_result_replace() { + echo '### bug #49983: --results with {1}' + parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz + find /tmp/par_*_49983 | sort + rm -rf /tmp/par_*_49983 + parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz ::: A B C + find /tmp/par_*_49983 | sort + rm -rf /tmp/par_*_49983 + parallel --results /tmp/par_{1}-{2}_49983 -k echo ::: foo bar baz ::: A B C + find /tmp/par_*_49983 | sort + rm -rf /tmp/par_*_49983 + parallel --results /tmp/par__49983 -k echo ::: foo bar baz ::: A B C + find /tmp/par_*_49983 | sort + rm -rf /tmp/par_*_49983 + parallel --results /tmp/par__49983 --header : -k echo ::: foo bar baz ::: A B C + find /tmp/par_*_49983 | sort + rm -rf /tmp/par_*_49983 + parallel --results /tmp/par__49983-{}/ --header : -k echo ::: foo bar baz ::: A B C + find /tmp/par_*_49983-* | sort + rm -rf /tmp/par_*_49983-* +} + +export -f $(compgen -A function | grep par_) +compgen -A function | grep par_ | sort | + parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1' diff --git a/testsuite/wanted-results/parallel-local-0.3s b/testsuite/wanted-results/parallel-local-0.3s index 43fcddc7..fdf054e3 100644 --- a/testsuite/wanted-results/parallel-local-0.3s +++ b/testsuite/wanted-results/parallel-local-0.3s @@ -1377,136 +1377,6 @@ echo '### Test bugfix if no command given' parallel: Error: Command line too long (1000002 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz... echo '**' ** -echo "### Test --results" -### Test --results - mkdir -p /tmp/parallel_results_test; parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII; ls /tmp/parallel_results_test/testA/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testA* -I III -I IIII -II III -II IIII -/tmp/parallel_results_test/testA/1/I/2/III/seq -/tmp/parallel_results_test/testA/1/I/2/III/stderr -/tmp/parallel_results_test/testA/1/I/2/III/stdout -/tmp/parallel_results_test/testA/1/I/2/IIII/seq -/tmp/parallel_results_test/testA/1/I/2/IIII/stderr -/tmp/parallel_results_test/testA/1/I/2/IIII/stdout -/tmp/parallel_results_test/testA/1/II/2/III/seq -/tmp/parallel_results_test/testA/1/II/2/III/stderr -/tmp/parallel_results_test/testA/1/II/2/III/stdout -/tmp/parallel_results_test/testA/1/II/2/IIII/seq -/tmp/parallel_results_test/testA/1/II/2/IIII/stderr -/tmp/parallel_results_test/testA/1/II/2/IIII/stdout -echo "### Test --res" -### Test --res - mkdir -p /tmp/parallel_results_test; parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII; ls /tmp/parallel_results_test/testD/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testD* -I III -I IIII -II III -II IIII -/tmp/parallel_results_test/testD/1/I/2/III/seq -/tmp/parallel_results_test/testD/1/I/2/III/stderr -/tmp/parallel_results_test/testD/1/I/2/III/stdout -/tmp/parallel_results_test/testD/1/I/2/IIII/seq -/tmp/parallel_results_test/testD/1/I/2/IIII/stderr -/tmp/parallel_results_test/testD/1/I/2/IIII/stdout -/tmp/parallel_results_test/testD/1/II/2/III/seq -/tmp/parallel_results_test/testD/1/II/2/III/stderr -/tmp/parallel_results_test/testD/1/II/2/III/stdout -/tmp/parallel_results_test/testD/1/II/2/IIII/seq -/tmp/parallel_results_test/testD/1/II/2/IIII/stderr -/tmp/parallel_results_test/testD/1/II/2/IIII/stdout -echo "### Test --result" -### Test --result - mkdir -p /tmp/parallel_results_test; parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII; ls /tmp/parallel_results_test/testE/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testE* -I III -I IIII -II III -II IIII -/tmp/parallel_results_test/testE/1/I/2/III/seq -/tmp/parallel_results_test/testE/1/I/2/III/stderr -/tmp/parallel_results_test/testE/1/I/2/III/stdout -/tmp/parallel_results_test/testE/1/I/2/IIII/seq -/tmp/parallel_results_test/testE/1/I/2/IIII/stderr -/tmp/parallel_results_test/testE/1/I/2/IIII/stdout -/tmp/parallel_results_test/testE/1/II/2/III/seq -/tmp/parallel_results_test/testE/1/II/2/III/stderr -/tmp/parallel_results_test/testE/1/II/2/III/stdout -/tmp/parallel_results_test/testE/1/II/2/IIII/seq -/tmp/parallel_results_test/testE/1/II/2/IIII/stderr -/tmp/parallel_results_test/testE/1/II/2/IIII/stdout -echo "### Test --results --header :" -### Test --results --header : - mkdir -p /tmp/parallel_results_test; parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII; ls /tmp/parallel_results_test/testB/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testB* -I III -I IIII -II III -II IIII -/tmp/parallel_results_test/testB/a/I/b/III/seq -/tmp/parallel_results_test/testB/a/I/b/III/stderr -/tmp/parallel_results_test/testB/a/I/b/III/stdout -/tmp/parallel_results_test/testB/a/I/b/IIII/seq -/tmp/parallel_results_test/testB/a/I/b/IIII/stderr -/tmp/parallel_results_test/testB/a/I/b/IIII/stdout -/tmp/parallel_results_test/testB/a/II/b/III/seq -/tmp/parallel_results_test/testB/a/II/b/III/stderr -/tmp/parallel_results_test/testB/a/II/b/III/stdout -/tmp/parallel_results_test/testB/a/II/b/IIII/seq -/tmp/parallel_results_test/testB/a/II/b/IIII/stderr -/tmp/parallel_results_test/testB/a/II/b/IIII/stdout -echo "### Test --results --header : named - a/b swapped" -### Test --results --header : named - a/b swapped - mkdir -p /tmp/parallel_results_test; parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II; ls /tmp/parallel_results_test/testC/*/*/*/*/*; rm -rf /tmp/parallel_results_test/testC* -I III -II III -I IIII -II IIII -/tmp/parallel_results_test/testC/a/I/b/III/seq -/tmp/parallel_results_test/testC/a/I/b/III/stderr -/tmp/parallel_results_test/testC/a/I/b/III/stdout -/tmp/parallel_results_test/testC/a/I/b/IIII/seq -/tmp/parallel_results_test/testC/a/I/b/IIII/stderr -/tmp/parallel_results_test/testC/a/I/b/IIII/stdout -/tmp/parallel_results_test/testC/a/II/b/III/seq -/tmp/parallel_results_test/testC/a/II/b/III/stderr -/tmp/parallel_results_test/testC/a/II/b/III/stdout -/tmp/parallel_results_test/testC/a/II/b/IIII/seq -/tmp/parallel_results_test/testC/a/II/b/IIII/stderr -/tmp/parallel_results_test/testC/a/II/b/IIII/stdout -echo "### Test --results --header : piped" -### Test --results --header : piped - mkdir -p /tmp/parallel_results_test; (echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true; find /tmp/parallel_results_test/testF/*/*/* | sort; rm -rf /tmp/parallel_results_test/testF* -/tmp/parallel_results_test/testF/Col/backslash\\tab/2 -/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof -/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/seq -/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stderr -/tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stdout -parallel: Warning: a NUL character occurred in the input. -parallel: Warning: It cannot be passed through in the argument list. -parallel: Warning: Did you mean to use the --null option? -echo "### Test --results --header : piped - non-existing column header" -### Test --results --header : piped - non-existing column header - mkdir -p /tmp/parallel_results_test; (printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testG true; find /tmp/parallel_results_test/testG/ | sort; rm -rf /tmp/parallel_results_test/testG* -/tmp/parallel_results_test/testG/ -/tmp/parallel_results_test/testG/Col1 -/tmp/parallel_results_test/testG/Col1/backslash\\tab -/tmp/parallel_results_test/testG/Col1/backslash\\tab/2 -/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof -/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/seq -/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stderr -/tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stdout -/tmp/parallel_results_test/testG/Col1/v1 -/tmp/parallel_results_test/testG/Col1/v1/2 -/tmp/parallel_results_test/testG/Col1/v1/2/v2 -/tmp/parallel_results_test/testG/Col1/v1/2/v2/3 -/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3 -/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/seq -/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stderr -/tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stdout -parallel: Warning: a NUL character occurred in the input. -parallel: Warning: It cannot be passed through in the argument list. -parallel: Warning: Did you mean to use the --null option? -echo '**' -** echo "bug #34958: --pipe with record size measured in lines" bug #34958: --pipe with record size measured in lines seq 10 | parallel -k --pipe -l 4 cat\;echo bug 34958-2 @@ -1754,188 +1624,3 @@ par_file_ending_in_newline ' par_pipepart_block_bigger_2G ### Test that --pipepart can have blocks > 2GB par_pipepart_block_bigger_2G 1 1 4 par_python_children ### bug #49970: Python child process dies if --env is used -par_result_replace ### bug #49983: --results with {1} -par_result_replace foo -par_result_replace bar -par_result_replace baz -par_result_replace /tmp/par_bar_49983 -par_result_replace /tmp/par_bar_49983/seq -par_result_replace /tmp/par_bar_49983/stderr -par_result_replace /tmp/par_bar_49983/stdout -par_result_replace /tmp/par_baz_49983 -par_result_replace /tmp/par_baz_49983/seq -par_result_replace /tmp/par_baz_49983/stderr -par_result_replace /tmp/par_baz_49983/stdout -par_result_replace /tmp/par_foo_49983 -par_result_replace /tmp/par_foo_49983/seq -par_result_replace /tmp/par_foo_49983/stderr -par_result_replace /tmp/par_foo_49983/stdout -par_result_replace foo A -par_result_replace foo B -par_result_replace foo C -par_result_replace bar A -par_result_replace bar B -par_result_replace bar C -par_result_replace baz A -par_result_replace baz B -par_result_replace baz C -par_result_replace /tmp/par_bar A_49983 -par_result_replace /tmp/par_bar A_49983/seq -par_result_replace /tmp/par_bar A_49983/stderr -par_result_replace /tmp/par_bar A_49983/stdout -par_result_replace /tmp/par_bar B_49983 -par_result_replace /tmp/par_bar B_49983/seq -par_result_replace /tmp/par_bar B_49983/stderr -par_result_replace /tmp/par_bar B_49983/stdout -par_result_replace /tmp/par_bar C_49983 -par_result_replace /tmp/par_bar C_49983/seq -par_result_replace /tmp/par_bar C_49983/stderr -par_result_replace /tmp/par_bar C_49983/stdout -par_result_replace /tmp/par_baz A_49983 -par_result_replace /tmp/par_baz A_49983/seq -par_result_replace /tmp/par_baz A_49983/stderr -par_result_replace /tmp/par_baz A_49983/stdout -par_result_replace /tmp/par_baz B_49983 -par_result_replace /tmp/par_baz B_49983/seq -par_result_replace /tmp/par_baz B_49983/stderr -par_result_replace /tmp/par_baz B_49983/stdout -par_result_replace /tmp/par_baz C_49983 -par_result_replace /tmp/par_baz C_49983/seq -par_result_replace /tmp/par_baz C_49983/stderr -par_result_replace /tmp/par_baz C_49983/stdout -par_result_replace /tmp/par_foo A_49983 -par_result_replace /tmp/par_foo A_49983/seq -par_result_replace /tmp/par_foo A_49983/stderr -par_result_replace /tmp/par_foo A_49983/stdout -par_result_replace /tmp/par_foo B_49983 -par_result_replace /tmp/par_foo B_49983/seq -par_result_replace /tmp/par_foo B_49983/stderr -par_result_replace /tmp/par_foo B_49983/stdout -par_result_replace /tmp/par_foo C_49983 -par_result_replace /tmp/par_foo C_49983/seq -par_result_replace /tmp/par_foo C_49983/stderr -par_result_replace /tmp/par_foo C_49983/stdout -par_result_replace foo A -par_result_replace foo B -par_result_replace foo C -par_result_replace bar A -par_result_replace bar B -par_result_replace bar C -par_result_replace baz A -par_result_replace baz B -par_result_replace baz C -par_result_replace /tmp/par_bar-A_49983 -par_result_replace /tmp/par_bar-A_49983/seq -par_result_replace /tmp/par_bar-A_49983/stderr -par_result_replace /tmp/par_bar-A_49983/stdout -par_result_replace /tmp/par_bar-B_49983 -par_result_replace /tmp/par_bar-B_49983/seq -par_result_replace /tmp/par_bar-B_49983/stderr -par_result_replace /tmp/par_bar-B_49983/stdout -par_result_replace /tmp/par_bar-C_49983 -par_result_replace /tmp/par_bar-C_49983/seq -par_result_replace /tmp/par_bar-C_49983/stderr -par_result_replace /tmp/par_bar-C_49983/stdout -par_result_replace /tmp/par_baz-A_49983 -par_result_replace /tmp/par_baz-A_49983/seq -par_result_replace /tmp/par_baz-A_49983/stderr -par_result_replace /tmp/par_baz-A_49983/stdout -par_result_replace /tmp/par_baz-B_49983 -par_result_replace /tmp/par_baz-B_49983/seq -par_result_replace /tmp/par_baz-B_49983/stderr -par_result_replace /tmp/par_baz-B_49983/stdout -par_result_replace /tmp/par_baz-C_49983 -par_result_replace /tmp/par_baz-C_49983/seq -par_result_replace /tmp/par_baz-C_49983/stderr -par_result_replace /tmp/par_baz-C_49983/stdout -par_result_replace /tmp/par_foo-A_49983 -par_result_replace /tmp/par_foo-A_49983/seq -par_result_replace /tmp/par_foo-A_49983/stderr -par_result_replace /tmp/par_foo-A_49983/stdout -par_result_replace /tmp/par_foo-B_49983 -par_result_replace /tmp/par_foo-B_49983/seq -par_result_replace /tmp/par_foo-B_49983/stderr -par_result_replace /tmp/par_foo-B_49983/stdout -par_result_replace /tmp/par_foo-C_49983 -par_result_replace /tmp/par_foo-C_49983/seq -par_result_replace /tmp/par_foo-C_49983/stderr -par_result_replace /tmp/par_foo-C_49983/stdout -par_result_replace foo A -par_result_replace foo B -par_result_replace foo C -par_result_replace bar A -par_result_replace bar B -par_result_replace bar C -par_result_replace baz A -par_result_replace baz B -par_result_replace baz C -par_result_replace /tmp/par__49983 -par_result_replace /tmp/par__49983/1 -par_result_replace /tmp/par__49983/1/bar -par_result_replace /tmp/par__49983/1/bar/2 -par_result_replace /tmp/par__49983/1/bar/2/A -par_result_replace /tmp/par__49983/1/bar/2/A/seq -par_result_replace /tmp/par__49983/1/bar/2/A/stderr -par_result_replace /tmp/par__49983/1/bar/2/A/stdout -par_result_replace /tmp/par__49983/1/bar/2/B -par_result_replace /tmp/par__49983/1/bar/2/B/seq -par_result_replace /tmp/par__49983/1/bar/2/B/stderr -par_result_replace /tmp/par__49983/1/bar/2/B/stdout -par_result_replace /tmp/par__49983/1/bar/2/C -par_result_replace /tmp/par__49983/1/bar/2/C/seq -par_result_replace /tmp/par__49983/1/bar/2/C/stderr -par_result_replace /tmp/par__49983/1/bar/2/C/stdout -par_result_replace /tmp/par__49983/1/baz -par_result_replace /tmp/par__49983/1/baz/2 -par_result_replace /tmp/par__49983/1/baz/2/A -par_result_replace /tmp/par__49983/1/baz/2/A/seq -par_result_replace /tmp/par__49983/1/baz/2/A/stderr -par_result_replace /tmp/par__49983/1/baz/2/A/stdout -par_result_replace /tmp/par__49983/1/baz/2/B -par_result_replace /tmp/par__49983/1/baz/2/B/seq -par_result_replace /tmp/par__49983/1/baz/2/B/stderr -par_result_replace /tmp/par__49983/1/baz/2/B/stdout -par_result_replace /tmp/par__49983/1/baz/2/C -par_result_replace /tmp/par__49983/1/baz/2/C/seq -par_result_replace /tmp/par__49983/1/baz/2/C/stderr -par_result_replace /tmp/par__49983/1/baz/2/C/stdout -par_result_replace /tmp/par__49983/1/foo -par_result_replace /tmp/par__49983/1/foo/2 -par_result_replace /tmp/par__49983/1/foo/2/A -par_result_replace /tmp/par__49983/1/foo/2/A/seq -par_result_replace /tmp/par__49983/1/foo/2/A/stderr -par_result_replace /tmp/par__49983/1/foo/2/A/stdout -par_result_replace /tmp/par__49983/1/foo/2/B -par_result_replace /tmp/par__49983/1/foo/2/B/seq -par_result_replace /tmp/par__49983/1/foo/2/B/stderr -par_result_replace /tmp/par__49983/1/foo/2/B/stdout -par_result_replace /tmp/par__49983/1/foo/2/C -par_result_replace /tmp/par__49983/1/foo/2/C/seq -par_result_replace /tmp/par__49983/1/foo/2/C/stderr -par_result_replace /tmp/par__49983/1/foo/2/C/stdout -par_result_replace bar B -par_result_replace bar C -par_result_replace baz B -par_result_replace baz C -par_result_replace /tmp/par__49983 -par_result_replace /tmp/par__49983/A -par_result_replace /tmp/par__49983/A/B -par_result_replace /tmp/par__49983/A/B/foo -par_result_replace /tmp/par__49983/A/B/foo/bar -par_result_replace /tmp/par__49983/A/B/foo/bar/seq -par_result_replace /tmp/par__49983/A/B/foo/bar/stderr -par_result_replace /tmp/par__49983/A/B/foo/bar/stdout -par_result_replace /tmp/par__49983/A/B/foo/baz -par_result_replace /tmp/par__49983/A/B/foo/baz/seq -par_result_replace /tmp/par__49983/A/B/foo/baz/stderr -par_result_replace /tmp/par__49983/A/B/foo/baz/stdout -par_result_replace /tmp/par__49983/A/C -par_result_replace /tmp/par__49983/A/C/foo -par_result_replace /tmp/par__49983/A/C/foo/bar -par_result_replace /tmp/par__49983/A/C/foo/bar/seq -par_result_replace /tmp/par__49983/A/C/foo/bar/stderr -par_result_replace /tmp/par__49983/A/C/foo/bar/stdout -par_result_replace /tmp/par__49983/A/C/foo/baz -par_result_replace /tmp/par__49983/A/C/foo/baz/seq -par_result_replace /tmp/par__49983/A/C/foo/baz/stderr -par_result_replace /tmp/par__49983/A/C/foo/baz/stdout diff --git a/testsuite/wanted-results/parallel-local-1s b/testsuite/wanted-results/parallel-local-1s index 0da41165..63e62d41 100644 --- a/testsuite/wanted-results/parallel-local-1s +++ b/testsuite/wanted-results/parallel-local-1s @@ -369,3 +369,343 @@ a7 b1 2 3 4 5 6 7 a8 b1 2 3 4 5 6 7 8 a9 b1 2 3 4 5 6 7 8 9 a10 b1 2 3 4 5 6 7 8 9 10 +par_failing_compressor Compress with failing (de)compressor +par_failing_compressor Test --tag/--line-buffer/--files in all combinations +par_failing_compressor Test working/failing compressor/decompressor in all combinations +par_failing_compressor (-k is used as a dummy argument) +par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor C=cat;true,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor C=cat;true,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor C=cat;false,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k --tag --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor C=cat;false,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor C=cat;true,D=cat;true C=cat;true,D=cat;true +par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor C=cat;true,D=cat;false C=cat;true,D=cat;false +par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor C=cat;false,D=cat;true C=cat;false,D=cat;true +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k --tag --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor C=cat;false,D=cat;false C=cat;false,D=cat;false +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor C=cat;true,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor C=cat;true,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor C=cat;false,D=cat;true /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k --tag -k --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor C=cat;false,D=cat;false /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor C=cat;true,D=cat;true C=cat;true,D=cat;true +par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor C=cat;true,D=cat;false C=cat;true,D=cat;false +par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor C=cat;false,D=cat;true C=cat;false,D=cat;true +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k --tag -k -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor C=cat;false,D=cat;false C=cat;false,D=cat;false +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k --line-buffer --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor C=cat;true,D=cat;true +par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor C=cat;true,D=cat;false +par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor C=cat;false,D=cat;true +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k --line-buffer -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor C=cat;false,D=cat;false +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k -k --files --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor /tmp/parallel-local-1s-tmpdir/tmpfile +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;true --decompress-program cat\;true echo ::: C=cat\;true,D=cat\;true +par_failing_compressor C=cat;true,D=cat;true +par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;true --decompress-program cat\;false echo ::: C=cat\;true,D=cat\;false +par_failing_compressor C=cat;true,D=cat;false +par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;false --decompress-program cat\;true echo ::: C=cat\;false,D=cat\;true +par_failing_compressor C=cat;false,D=cat;true +par_failing_compressor parallel: Error: cat;false failed. +par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false +par_failing_compressor C=cat;false,D=cat;false +par_failing_compressor parallel: Error: cat;false failed. +par_result ### Test --results +par_result I III +par_result I IIII +par_result II III +par_result II IIII +par_result /tmp/parallel_results_test/testA/1/I/2/III/seq +par_result /tmp/parallel_results_test/testA/1/I/2/III/stderr +par_result /tmp/parallel_results_test/testA/1/I/2/III/stdout +par_result /tmp/parallel_results_test/testA/1/I/2/IIII/seq +par_result /tmp/parallel_results_test/testA/1/I/2/IIII/stderr +par_result /tmp/parallel_results_test/testA/1/I/2/IIII/stdout +par_result /tmp/parallel_results_test/testA/1/II/2/III/seq +par_result /tmp/parallel_results_test/testA/1/II/2/III/stderr +par_result /tmp/parallel_results_test/testA/1/II/2/III/stdout +par_result /tmp/parallel_results_test/testA/1/II/2/IIII/seq +par_result /tmp/parallel_results_test/testA/1/II/2/IIII/stderr +par_result /tmp/parallel_results_test/testA/1/II/2/IIII/stdout +par_result ### Test --res +par_result I III +par_result I IIII +par_result II III +par_result II IIII +par_result /tmp/parallel_results_test/testD/1/I/2/III/seq +par_result /tmp/parallel_results_test/testD/1/I/2/III/stderr +par_result /tmp/parallel_results_test/testD/1/I/2/III/stdout +par_result /tmp/parallel_results_test/testD/1/I/2/IIII/seq +par_result /tmp/parallel_results_test/testD/1/I/2/IIII/stderr +par_result /tmp/parallel_results_test/testD/1/I/2/IIII/stdout +par_result /tmp/parallel_results_test/testD/1/II/2/III/seq +par_result /tmp/parallel_results_test/testD/1/II/2/III/stderr +par_result /tmp/parallel_results_test/testD/1/II/2/III/stdout +par_result /tmp/parallel_results_test/testD/1/II/2/IIII/seq +par_result /tmp/parallel_results_test/testD/1/II/2/IIII/stderr +par_result /tmp/parallel_results_test/testD/1/II/2/IIII/stdout +par_result ### Test --result +par_result I III +par_result I IIII +par_result II III +par_result II IIII +par_result /tmp/parallel_results_test/testE/1/I/2/III/seq +par_result /tmp/parallel_results_test/testE/1/I/2/III/stderr +par_result /tmp/parallel_results_test/testE/1/I/2/III/stdout +par_result /tmp/parallel_results_test/testE/1/I/2/IIII/seq +par_result /tmp/parallel_results_test/testE/1/I/2/IIII/stderr +par_result /tmp/parallel_results_test/testE/1/I/2/IIII/stdout +par_result /tmp/parallel_results_test/testE/1/II/2/III/seq +par_result /tmp/parallel_results_test/testE/1/II/2/III/stderr +par_result /tmp/parallel_results_test/testE/1/II/2/III/stdout +par_result /tmp/parallel_results_test/testE/1/II/2/IIII/seq +par_result /tmp/parallel_results_test/testE/1/II/2/IIII/stderr +par_result /tmp/parallel_results_test/testE/1/II/2/IIII/stdout +par_result ### Test --results --header : +par_result I III +par_result I IIII +par_result II III +par_result II IIII +par_result /tmp/parallel_results_test/testB/a/I/b/III/seq +par_result /tmp/parallel_results_test/testB/a/I/b/III/stderr +par_result /tmp/parallel_results_test/testB/a/I/b/III/stdout +par_result /tmp/parallel_results_test/testB/a/I/b/IIII/seq +par_result /tmp/parallel_results_test/testB/a/I/b/IIII/stderr +par_result /tmp/parallel_results_test/testB/a/I/b/IIII/stdout +par_result /tmp/parallel_results_test/testB/a/II/b/III/seq +par_result /tmp/parallel_results_test/testB/a/II/b/III/stderr +par_result /tmp/parallel_results_test/testB/a/II/b/III/stdout +par_result /tmp/parallel_results_test/testB/a/II/b/IIII/seq +par_result /tmp/parallel_results_test/testB/a/II/b/IIII/stderr +par_result /tmp/parallel_results_test/testB/a/II/b/IIII/stdout +par_result ### Test --results --header : named - a/b swapped +par_result I III +par_result II III +par_result I IIII +par_result II IIII +par_result /tmp/parallel_results_test/testC/a/I/b/III/seq +par_result /tmp/parallel_results_test/testC/a/I/b/III/stderr +par_result /tmp/parallel_results_test/testC/a/I/b/III/stdout +par_result /tmp/parallel_results_test/testC/a/I/b/IIII/seq +par_result /tmp/parallel_results_test/testC/a/I/b/IIII/stderr +par_result /tmp/parallel_results_test/testC/a/I/b/IIII/stdout +par_result /tmp/parallel_results_test/testC/a/II/b/III/seq +par_result /tmp/parallel_results_test/testC/a/II/b/III/stderr +par_result /tmp/parallel_results_test/testC/a/II/b/III/stdout +par_result /tmp/parallel_results_test/testC/a/II/b/IIII/seq +par_result /tmp/parallel_results_test/testC/a/II/b/IIII/stderr +par_result /tmp/parallel_results_test/testC/a/II/b/IIII/stdout +par_result ### Test --results --header : piped +par_result parallel: Warning: a NUL character occurred in the input. +par_result parallel: Warning: It cannot be passed through in the argument list. +par_result parallel: Warning: Did you mean to use the --null option? +par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2 +par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof +par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/seq +par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stderr +par_result /tmp/parallel_results_test/testF/Col/backslash\\tab/2/slash\_null\0eof/stdout +par_result ### Test --results --header : piped - non-existing column header +par_result parallel: Warning: a NUL character occurred in the input. +par_result parallel: Warning: It cannot be passed through in the argument list. +par_result parallel: Warning: Did you mean to use the --null option? +par_result /tmp/parallel_results_test/testG/ +par_result /tmp/parallel_results_test/testG/Col1 +par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab +par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2 +par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof +par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/seq +par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stderr +par_result /tmp/parallel_results_test/testG/Col1/backslash\\tab/2/slash\_null\0eof/stdout +par_result /tmp/parallel_results_test/testG/Col1/v1 +par_result /tmp/parallel_results_test/testG/Col1/v1/2 +par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2 +par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3 +par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3 +par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/seq +par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stderr +par_result /tmp/parallel_results_test/testG/Col1/v1/2/v2/3/v3/stdout +par_result_replace ### bug #49983: --results with {1} +par_result_replace foo +par_result_replace bar +par_result_replace baz +par_result_replace /tmp/par_bar_49983 +par_result_replace /tmp/par_baz_49983 +par_result_replace /tmp/par_foo_49983 +par_result_replace foo A +par_result_replace foo B +par_result_replace foo C +par_result_replace bar A +par_result_replace bar B +par_result_replace bar C +par_result_replace baz A +par_result_replace baz B +par_result_replace baz C +par_result_replace /tmp/par_bar A_49983 +par_result_replace /tmp/par_bar B_49983 +par_result_replace /tmp/par_bar C_49983 +par_result_replace /tmp/par_baz A_49983 +par_result_replace /tmp/par_baz B_49983 +par_result_replace /tmp/par_baz C_49983 +par_result_replace /tmp/par_foo A_49983 +par_result_replace /tmp/par_foo B_49983 +par_result_replace /tmp/par_foo C_49983 +par_result_replace foo A +par_result_replace foo B +par_result_replace foo C +par_result_replace bar A +par_result_replace bar B +par_result_replace bar C +par_result_replace baz A +par_result_replace baz B +par_result_replace baz C +par_result_replace /tmp/par_bar-A_49983 +par_result_replace /tmp/par_bar-B_49983 +par_result_replace /tmp/par_bar-C_49983 +par_result_replace /tmp/par_baz-A_49983 +par_result_replace /tmp/par_baz-B_49983 +par_result_replace /tmp/par_baz-C_49983 +par_result_replace /tmp/par_foo-A_49983 +par_result_replace /tmp/par_foo-B_49983 +par_result_replace /tmp/par_foo-C_49983 +par_result_replace foo A +par_result_replace foo B +par_result_replace foo C +par_result_replace bar A +par_result_replace bar B +par_result_replace bar C +par_result_replace baz A +par_result_replace baz B +par_result_replace baz C +par_result_replace /tmp/par__49983 +par_result_replace /tmp/par__49983/1 +par_result_replace /tmp/par__49983/1/bar +par_result_replace /tmp/par__49983/1/bar/2 +par_result_replace /tmp/par__49983/1/bar/2/A +par_result_replace /tmp/par__49983/1/bar/2/A/seq +par_result_replace /tmp/par__49983/1/bar/2/A/stderr +par_result_replace /tmp/par__49983/1/bar/2/A/stdout +par_result_replace /tmp/par__49983/1/bar/2/B +par_result_replace /tmp/par__49983/1/bar/2/B/seq +par_result_replace /tmp/par__49983/1/bar/2/B/stderr +par_result_replace /tmp/par__49983/1/bar/2/B/stdout +par_result_replace /tmp/par__49983/1/bar/2/C +par_result_replace /tmp/par__49983/1/bar/2/C/seq +par_result_replace /tmp/par__49983/1/bar/2/C/stderr +par_result_replace /tmp/par__49983/1/bar/2/C/stdout +par_result_replace /tmp/par__49983/1/baz +par_result_replace /tmp/par__49983/1/baz/2 +par_result_replace /tmp/par__49983/1/baz/2/A +par_result_replace /tmp/par__49983/1/baz/2/A/seq +par_result_replace /tmp/par__49983/1/baz/2/A/stderr +par_result_replace /tmp/par__49983/1/baz/2/A/stdout +par_result_replace /tmp/par__49983/1/baz/2/B +par_result_replace /tmp/par__49983/1/baz/2/B/seq +par_result_replace /tmp/par__49983/1/baz/2/B/stderr +par_result_replace /tmp/par__49983/1/baz/2/B/stdout +par_result_replace /tmp/par__49983/1/baz/2/C +par_result_replace /tmp/par__49983/1/baz/2/C/seq +par_result_replace /tmp/par__49983/1/baz/2/C/stderr +par_result_replace /tmp/par__49983/1/baz/2/C/stdout +par_result_replace /tmp/par__49983/1/foo +par_result_replace /tmp/par__49983/1/foo/2 +par_result_replace /tmp/par__49983/1/foo/2/A +par_result_replace /tmp/par__49983/1/foo/2/A/seq +par_result_replace /tmp/par__49983/1/foo/2/A/stderr +par_result_replace /tmp/par__49983/1/foo/2/A/stdout +par_result_replace /tmp/par__49983/1/foo/2/B +par_result_replace /tmp/par__49983/1/foo/2/B/seq +par_result_replace /tmp/par__49983/1/foo/2/B/stderr +par_result_replace /tmp/par__49983/1/foo/2/B/stdout +par_result_replace /tmp/par__49983/1/foo/2/C +par_result_replace /tmp/par__49983/1/foo/2/C/seq +par_result_replace /tmp/par__49983/1/foo/2/C/stderr +par_result_replace /tmp/par__49983/1/foo/2/C/stdout +par_result_replace bar B +par_result_replace bar C +par_result_replace baz B +par_result_replace baz C +par_result_replace /tmp/par__49983 +par_result_replace /tmp/par__49983/A +par_result_replace /tmp/par__49983/A/B +par_result_replace /tmp/par__49983/A/B/foo +par_result_replace /tmp/par__49983/A/B/foo/bar +par_result_replace /tmp/par__49983/A/B/foo/bar/seq +par_result_replace /tmp/par__49983/A/B/foo/bar/stderr +par_result_replace /tmp/par__49983/A/B/foo/bar/stdout +par_result_replace /tmp/par__49983/A/B/foo/baz +par_result_replace /tmp/par__49983/A/B/foo/baz/seq +par_result_replace /tmp/par__49983/A/B/foo/baz/stderr +par_result_replace /tmp/par__49983/A/B/foo/baz/stdout +par_result_replace /tmp/par__49983/A/C +par_result_replace /tmp/par__49983/A/C/foo +par_result_replace /tmp/par__49983/A/C/foo/bar +par_result_replace /tmp/par__49983/A/C/foo/bar/seq +par_result_replace /tmp/par__49983/A/C/foo/bar/stderr +par_result_replace /tmp/par__49983/A/C/foo/bar/stdout +par_result_replace /tmp/par__49983/A/C/foo/baz +par_result_replace /tmp/par__49983/A/C/foo/baz/seq +par_result_replace /tmp/par__49983/A/C/foo/baz/stderr +par_result_replace /tmp/par__49983/A/C/foo/baz/stdout +par_result_replace bar B +par_result_replace bar C +par_result_replace baz B +par_result_replace baz C +par_result_replace /tmp/par__49983-bar B +par_result_replace /tmp/par__49983-bar B/seq +par_result_replace /tmp/par__49983-bar B/stderr +par_result_replace /tmp/par__49983-bar B/stdout +par_result_replace /tmp/par__49983-bar C +par_result_replace /tmp/par__49983-bar C/seq +par_result_replace /tmp/par__49983-bar C/stderr +par_result_replace /tmp/par__49983-bar C/stdout +par_result_replace /tmp/par__49983-baz B +par_result_replace /tmp/par__49983-baz B/seq +par_result_replace /tmp/par__49983-baz B/stderr +par_result_replace /tmp/par__49983-baz B/stdout +par_result_replace /tmp/par__49983-baz C +par_result_replace /tmp/par__49983-baz C/seq +par_result_replace /tmp/par__49983-baz C/stderr +par_result_replace /tmp/par__49983-baz C/stdout