From da705d03b63c53e8079feeb7447767d774067fa2 Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Fri, 6 Jan 2017 19:10:20 +0100 Subject: [PATCH] parallel: If --results includes a replacement string, no tree structure with args will be generated. --- doc/release_new_version | 2 + src/parallel | 128 ++++++----- src/parallel.pod | 56 +++-- src/parallel_alternatives.pod | 6 + src/parallel_tutorial.pod | 4 +- testsuite/tests-to-run/parallel-local-0.3s.sh | 33 ++- testsuite/tests-to-run/parallel-local-ssh3.sh | 36 +++ testsuite/tests-to-run/parallel-remote1.sh | 4 +- testsuite/tests-to-run/test21.sh | 2 +- testsuite/tests-to-run/test36.sh | 2 +- testsuite/tests-to-run/test46.sh | 20 +- testsuite/tests-to-run/test61.sh | 2 +- testsuite/wanted-results/parallel-local-0.3s | 206 ++++++++++++++++-- testsuite/wanted-results/parallel-local-10s | 31 +-- testsuite/wanted-results/parallel-local-ssh1 | 2 +- testsuite/wanted-results/parallel-local-ssh3 | 8 + testsuite/wanted-results/parallel-local-ssh5 | 6 +- testsuite/wanted-results/parallel-local-ssh6 | 32 +-- testsuite/wanted-results/parallel-local13 | 4 +- testsuite/wanted-results/parallel-local19 | 2 +- testsuite/wanted-results/parallel-local21 | 48 ---- testsuite/wanted-results/parallel-local23 | 8 +- testsuite/wanted-results/parallel-local9 | 4 +- testsuite/wanted-results/parallel-remote1 | 10 +- testsuite/wanted-results/parallel-tutorial | 4 +- testsuite/wanted-results/sql01 | 4 +- testsuite/wanted-results/test13 | 3 - testsuite/wanted-results/test19 | 4 +- testsuite/wanted-results/test21 | 8 +- testsuite/wanted-results/test46 | 8 - testsuite/wanted-results/test61 | 10 +- 31 files changed, 434 insertions(+), 263 deletions(-) diff --git a/doc/release_new_version b/doc/release_new_version index 7e04e1f7..7a9c1b02 100644 --- a/doc/release_new_version +++ b/doc/release_new_version @@ -230,6 +230,8 @@ Haiku of the month: -- Ole Tange New in this release: +http://www.slideshare.net/AmazonWebServices/aws-reinvent-2016-deep-dive-on-amazon-elastic-file-system-stg202 +https://www.youtube.com/watch?v=PlTuJx4VnGw slide 45 of the deck and 30:16 https://www2.eecs.berkeley.edu/Pubs/TechRpts/2016/EECS-2016-212.pdf http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0168456#references http://people.inf.ethz.ch/trayteld/papers/aerial/aerial.pdf diff --git a/src/parallel b/src/parallel index 8b3406a1..fdb5a47f 100755 --- a/src/parallel +++ b/src/parallel @@ -6534,24 +6534,7 @@ sub openoutputfiles { my ($outfhw, $errfhw, $outname, $errname); if($opt::results and not $Global::csv) { - # Results as dir - my $args_as_dirname = $self->{'commandline'}->args_as_dirname(); - # Output in: prefix/name1/val1/name2/val2/stdout - my $dir = $self->{'commandline'}-> - replace_placeholders([$opt::results],0,0) . - "/".$args_as_dirname; - if(eval{ File::Path::mkpath($dir); }) { - # OK - } else { - # mkpath failed: Argument probably too long. - # Set $Global::max_file_length, which will keep the individual - # dir names shorter than the max length - max_file_name_length($opt::results); - $args_as_dirname = $self->{'commandline'}->args_as_dirname(); - # prefix/name1/val1/name2/val2/ - $dir = $opt::results."/".$args_as_dirname; - File::Path::mkpath($dir); - } + my $dir = $self->{'commandline'}->resultsdir(); # prefix/name1/val1/name2/val2/seq my $seqname = "$dir/seq"; my $seqfhw; @@ -6722,43 +6705,7 @@ sub filter_through_compress { } } -sub max_file_name_length { - # Figure out the max length of a subdir - # TODO and the max total length - # Ext4 = 255,130816 - # Uses: - # $Global::max_file_length is set - # Returns: - # $Global::max_file_length - my $testdir = shift; - my $upper = 8_000_000; - # Dir length of 8 chars is supported everywhere - my $len = 8; - my $dir = "x"x$len; - do { - rmdir($testdir."/".$dir); - $len *= 16; - $dir = "x"x$len; - } while ($len < $upper and mkdir $testdir."/".$dir); - # Then search for the actual max length between $len/16 and $len - my $min = $len/16; - my $max = $len; - while($max-$min > 5) { - # If we are within 5 chars of the exact value: - # it is not worth the extra time to find the exact value - my $test = int(($min+$max)/2); - $dir = "x"x$test; - if(mkdir $testdir."/".$dir) { - rmdir($testdir."/".$dir); - $min = $test; - } else { - $max = $test; - } - } - $Global::max_file_length = $min; - return $min; -} sub set_fh { # Set file handle @@ -8081,9 +8028,7 @@ sub is_already_in_results { # Returns: # $job_already_run = bool whether there is output for this or not my $job = $_[0]; - my $args_as_dirname = $job->{'commandline'}->args_as_dirname(); - # prefix/name1/val1/name2/val2/ - my $dir = $opt::results."/".$args_as_dirname; + my $dir = $job->{'commandline'}->resultsdir(); ::debug("run", "Test $dir/stdout", -e "$dir/stdout", "\n"); return -e "$dir/stdout"; } @@ -8951,6 +8896,75 @@ sub args_as_string { map { @$_ } @{$self->{'arg_list'}}); } +sub resultsdir { + sub max_file_name_length { + # Figure out the max length of a subdir + # TODO and the max total length + # Ext4 = 255,130816 + # Uses: + # $Global::max_file_length is set + # Returns: + # $Global::max_file_length + my $testdir = shift; + + my $upper = 8_000_000; + # Dir length of 8 chars is supported everywhere + my $len = 8; + my $dir = "x"x$len; + do { + rmdir($testdir."/".$dir); + $len *= 16; + $dir = "x"x$len; + } while ($len < $upper and mkdir $testdir."/".$dir); + # Then search for the actual max length between $len/16 and $len + my $min = $len/16; + my $max = $len; + while($max-$min > 5) { + # If we are within 5 chars of the exact value: + # it is not worth the extra time to find the exact value + my $test = int(($min+$max)/2); + $dir = "x"x$test; + if(mkdir $testdir."/".$dir) { + rmdir($testdir."/".$dir); + $min = $test; + } else { + $max = $test; + } + } + $Global::max_file_length = $min; + return $min; + } + + my $self = shift; + my $dir = $self->replace_placeholders([$opt::results],0,0); + if($dir 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); }) { + # OK + } else { + # mkpath failed: Argument probably too long. + # Set $Global::max_file_length, which will keep the individual + # dir names shorter than the max length + 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); + } + } else { + if(-d $dir or eval{ File::Path::mkpath($dir); }) { + # OK + } else { + ::error("Cannot make dir '$dir'."); + ::wait_and_exit(255); + } + } + return $dir; +} + sub args_as_dirname { # Returns: # all unmodified arguments joined with '/' (similar to {}) diff --git a/src/parallel.pod b/src/parallel.pod index ba00d876..3b920011 100644 --- a/src/parallel.pod +++ b/src/parallel.pod @@ -1448,9 +1448,9 @@ it to the command. Only used with B<--pipe>. -=item B<--results> I (beta testing) +=item B<--results> I (prealpha testing) -=item B<--res> I (beta testing) +=item B<--res> I (prealpha testing) Save the output into files. @@ -1470,15 +1470,33 @@ B If I does not end in B<.csv>/B<.tsv> will be treated as a dir. -The files will be stored in a directory tree rooted at I. -Within this directory tree, each command will result in two files: -I//stdout and I//stderr, where is a +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. -I can contain replacement strings. - E.g: parallel --header : --results foo echo {a} {b} \ @@ -1486,14 +1504,18 @@ E.g: will generate the files: - foo/a/I/b/III/stderr - foo/a/I/b/III/stdout - foo/a/I/b/IIII/stderr - foo/a/I/b/IIII/stdout + foo/a/II/b/III/seq foo/a/II/b/III/stderr foo/a/II/b/III/stdout + foo/a/II/b/IIII/seq foo/a/II/b/IIII/stderr foo/a/II/b/IIII/stdout + foo/a/I/b/III/seq + foo/a/I/b/III/stderr + foo/a/I/b/III/stdout + foo/a/I/b/IIII/seq + foo/a/I/b/IIII/stderr + foo/a/I/b/IIII/stdout and @@ -1501,14 +1523,18 @@ and will generate the files: - foo/1/I/2/III/stderr - foo/1/I/2/III/stdout - foo/1/I/2/IIII/stderr - foo/1/I/2/IIII/stdout + foo/1/II/2/III/seq foo/1/II/2/III/stderr foo/1/II/2/III/stdout + foo/1/II/2/IIII/seq foo/1/II/2/IIII/stderr foo/1/II/2/IIII/stdout + foo/1/I/2/III/seq + foo/1/I/2/III/stderr + foo/1/I/2/III/stdout + foo/1/I/2/IIII/seq + foo/1/I/2/IIII/stderr + foo/1/I/2/IIII/stdout and diff --git a/src/parallel_alternatives.pod b/src/parallel_alternatives.pod index 2dee4f71..508583a2 100644 --- a/src/parallel_alternatives.pod +++ b/src/parallel_alternatives.pod @@ -857,6 +857,12 @@ If /tmp/parallel runs full during the run, Rust parallel does not report this, but finishes with success - thereby risking data loss. +=head2 DIFFERENCES BETWEEN Rush AND GNU Parallel + +Rush (https://github.com/shenwei356/rush) is written in Go and based +on gargs. + + =head2 DIFFERENCES BETWEEN ClusterSSH AND GNU Parallel ClusterSSH solves a different problem than GNU B. diff --git a/src/parallel_tutorial.pod b/src/parallel_tutorial.pod index 3368d188..95b97087 100644 --- a/src/parallel_tutorial.pod +++ b/src/parallel_tutorial.pod @@ -2306,7 +2306,9 @@ Output: Same as above. B<--pipe> is not very efficient. It maxes out at around 500 MB/s. B<--pipepart> can easily deliver 5 GB/s. But there are a few limitations. The input has to be a normal file (not a pipe) given by -B<-a> or B<::::> and B<-L>/B<-l>/B<-N> do not work. +B<-a> or B<::::> and B<-L>/B<-l>/B<-N> do not work. B<--recend> and +B<--recstart>, however, I work, and records can often be split on +that alone. parallel --pipepart -a num1000000 --block 3m wc diff --git a/testsuite/tests-to-run/parallel-local-0.3s.sh b/testsuite/tests-to-run/parallel-local-0.3s.sh index 0d715af8..4ce5d24f 100644 --- a/testsuite/tests-to-run/parallel-local-0.3s.sh +++ b/testsuite/tests-to-run/parallel-local-0.3s.sh @@ -603,14 +603,6 @@ echo '### bug #34422: parallel -X --eta crashes with div by zero' # We do not care how long it took seq 2 | stdout parallel -X --eta echo | grep -E -v 'ETA:.*AVG' -echo '**' - -echo '### bug #48295: --results should be dynamic like --wd' - - rm -rf /tmp/parallel-48295; - parallel --results /tmp/parallel-48295/{1} -k echo ::: A B ::: a b; - find /tmp/parallel-48295 -type f | sort - echo '**' bash -O extglob -c '. `which env_parallel.bash`; @@ -697,8 +689,29 @@ par_python_children() { echo '### bug #49970: Python child process dies if --env is used' fu() { echo joe; } export -f fu - stdout parallel --env fu python -c \""import os;f = os.popen('uname -p');output = f.read();rc = f.close()"\" ::: 1 + echo foo | stdout parallel --env fu python -c \ + \""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 } export -f $(compgen -A function | grep par_) -compgen -A function | grep par_ | sort | parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1' +compgen -A function | grep par_ | sort | + parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1' diff --git a/testsuite/tests-to-run/parallel-local-ssh3.sh b/testsuite/tests-to-run/parallel-local-ssh3.sh index 41d76abd..01de4277 100644 --- a/testsuite/tests-to-run/parallel-local-ssh3.sh +++ b/testsuite/tests-to-run/parallel-local-ssh3.sh @@ -87,3 +87,39 @@ echo '### bug #49404: "Max jobs to run" does not equal the number of jobs specif echo should give 10 running jobs stdout parallel -S 16/lo --progress true ::: {1..10} | grep /.10 EOF + +par_trc_with_space() { + SERVER1=parallel-server1 + echo '### Test --trc with space added in filename' + echo original > '/tmp/parallel space file' + echo '/tmp/parallel space file' | stdout parallel --trc "{} more space" -S parallel@$SERVER1 cat {} ">{}\\ more\\ space" + cat '/tmp/parallel space file more space' + rm '/tmp/parallel space file' '/tmp/parallel space file more space' +} + +par_trc_with_special_chars() { + SERVER1=parallel-server1 + echo '### Test --trc with >|< added in filename' + echo original > '/tmp/parallel space file2' + echo '/tmp/parallel space file2' | stdout parallel --trc "{} >|<" -S parallel@$SERVER1 cat {} ">{}\\ \\>\\|\\<" + cat '/tmp/parallel space file2 >|<' + rm '/tmp/parallel space file2' '/tmp/parallel space file2 >|<' +} + +par_return_with_fixedstring() { + echo '### Test --return with fixed string (Gave undef warnings)' + touch a + echo a | stdout parallel --return b -S parallel@lo echo ">b" && echo OK + rm a b +} + +par_quoting_for_onall() { + echo '### bug #35427: quoting of {2} broken for --onall' + echo foo: /bin/ls | parallel --colsep ' ' -S lo --onall ls {2} +} + +export -f $(compgen -A function | grep par_) +# Tested with -j1..8 +# -j6 was fastest +#compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1' +compgen -A function | grep par_ | sort | parallel --delay 0.1 -j2 --tag -k '{} 2>&1' diff --git a/testsuite/tests-to-run/parallel-remote1.sh b/testsuite/tests-to-run/parallel-remote1.sh index 98d19c55..8663f320 100644 --- a/testsuite/tests-to-run/parallel-remote1.sh +++ b/testsuite/tests-to-run/parallel-remote1.sh @@ -1,8 +1,8 @@ #!/bin/bash -SERVER1=parallel-server3 +SERVER1=parallel-server1 SERVER2=lo -SSHLOGIN1=parallel@parallel-server3 +SSHLOGIN1=parallel@parallel-server1 SSHLOGIN2=parallel@lo SSHLOGIN3=parallel@parallel-server2 diff --git a/testsuite/tests-to-run/test21.sh b/testsuite/tests-to-run/test21.sh index b745f0a0..b063a34a 100644 --- a/testsuite/tests-to-run/test21.sh +++ b/testsuite/tests-to-run/test21.sh @@ -1,6 +1,6 @@ #!/bin/bash -SERVER1=parallel-server3 +SERVER1=parallel-server1 SERVER2=parallel-server2 echo '### Test $PARALLEL - single line' diff --git a/testsuite/tests-to-run/test36.sh b/testsuite/tests-to-run/test36.sh index 471e68f1..5b9b863a 100644 --- a/testsuite/tests-to-run/test36.sh +++ b/testsuite/tests-to-run/test36.sh @@ -1,6 +1,6 @@ #!/bin/bash -SERVER1=parallel-server3 +SERVER1=parallel-server1 SERVER2=parallel-server2 echo '### Test $PARALLEL_SEQ - local' diff --git a/testsuite/tests-to-run/test46.sh b/testsuite/tests-to-run/test46.sh index a0896c91..32a944e6 100644 --- a/testsuite/tests-to-run/test46.sh +++ b/testsuite/tests-to-run/test46.sh @@ -1,24 +1,6 @@ #!/bin/bash -SERVER1=parallel-server3 +SERVER1=parallel-server1 SERVER2=parallel-server2 -echo '### Test --trc with space added in filename' -echo original > '/tmp/parallel space file' -echo '/tmp/parallel space file' | stdout parallel --trc "{} more space" -S parallel@$SERVER1 cat {} ">{}\\ more\\ space" -cat '/tmp/parallel space file more space' -rm '/tmp/parallel space file more space' -echo '### Test --trc with >|< added in filename' -echo original > '/tmp/parallel space file' -echo '/tmp/parallel space file' | stdout parallel --trc "{} >|<" -S parallel@$SERVER1 cat {} ">{}\\ \\>\\|\\<" -cat '/tmp/parallel space file >|<' -rm '/tmp/parallel space file >|<' - -echo '### Test --return with fixed string (Gave undef warnings)' -touch a -echo a | stdout parallel --return b -S .. echo ">b" && echo OK -rm a b - -echo '### bug #35427: quoting of {2} broken for --onall' -echo foo: /bin/ls | parallel --colsep ' ' -S localhost --onall ls {2} diff --git a/testsuite/tests-to-run/test61.sh b/testsuite/tests-to-run/test61.sh index 634bde1f..8d8b3553 100644 --- a/testsuite/tests-to-run/test61.sh +++ b/testsuite/tests-to-run/test61.sh @@ -1,6 +1,6 @@ #!/bin/bash -SERVER1=parallel-server3 +SERVER1=parallel-server1 SERVER2=parallel-server2 cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 diff --git a/testsuite/wanted-results/parallel-local-0.3s b/testsuite/wanted-results/parallel-local-0.3s index cb307ba5..64dfdb97 100644 --- a/testsuite/wanted-results/parallel-local-0.3s +++ b/testsuite/wanted-results/parallel-local-0.3s @@ -1629,27 +1629,6 @@ Computers / CPU cores / Max jobs to run Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete echo '**' -** -echo '### bug #48295: --results should be dynamic like --wd' -### bug #48295: --results should be dynamic like --wd - rm -rf /tmp/parallel-48295; parallel --results /tmp/parallel-48295/{1} -k echo ::: A B ::: a b; find /tmp/parallel-48295 -type f | sort -A a -A b -B a -B b -/tmp/parallel-48295/A/1/A/2/a/seq -/tmp/parallel-48295/A/1/A/2/a/stderr -/tmp/parallel-48295/A/1/A/2/a/stdout -/tmp/parallel-48295/A/1/A/2/b/seq -/tmp/parallel-48295/A/1/A/2/b/stderr -/tmp/parallel-48295/A/1/A/2/b/stdout -/tmp/parallel-48295/B/1/B/2/a/seq -/tmp/parallel-48295/B/1/B/2/a/stderr -/tmp/parallel-48295/B/1/B/2/a/stdout -/tmp/parallel-48295/B/1/B/2/b/seq -/tmp/parallel-48295/B/1/B/2/b/stderr -/tmp/parallel-48295/B/1/B/2/b/stdout -echo '**' ** bash -O extglob -c '. `which env_parallel.bash`; _longopt () { case "$prev" in --+([-a-z0-9_])) echo foo;; esac; }; env_parallel echo ::: env_parallel 2>&1 ' env_parallel @@ -1773,3 +1752,188 @@ par_file_ending_in_newline gzip /tmp/parallel_f1 par_file_ending_in_newline gzip /tmp/parallel_f2' par_file_ending_in_newline ' 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-10s b/testsuite/wanted-results/parallel-local-10s index 1ba291f1..4f6abd49 100644 --- a/testsuite/wanted-results/parallel-local-10s +++ b/testsuite/wanted-results/parallel-local-10s @@ -482,10 +482,10 @@ par_kill_children_timeout 0 0 0 par_kill_children_timeout 2 par_kill_children_timeout 0 0 0 par_maxlinelen_X_I ### Test max line length -X -I -par_maxlinelen_X_I 47ec7550232044dc1e7a504705a45184 - +par_maxlinelen_X_I 81c0a85162c989c07f666b827a30ce52 - par_maxlinelen_X_I Chars per line (817788/13): 62906 par_maxlinelen_m_I ### Test max line length -m -I -par_maxlinelen_m_I d10d5c84fc4716b21d90afa92cf44d73 - +par_maxlinelen_m_I 14bacad229d8b0d32be0a2339c2a6af7 - par_maxlinelen_m_I Chars per line (697810/11): 63437 par_memleak ### Test memory consumption stays (almost) the same for 30 and 300 jobs par_memleak should give 1 == true @@ -946,17 +946,7 @@ par_round_robin_blocks 8 par_sigterm ### Test SIGTERM par_sigterm 1 par_sigterm 10 -par_sigterm 11 -par_sigterm 12 -par_sigterm 13 -par_sigterm 14 -par_sigterm 15 -par_sigterm 16 -par_sigterm 17 -par_sigterm 18 -par_sigterm 19 par_sigterm 2 -par_sigterm 20 par_sigterm 3 par_sigterm 4 par_sigterm 5 @@ -965,23 +955,8 @@ par_sigterm 7 par_sigterm 8 par_sigterm 9 par_sigterm parallel: SIGTERM received. No new jobs will be started. -par_sigterm parallel: Waiting for these 20 jobs to finish. Send SIGTERM again to stop now. -par_sigterm parallel: sleep 3; echo 1 +par_sigterm parallel: Waiting for these 5 jobs to finish. Send SIGTERM again to stop now. par_sigterm parallel: sleep 3; echo 10 -par_sigterm parallel: sleep 3; echo 11 -par_sigterm parallel: sleep 3; echo 12 -par_sigterm parallel: sleep 3; echo 13 -par_sigterm parallel: sleep 3; echo 14 -par_sigterm parallel: sleep 3; echo 15 -par_sigterm parallel: sleep 3; echo 16 -par_sigterm parallel: sleep 3; echo 17 -par_sigterm parallel: sleep 3; echo 18 -par_sigterm parallel: sleep 3; echo 19 -par_sigterm parallel: sleep 3; echo 2 -par_sigterm parallel: sleep 3; echo 20 -par_sigterm parallel: sleep 3; echo 3 -par_sigterm parallel: sleep 3; echo 4 -par_sigterm parallel: sleep 3; echo 5 par_sigterm parallel: sleep 3; echo 6 par_sigterm parallel: sleep 3; echo 7 par_sigterm parallel: sleep 3; echo 8 diff --git a/testsuite/wanted-results/parallel-local-ssh1 b/testsuite/wanted-results/parallel-local-ssh1 index 45dc70ea..62031325 100644 --- a/testsuite/wanted-results/parallel-local-ssh1 +++ b/testsuite/wanted-results/parallel-local-ssh1 @@ -192,7 +192,7 @@ ls: cannot access 'bug46519.ccc': No such file or directory echo '### Test --nice remote' ### Test --nice remote stdout parallel --nice 1 -S lo -vv 'PAR=a bash -c "echo \$PAR {}"' ::: b | perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z/\\+=0-9]{500,}:base64:i;' -ssh lo -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;eval\\\$eval\\\; base64; +ssh lo -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$chld\\\=\\\$SIG\\\{CHLD\\\}\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\$chld\\\;eval\\\$eval\\\; base64; a b echo '**' ** diff --git a/testsuite/wanted-results/parallel-local-ssh3 b/testsuite/wanted-results/parallel-local-ssh3 index 6638e028..8e0755dd 100644 --- a/testsuite/wanted-results/parallel-local-ssh3 +++ b/testsuite/wanted-results/parallel-local-ssh3 @@ -128,3 +128,11 @@ echo '### bug #49404: "Max jobs to run" does not equal the number of jobs specif should give 10 running jobs stdout parallel -S 16/lo --progress true ::: {1..10} | grep /.10 1:lo / 16 / 10 +par_quoting_for_onall ### bug #35427: quoting of {2} broken for --onall +par_quoting_for_onall /bin/ls +par_return_with_fixedstring ### Test --return with fixed string (Gave undef warnings) +par_return_with_fixedstring OK +par_trc_with_space ### Test --trc with space added in filename +par_trc_with_space original +par_trc_with_special_chars ### Test --trc with >|< added in filename +par_trc_with_special_chars original diff --git a/testsuite/wanted-results/parallel-local-ssh5 b/testsuite/wanted-results/parallel-local-ssh5 index 3122b20f..3dd3e1f8 100644 --- a/testsuite/wanted-results/parallel-local-ssh5 +++ b/testsuite/wanted-results/parallel-local-ssh5 @@ -34,7 +34,7 @@ Environment variables are: stderr rsync: connection unexpectedly closed (0 bytes received so far) [sender] -rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.0] +rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.1] /usr/lib/autossh/autossh: invalid option -- '-' usage: autossh [-V] [-M monitor_port[:echo_port]] [-f] [SSH_OPTIONS] @@ -66,14 +66,14 @@ Environment variables are: stderr rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] -rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.0] +rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1] echo '### bug #46520: --basefile cleans up without --cleanup' ### bug #46520: --basefile cleans up without --cleanup touch bug_46520; parallel -S parallel@lo --bf bug_46520 ls ::: bug_46520; ssh parallel@lo ls bug_46520; parallel -S parallel@lo --cleanup --bf bug_46520 ls ::: bug_46520; stdout ssh parallel@lo ls bug_46520 # should not exist bug_46520 bug_46520 bug_46520 -ls: cannot access bug_46520: No such file or directory +ls: cannot access 'bug_46520': No such file or directory echo '### bug #36595: silent loss of input with --pipe and --sshlogin' ### bug #36595: silent loss of input with --pipe and --sshlogin seq 10000 | xargs | parallel --pipe -S 8/localhost cat 2>/dev/null | wc diff --git a/testsuite/wanted-results/parallel-local-ssh6 b/testsuite/wanted-results/parallel-local-ssh6 index 2639e5ed..8bba9f91 100644 --- a/testsuite/wanted-results/parallel-local-ssh6 +++ b/testsuite/wanted-results/parallel-local-ssh6 @@ -54,21 +54,21 @@ echo '### Test --onall -u'; parallel --onall -S parallel@lo,csh@lo -u '(echo { 3 echo '### Test --nonall'; parallel --nonall -k -S parallel@lo,csh@lo pwd | sort ### Test --nonall -/home/csh -/home/parallel +/mnt/4tb/home/csh +/mnt/4tb/home/parallel echo '### Test --nonall -u - should be interleaved x y x y'; parallel --nonall -S parallel@lo,csh@lo -u 'pwd|grep -q csh && sleep 3; pwd;sleep 12;pwd;' ### Test --nonall -u - should be interleaved x y x y -/home/parallel -/home/csh -/home/parallel -/home/csh +/mnt/4tb/home/parallel +/mnt/4tb/home/csh +/mnt/4tb/home/parallel +/mnt/4tb/home/csh echo '### Test read sshloginfile from STDIN'; echo parallel@lo,csh@lo | parallel -S - -k --nonall pwd; echo parallel@lo,csh@lo | parallel --sshloginfile - -k --onall pwd\; echo ::: foo ### Test read sshloginfile from STDIN -/home/csh -/home/parallel -/home/csh +/mnt/4tb/home/csh +/mnt/4tb/home/parallel +/mnt/4tb/home/csh foo -/home/parallel +/mnt/4tb/home/parallel foo echo '**' ** @@ -88,24 +88,24 @@ echo '### Test --nonall --basefile --cleanup (rm should fail)'; touch tmp/nona ### Test --nonall --basefile --cleanup (rm should fail) tmp/nonall--basefile--clean tmp/nonall--basefile--clean -rm: cannot remove ‘tmp/nonall--basefile--clean’: No such file or directory -rm: cannot remove ‘tmp/nonall--basefile--clean’: No such file or directory +rm: cannot remove 'tmp/nonall--basefile--clean': No such file or directory +rm: cannot remove 'tmp/nonall--basefile--clean': No such file or directory echo '**' ** echo '### Test --onall --basefile --cleanup (rm should fail)'; touch tmp/onall--basefile--clean; stdout parallel --onall --basefile tmp/onall--basefile--clean --cleanup -S parallel@lo,csh@lo ls {} ::: tmp/onall--basefile--clean; stdout parallel --onall -S parallel@lo,csh@lo rm {} ::: tmp/onall--basefile--clean; stdout rm tmp/onall--basefile--clean ### Test --onall --basefile --cleanup (rm should fail) tmp/onall--basefile--clean tmp/onall--basefile--clean -rm: cannot remove ‘tmp/onall--basefile--clean’: No such file or directory -rm: cannot remove ‘tmp/onall--basefile--clean’: No such file or directory +rm: cannot remove 'tmp/onall--basefile--clean': No such file or directory +rm: cannot remove 'tmp/onall--basefile--clean': No such file or directory echo '**' ** echo '### Test --workdir .'; ssh parallel@lo mkdir -p mydir; mkdir -p $HOME/mydir; cd $HOME/mydir; parallel --workdir . -S parallel@lo ::: pwd ### Test --workdir . -/home/parallel/mydir +/mnt/4tb/home/parallel/mydir echo '### Test --wd .'; ssh csh@lo mkdir -p mydir; mkdir -p $HOME/mydir; cd $HOME/mydir; parallel --workdir . -S csh@lo ::: pwd ### Test --wd . -/home/csh/mydir +/mnt/4tb/home/csh/mydir echo '### Test --wd {}'; ssh csh@lo rm -rf wd1 wd2; mkdir -p $HOME/mydir; cd $HOME/mydir; parallel --workdir {} -S csh@lo touch ::: wd1 wd2; ssh csh@lo ls -d wd1 wd2 ### Test --wd {} wd1 diff --git a/testsuite/wanted-results/parallel-local13 b/testsuite/wanted-results/parallel-local13 index 5729fbff..2d82d1e9 100644 --- a/testsuite/wanted-results/parallel-local13 +++ b/testsuite/wanted-results/parallel-local13 @@ -32,6 +32,8 @@ rld echo '### -E_ -0 echo < eof_-0.xi' ### -E_ -0 echo < eof_-0.xi stdout xargs -E_ -0 echo < eof_-0.xi +xargs: warning: the -E option has no effect if -0 or -d is used. + one two _ three four stdout parallel -X -k -E_ -0 echo < eof_-0.xi one @@ -456,7 +458,7 @@ echo '### true < 32767-ys.xi' ### true < 32767-ys.xi stdout xargs true < 32767-ys.xi stdout parallel -k true < 32767-ys.xi -parallel: Error: Command line too long (98306 >= 65524) at input 0: y y y y y y y y y y y y y y y y y y y y y y y y y ... +parallel: Error: Command line too long (98306 >= 65528) at input 0: y y y y y y y y y y y y y y y y y y y y y y y y y ... echo '### true < 16383-ys.xi' ### true < 16383-ys.xi stdout xargs true < 16383-ys.xi diff --git a/testsuite/wanted-results/parallel-local19 b/testsuite/wanted-results/parallel-local19 index 6144b49e..fe9f911a 100644 --- a/testsuite/wanted-results/parallel-local19 +++ b/testsuite/wanted-results/parallel-local19 @@ -111,7 +111,7 @@ echo '### Test -m with 60000 args'; seq 1 60000 | perl -pe 's/$/.gif/' | par 20 179960 1286702 echo '### Test -X with 60000 args'; seq 1 60000 | perl -pe 's/$/.gif/' | parallel -j1 -kX echo a{}b{.}c{.} | tee >(wc; sleep 1) >(md5sum; sleep 1) >/dev/null; wait; sleep 1 ### Test -X with 60000 args -8646e0f7fd5f8795e4b1a831ede50e85 - +97715240fa65309902932877d24273db - 21 60000 1346682 echo '### Test -X with 60000 args and 5 expansions' ### Test -X with 60000 args and 5 expansions diff --git a/testsuite/wanted-results/parallel-local21 b/testsuite/wanted-results/parallel-local21 index 6829a45a..5d8ff9b9 100644 --- a/testsuite/wanted-results/parallel-local21 +++ b/testsuite/wanted-results/parallel-local21 @@ -95,56 +95,8 @@ par_shebang_wrap_lua Arguments arg3 par_shebang_wrap_nodejs Arguments [ 'arg1' ] par_shebang_wrap_nodejs Arguments [ 'arg2' ] par_shebang_wrap_nodejs Arguments [ 'arg3' ] -par_shebang_wrap_octave GNU Octave, version 3.8.1 -par_shebang_wrap_octave Copyright (C) 2014 John W. Eaton and others. -par_shebang_wrap_octave This is free software; see the source code for copying conditions. -par_shebang_wrap_octave There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or -par_shebang_wrap_octave FITNESS FOR A PARTICULAR PURPOSE. For details, type 'warranty'. -par_shebang_wrap_octave -par_shebang_wrap_octave Octave was configured for "x86_64-pc-linux-gnu". -par_shebang_wrap_octave -par_shebang_wrap_octave Additional information about Octave is available at http://www.octave.org. -par_shebang_wrap_octave -par_shebang_wrap_octave Please contribute if you find this software useful. -par_shebang_wrap_octave For more information, visit http://www.octave.org/get-involved.html -par_shebang_wrap_octave -par_shebang_wrap_octave Read http://www.octave.org/bugs.html to learn how to submit bug reports. -par_shebang_wrap_octave For information about changes from previous versions, type 'news'. -par_shebang_wrap_octave par_shebang_wrap_octave Arguments arg1 -par_shebang_wrap_octave GNU Octave, version 3.8.1 -par_shebang_wrap_octave Copyright (C) 2014 John W. Eaton and others. -par_shebang_wrap_octave This is free software; see the source code for copying conditions. -par_shebang_wrap_octave There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or -par_shebang_wrap_octave FITNESS FOR A PARTICULAR PURPOSE. For details, type 'warranty'. -par_shebang_wrap_octave -par_shebang_wrap_octave Octave was configured for "x86_64-pc-linux-gnu". -par_shebang_wrap_octave -par_shebang_wrap_octave Additional information about Octave is available at http://www.octave.org. -par_shebang_wrap_octave -par_shebang_wrap_octave Please contribute if you find this software useful. -par_shebang_wrap_octave For more information, visit http://www.octave.org/get-involved.html -par_shebang_wrap_octave -par_shebang_wrap_octave Read http://www.octave.org/bugs.html to learn how to submit bug reports. -par_shebang_wrap_octave For information about changes from previous versions, type 'news'. -par_shebang_wrap_octave par_shebang_wrap_octave Arguments arg2 -par_shebang_wrap_octave GNU Octave, version 3.8.1 -par_shebang_wrap_octave Copyright (C) 2014 John W. Eaton and others. -par_shebang_wrap_octave This is free software; see the source code for copying conditions. -par_shebang_wrap_octave There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or -par_shebang_wrap_octave FITNESS FOR A PARTICULAR PURPOSE. For details, type 'warranty'. -par_shebang_wrap_octave -par_shebang_wrap_octave Octave was configured for "x86_64-pc-linux-gnu". -par_shebang_wrap_octave -par_shebang_wrap_octave Additional information about Octave is available at http://www.octave.org. -par_shebang_wrap_octave -par_shebang_wrap_octave Please contribute if you find this software useful. -par_shebang_wrap_octave For more information, visit http://www.octave.org/get-involved.html -par_shebang_wrap_octave -par_shebang_wrap_octave Read http://www.octave.org/bugs.html to learn how to submit bug reports. -par_shebang_wrap_octave For information about changes from previous versions, type 'news'. -par_shebang_wrap_octave par_shebang_wrap_octave Arguments arg3 par_shebang_wrap_perl Arguments arg1 par_shebang_wrap_perl Arguments arg2 diff --git a/testsuite/wanted-results/parallel-local23 b/testsuite/wanted-results/parallel-local23 index ce95a0fb..1e0b7b82 100644 --- a/testsuite/wanted-results/parallel-local23 +++ b/testsuite/wanted-results/parallel-local23 @@ -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 -Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 +Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017 Ole Tange and Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. @@ -74,9 +74,9 @@ please cite as described in 'parallel --citation'. echo '### bug #39787: --xargs broken' ### bug #39787: --xargs broken nice perl -e 'for(1..30000){print "$_\n"}' | $NICEPAR --xargs -k echo | perl -ne 'print length $_,"\n"' -65514 -65514 -37866 +65520 +65520 +37854 echo '### --delay should grow by 3 sec per arg' ### --delay should grow by 3 sec per arg stdout /usr/bin/time -f %e parallel --delay 3 true ::: 1 2 | perl -ne '$_ >= 3 and $_ <= 8 and print "OK\n"' diff --git a/testsuite/wanted-results/parallel-local9 b/testsuite/wanted-results/parallel-local9 index 868a1476..d5ad4865 100644 --- a/testsuite/wanted-results/parallel-local9 +++ b/testsuite/wanted-results/parallel-local9 @@ -63,7 +63,7 @@ echo '### Test --number-of-cpus'; stdout $NICEPAR --number-of-cpus 1 echo '### Test --number-of-cores'; stdout $NICEPAR --number-of-cores ### Test --number-of-cores -2 +8 echo '### Test --use-cpus-instead-of-cores'; (seq 1 8 | stdout parallel --use-cpus-instead-of-cores -j100% sleep) && echo CPUs done & (seq 1 8 | stdout parallel -j100% sleep) && echo cores done & echo 'Cores should complete first on machines with less than 8 physical CPUs'; wait ### Test --use-cpus-instead-of-cores Cores should complete first on machines with less than 8 physical CPUs @@ -400,7 +400,7 @@ echo "### BUG: empty lines with --show-limit" ### BUG: empty lines with --show-limit echo | $NICEPAR --show-limits Maximal size of command: 131049 -Maximal used size of command: 65524 +Maximal used size of command: 65528 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 diff --git a/testsuite/wanted-results/parallel-remote1 b/testsuite/wanted-results/parallel-remote1 index d8b67576..4589f0e8 100644 --- a/testsuite/wanted-results/parallel-remote1 +++ b/testsuite/wanted-results/parallel-remote1 @@ -102,16 +102,16 @@ TODO test ssh with > 9 simultaneous 100 echo '### test --timeout --retries' ### test --timeout --retries - parallel -j0 --timeout 5 --retries 3 -k ssh {} echo {} ::: 192.168.1.197 8.8.8.8 parallel@parallel-server3 parallel@lo parallel@parallel-server2 -parallel@parallel-server3 + parallel -j0 --timeout 5 --retries 3 -k ssh {} echo {} ::: 192.168.1.197 8.8.8.8 parallel@parallel-server1 parallel@lo parallel@parallel-server2 +parallel@parallel-server1 parallel@lo parallel@parallel-server2 echo '### test --filter-hosts with server w/o ssh, non-existing server' ### test --filter-hosts with server w/o ssh, non-existing server - parallel -S 192.168.1.197,8.8.8.8,parallel@parallel-server3,parallel@lo,parallel@parallel-server2 --filter-hosts --nonall -k --tag echo + parallel -S 192.168.1.197,8.8.8.8,parallel@parallel-server1,parallel@lo,parallel@parallel-server2 --filter-hosts --nonall -k --tag echo parallel@lo +parallel@parallel-server1 parallel@parallel-server2 -parallel@parallel-server3 echo '### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host' ### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host (parallel -S redhat9.tange.dk true ::: {1..20}; echo No --controlmaster - finish last) & (parallel -M -S redhat9.tange.dk true ::: {1..20}; echo With --controlmaster - finish first) & wait @@ -123,7 +123,7 @@ echo '### --filter-hosts - OK, non-such-user, connection refused, wrong host' aspire echo '### test --workdir . in $HOME' ### test --workdir . in $HOME - cd && mkdir -p parallel-test && cd parallel-test && echo OK > testfile && parallel --workdir . --transfer -S parallel@parallel-server3 cat {} ::: testfile + cd && mkdir -p parallel-test && cd parallel-test && echo OK > testfile && parallel --workdir . --transfer -S parallel@parallel-server1 cat {} ::: testfile OK echo '### TODO: test --filter-hosts proxied through the one host' ### TODO: test --filter-hosts proxied through the one host diff --git a/testsuite/wanted-results/parallel-tutorial b/testsuite/wanted-results/parallel-tutorial index 178d8352..a1da2967 100644 --- a/testsuite/wanted-results/parallel-tutorial +++ b/testsuite/wanted-results/parallel-tutorial @@ -913,7 +913,7 @@ _ } export -f my_func3 parallel -vv --workdir ... --nice 17 --env _ --trc {}.out -S $SERVER1 my_func3 {} ::: abc-file -ssh -l parallel lo -- mkdir -p ./.TMPWORKDIR && rsync --protocol 30 -rlDzR -essh\ -l\ parallel ./abc-file lo:./.TMPWORKDIR;ssh -l parallel lo -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;eval\\\$eval\\\; BASE64;_EXIT_status=$?; mkdir -p ./. && rsync --protocol 30 --rsync-path=cd\ ./.TMPWORKDIR/./.\;\ rsync -rlDzR -essh\ -l\ parallel lo:./abc-file.out ./.;ssh -l parallel lo -- rm\ -f\ ./.TMPWORKDIR/abc-file\;\ sh\ -c\ rmdir\\\ ./.TMPWORKDIR/\\\ ./.parallel/tmp/\\\ ./.parallel/\\\ 2\\\>/dev/null\\\;rm\\\ -rf\\\ ./.TMPWORKDIR\\\;;ssh -l parallel lo -- rm\ -f\ ./.TMPWORKDIR/abc-file.out\;\ sh\ -c\ rmdir\\\ ./.TMPWORKDIR/\\\ ./.parallel/tmp/\\\ ./.parallel/\\\ 2\\\>/dev/null\\\;rm\\\ -rf\\\ ./.TMPWORKDIR\\\;;ssh -l parallel lo -- rm -rf .TMPWORKDIR; exit $_EXIT_status; +ssh -l parallel lo -- mkdir -p ./.TMPWORKDIR && rsync --protocol 30 -rlDzR -essh\ -l\ parallel ./abc-file lo:./.TMPWORKDIR;ssh -l parallel lo -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$chld\\\=\\\$SIG\\\{CHLD\\\}\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\$chld\\\;eval\\\$eval\\\; BASE64;_EXIT_status=$?; mkdir -p ./. && rsync --protocol 30 --rsync-path=cd\ ./.TMPWORKDIR/./.\;\ rsync -rlDzR -essh\ -l\ parallel lo:./abc-file.out ./.;ssh -l parallel lo -- rm\ -f\ ./.TMPWORKDIR/abc-file\;\ sh\ -c\ rmdir\\\ ./.TMPWORKDIR/\\\ ./.parallel/tmp/\\\ ./.parallel/\\\ 2\\\>/dev/null\\\;rm\\\ -rf\\\ ./.TMPWORKDIR\\\;;ssh -l parallel lo -- rm\ -f\ ./.TMPWORKDIR/abc-file.out\;\ sh\ -c\ rmdir\\\ ./.TMPWORKDIR/\\\ ./.parallel/tmp/\\\ ./.parallel/\\\ 2\\\>/dev/null\\\;rm\\\ -rf\\\ ./.TMPWORKDIR\\\;;ssh -l parallel lo -- rm -rf .TMPWORKDIR; exit $_EXIT_status; parallel --sqlandworker csv:////%2Ftmp%2Flog.csv seq ::: 10 ::: 12 13 14 cat /tmp/log.csv 99 @@ -1315,7 +1315,7 @@ If you pay 10000 EUR you should feel free to use GNU Parallel without citing. parallel --version GNU parallel VERSION -Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 +Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017 Ole Tange and Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. diff --git a/testsuite/wanted-results/sql01 b/testsuite/wanted-results/sql01 index 7aaf49f7..16b3c8ba 100644 --- a/testsuite/wanted-results/sql01 +++ b/testsuite/wanted-results/sql01 @@ -77,8 +77,8 @@ mysql: [Warning] Using a password on the command line interface can be insecure. Test if --debug works Yes it does ### Test --version -V - 12 74 500 - 12 74 500 + 13 74 535 + 13 74 535 ### Test -r dburl pg://nongood@127.0.0.3:2227/ databasedriver pg user nongood password host 127.0.0.3 port 2227 database nongood query diff --git a/testsuite/wanted-results/test13 b/testsuite/wanted-results/test13 index 1897691f..59eac057 100644 --- a/testsuite/wanted-results/test13 +++ b/testsuite/wanted-results/test13 @@ -41,6 +41,3 @@ parallel: sleep 3; echo 14 parallel: sleep 3; echo 15 parallel: sleep 3; echo 16 parallel: sleep 3; echo 9 -### Test bug: empty line for | sh with -k -a -b diff --git a/testsuite/wanted-results/test19 b/testsuite/wanted-results/test19 index 39d03ddd..8d78c930 100644 --- a/testsuite/wanted-results/test19 +++ b/testsuite/wanted-results/test19 @@ -77,7 +77,7 @@ OK Input for ssh -l parallel one-server -- mkdir -p ./. -l parallel one-server rsync --server -lDrRze.iLsfx . ./. --l parallel one-server -- exec perl -e @GNU_Parallel\=split/_/,\"use_IPC::Open3\;_use_MIME::Base64\"\;eval\"@GNU_Parallel\"\;\$SIG\{CHLD\}\=\"IGNORE\"\;my\$zip\=\(grep\{-x\$_\}\"/usr/local/bin/bzip2\"\)\[0\]\|\|\"bzip2\"\;open3\(\$in,\$out,\"\>\&STDERR\",\$zip,\"-dc\"\)\;if\(my\$perlpid\=fork\)\{close\$in\;\$eval\=join\"\",\<\$out\>\;close\$out\;\}else\{close\$out\;print\$in\(decode_base64\(join\"\",@ARGV\)\)\;close\$in\;exit\;\}wait\;eval\$eval\; base64 +-l parallel one-server -- exec perl -e @GNU_Parallel\=split/_/,\"use_IPC::Open3\;_use_MIME::Base64\"\;eval\"@GNU_Parallel\"\;\$chld\=\$SIG\{CHLD\}\;\$SIG\{CHLD\}\=\"IGNORE\"\;my\$zip\=\(grep\{-x\$_\}\"/usr/local/bin/bzip2\"\)\[0\]\|\|\"bzip2\"\;open3\(\$in,\$out,\"\>\&STDERR\",\$zip,\"-dc\"\)\;if\(my\$perlpid\=fork\)\{close\$in\;\$eval\=join\"\",\<\$out\>\;close\$out\;\}else\{close\$out\;print\$in\(decode_base64\(join\"\",@ARGV\)\)\;close\$in\;exit\;\}wait\;\$SIG\{CHLD\}\=\$chld\;eval\$eval\; base64 -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.' 'newlineX.out -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.' @@ -90,7 +90,7 @@ Input for ssh 'newlineX.out2; sh -c rmdir\ ./tmp/\ ./\ 2\>/dev/null\; -l parallel one-server -- mkdir -p ./. -l parallel one-server rsync --server -lDrRze.iLsfx . ./. --l parallel one-server -- exec perl -e @GNU_Parallel\=split/_/,\"use_IPC::Open3\;_use_MIME::Base64\"\;eval\"@GNU_Parallel\"\;\$SIG\{CHLD\}\=\"IGNORE\"\;my\$zip\=\(grep\{-x\$_\}\"/usr/local/bin/bzip2\"\)\[0\]\|\|\"bzip2\"\;open3\(\$in,\$out,\"\>\&STDERR\",\$zip,\"-dc\"\)\;if\(my\$perlpid\=fork\)\{close\$in\;\$eval\=join\"\",\<\$out\>\;close\$out\;\}else\{close\$out\;print\$in\(decode_base64\(join\"\",@ARGV\)\)\;close\$in\;exit\;\}wait\;eval\$eval\; base64 +-l parallel one-server -- exec perl -e @GNU_Parallel\=split/_/,\"use_IPC::Open3\;_use_MIME::Base64\"\;eval\"@GNU_Parallel\"\;\$chld\=\$SIG\{CHLD\}\;\$SIG\{CHLD\}\=\"IGNORE\"\;my\$zip\=\(grep\{-x\$_\}\"/usr/local/bin/bzip2\"\)\[0\]\|\|\"bzip2\"\;open3\(\$in,\$out,\"\>\&STDERR\",\$zip,\"-dc\"\)\;if\(my\$perlpid\=fork\)\{close\$in\;\$eval\=join\"\",\<\$out\>\;close\$out\;\}else\{close\$out\;print\$in\(decode_base64\(join\"\",@ARGV\)\)\;close\$in\;exit\;\}wait\;\$SIG\{CHLD\}\=\$chld\;eval\$eval\; base64 -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.' 'newlineX.out -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.' diff --git a/testsuite/wanted-results/test21 b/testsuite/wanted-results/test21 index 2f7a2873..a2ccd6f3 100644 --- a/testsuite/wanted-results/test21 +++ b/testsuite/wanted-results/test21 @@ -5,25 +5,25 @@ centos3.tange.dk hostname; echo 1 hostname; echo 1 -nlv +redhat9.tange.dk ### Test $PARALLEL - multi line 1 1 centos3.tange.dk hostname; echo 1 hostname; echo 1 -nlv +redhat9.tange.dk ### Test ~/.parallel/config - single line 1 1 centos3.tange.dk hostname; echo 1 hostname; echo 1 -nlv +redhat9.tange.dk ### Test ~/.parallel/config - multi line 1 1 centos3.tange.dk hostname; echo 1 hostname; echo 1 -nlv +redhat9.tange.dk diff --git a/testsuite/wanted-results/test46 b/testsuite/wanted-results/test46 index 359a01bd..e69de29b 100644 --- a/testsuite/wanted-results/test46 +++ b/testsuite/wanted-results/test46 @@ -1,8 +0,0 @@ -### Test --trc with space added in filename -original -### Test --trc with >|< added in filename -original -### Test --return with fixed string (Gave undef warnings) -OK -### bug #35427: quoting of {2} broken for --onall -/bin/ls diff --git a/testsuite/wanted-results/test61 b/testsuite/wanted-results/test61 index 6b591b66..d744cc3c 100644 --- a/testsuite/wanted-results/test61 +++ b/testsuite/wanted-results/test61 @@ -1,13 +1,13 @@ echo '### Test --return of weirdly named file' ### Test --return of weirdly named file -stdout parallel --return {} -vv -S parallel\@parallel-server3 echo '>'{} ::: 'aa<${#}" b' | perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z+=/\\0-9]{500,}:base64:i;'; rm 'aa<${#}" b' -ssh -l parallel one-server -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;eval\\\$eval\\\; base64;_EXIT_status=$?; mkdir -p ./. && rsync --protocol 30 --rsync-path=cd\ ././.\;\ rsync -rlDzR -essh\ -l\ parallel parallel-server3:./aa\\\<\\\$\\\{\\\#\\\}\\\"\\\ b ./.; exit $_EXIT_status; +stdout parallel --return {} -vv -S parallel\@parallel-server1 echo '>'{} ::: 'aa<${#}" b' | perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z+=/\\0-9]{500,}:base64:i;'; rm 'aa<${#}" b' +ssh -l parallel one-server -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$chld\\\=\\\$SIG\\\{CHLD\\\}\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\$chld\\\;eval\\\$eval\\\; base64;_EXIT_status=$?; mkdir -p ./. && rsync --protocol 30 --rsync-path=cd\ ././.\;\ rsync -rlDzR -essh\ -l\ parallel parallel-server1:./aa\\\<\\\$\\\{\\\#\\\}\\\"\\\ b ./.; exit $_EXIT_status; echo '### Test if remote login shell is csh' ### Test if remote login shell is csh stdout parallel -k -vv -S csh@localhost 'echo $PARALLEL_PID $PARALLEL_SEQ {}| wc -w' ::: a b c | perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z+=/\\0-9]{500,}:base64:i;' -ssh -l csh localhost -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;eval\\\$eval\\\; base64; +ssh -l csh localhost -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$chld\\\=\\\$SIG\\\{CHLD\\\}\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\$chld\\\;eval\\\$eval\\\; base64; 3 -ssh -l csh localhost -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;eval\\\$eval\\\; base64; +ssh -l csh localhost -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$chld\\\=\\\$SIG\\\{CHLD\\\}\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\$chld\\\;eval\\\$eval\\\; base64; 3 -ssh -l csh localhost -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;eval\\\$eval\\\; base64; +ssh -l csh localhost -- exec perl -e @GNU_Parallel\\\=split/_/,\\\"use_IPC::Open3\\\;_use_MIME::Base64\\\"\\\;eval\\\"@GNU_Parallel\\\"\\\;\\\$chld\\\=\\\$SIG\\\{CHLD\\\}\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\"IGNORE\\\"\\\;my\\\$zip\\\=\\\(grep\\\{-x\\\$_\\\}\\\"/usr/local/bin/bzip2\\\"\\\)\\\[0\\\]\\\|\\\|\\\"bzip2\\\"\\\;open3\\\(\\\$in,\\\$out,\\\"\\\>\\\&STDERR\\\",\\\$zip,\\\"-dc\\\"\\\)\\\;if\\\(my\\\$perlpid\\\=fork\\\)\\\{close\\\$in\\\;\\\$eval\\\=join\\\"\\\",\\\<\\\$out\\\>\\\;close\\\$out\\\;\\\}else\\\{close\\\$out\\\;print\\\$in\\\(decode_base64\\\(join\\\"\\\",@ARGV\\\)\\\)\\\;close\\\$in\\\;exit\\\;\\\}wait\\\;\\\$SIG\\\{CHLD\\\}\\\=\\\$chld\\\;eval\\\$eval\\\; base64; 3