From 8990c7bb42e965899b71ffb033e13f340b8a31db Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Mon, 16 Mar 2015 19:51:08 +0100 Subject: [PATCH] Fixed bug #44553: --rpl should replace the longest expression first. --- doc/release_new_version | 29 +++++++- src/parallel | 49 +++++++------ src/parallel_design.pod | 37 ++++++++++ src/parallel_tutorial.html | 21 ++++++ src/parallel_tutorial.pod | 22 ++++++ testsuite/tests-to-run/parallel-local-0.3s.sh | 7 ++ testsuite/tests-to-run/parallel-local-mem.sh | 25 ++++--- testsuite/tests-to-run/parallel-local-ssh4.sh | 26 +++---- testsuite/tests-to-run/parallel-local164.sh | 2 +- testsuite/wanted-results/parallel-local-0.3s | 10 +++ testsuite/wanted-results/parallel-local-mem | 34 +++++++--- testsuite/wanted-results/parallel-local-ssh4 | 16 ++--- testsuite/wanted-results/parallel-local164 | 2 +- testsuite/wanted-results/parallel-local22 | 2 +- testsuite/wanted-results/parallel-local7 | 68 +++++++++---------- testsuite/wanted-results/test15 | 2 +- testsuite/wanted-results/test19 | 12 ++-- 17 files changed, 258 insertions(+), 106 deletions(-) mode change 100644 => 100755 testsuite/tests-to-run/parallel-local-mem.sh diff --git a/doc/release_new_version b/doc/release_new_version index 76e1fa95..f2f75bf4 100644 --- a/doc/release_new_version +++ b/doc/release_new_version @@ -208,28 +208,51 @@ cc:Tim Cuthbertson , Ryoichiro Suzuki , Jesse Alama -Subject: GNU Parallel 20150322 ('') released +Subject: GNU Parallel 20150322 ('Hellwig') released -GNU Parallel 20150322 ('') has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/ +GNU Parallel 20150322 ('Hellwig') has been released. It is available for download at: http://ftp.gnu.org/gnu/parallel/ Haiku of the month: - <<>> + Stand up for your rights. + VMware does not comply. + Hellwig goes to court. + + (https://sfconservancy.org/linux-compliance/vmware-lawsuit-faq.html) New in this release: +* --number-of-cores respects 'taskset' on GNU/Linux. + +* --joblog --pipe gives the data send and received in the log. + +* GNU Parallel was tested to support 100 GB sized records in --pipe. A few bugs was fixed to support >2 GB records. It works, but is rather slow. + * GNU Parallel was cited in: RIG: Recalibration and Interrelation of genomic sequence data with the GATK http://www.g3journal.org/content/early/2015/02/13/g3.115.017012.full.pdf+html * GNU Parallel was cited in: MPI-blastn and NCBI-TaxCollector: Improving metagenomic analysis with high performance classification and wide taxonomic attachment http://www.worldscientific.com/doi/abs/10.1142/S0219720014500139?af=R& +* GNU Parallel was cited in: Recent evolution in Rattus norvegicus is shaped by declining effective population size http://biorxiv.org/content/biorxiv/early/2015/03/01/015818.full.pdf + +* GNU Parallel was cited in: Evidence for DCO+ as a probe of ionization in the warm disk surface http://arxiv.org/pdf/1503.02659.pdf + * GNU Parallel was used in: https://github.com/alexbyrnes/FCC-Political-Ads_The-Code * GNU Parallel was used in: https://github.com/martymac/fpart * GNU Parallel was used in: https://github.com/mehmattski/HybSeqPipeline + +taxator-tk http://algbio.cs.uni-duesseldorf.de/webapps/wa-download/ (check it) + * Using GNU Parallel on a Raspberry Pi cluster: http://www.dcglug.org.uk/cluster-progress/ +* Running scripts in parallel with GNU Parallel: http://code.jasonbhill.com/2015/03/ + +* Mahout: Parallelising the creation of DecisionTrees: http://www.markhneedham.com/blog/2012/12/27/mahout-parallelising-the-creation-of-decisiontrees/ + +* Parallel - Jobs in Skripten parallelisieren: https://slzm.de/blog/linux-tool-des-tages-parallel-jobs-in-skripten-parallelisieren/#more-612 + * Bug fixes and man page updates. GNU Parallel - For people who live life in the parallel lane. diff --git a/src/parallel b/src/parallel index f91bd630..a5639a64 100755 --- a/src/parallel +++ b/src/parallel @@ -1052,7 +1052,7 @@ sub parse_options { sub init_globals { # Defaults: - $Global::version = 20150307; + $Global::version = 20150308; $Global::progname = 'parallel'; $Global::infinity = 2**31; $Global::debug = 0; @@ -1585,7 +1585,7 @@ sub perl_quote_scalar { } sub unquote_printf { - # Convert \t \n \r \0 \000 + # Convert \t \n \r \000 \0 $_ = shift; s/\\t/\t/g; s/\\n/\n/g; @@ -3756,7 +3756,7 @@ sub memfree_recompute { my $script = memfreescript(); # TODO add sshlogin and backgrounding - $self->{'memfree'} = `$script`; + $self->{'memfree'} = qx{ $script }; #::debug("mem","New free:",$self->{'memfree'}," "); } @@ -3805,7 +3805,7 @@ sub memfree_recompute { for my $os (keys %script_of) { $perlscript .= 'if($^O eq "'.$os.'") { '.$script_of{$os}.'}'; } - $perlscript =~ s/[\t\n]/ /g; + $perlscript =~ s/[\t\n ]+/ /g; $perlscript = "perl -e " . ::shell_quote_scalar($perlscript); $script = $Global::envvar. " " .$perlscript; } @@ -5403,16 +5403,27 @@ sub slot { # syswrite may be interrupted by SIGHUP substr($buf,0,$bytes_written) = ""; } + # Something printed: Wait less next time + $sleep /= 2; } else { if(eof(IN) and not $writer_running) { # Writer dead: There will never be more to read => exit -e $unlink_file and unlink $unlink_file; exit; } - # Wait for something to happen on file handle IN - select(fileno(IN), undef, undef, undef); + # TODO This could probably be done more efficiently using select(2) + # Nothing read: Wait longer before next read + # Up to 30 milliseconds + $sleep = ($sleep < 30) ? ($sleep * 1.001 + 0.01) : ($sleep); + usleep($sleep); } } + + sub usleep { + # Sleep this many milliseconds. + my $secs = shift; + select(undef, undef, undef, $secs/1000); + } }; $cattail =~ s/#.*//mg; $cattail =~ s/\s+/ /g; @@ -6684,7 +6695,7 @@ sub print_dryrun_and_verbose { (undef, $tmuxsocket) = ::tmpfile(SUFFIX => ".tms"); $Global::unlink{$tmuxsocket} = 1; unlink $tmuxsocket; - ::status("See output with: $ENV{'TMUX'} -S $tmuxsocket attach -t p$$\n"); + ::status("See output with: $ENV{'TMUX'} -S $tmuxsocket attach\n"); } $tmux = $ENV{'TMUX'}." -S $tmuxsocket new-session -s p$$ -d 'sleep .2' >&/dev/null;" . $ENV{'TMUX'}." -S $tmuxsocket new-window -t p$$ -n $title"; @@ -6801,7 +6812,6 @@ sub print { # Skip --joblog, --dryrun, --verbose } else { if($opt::ungroup and $Global::joblog and defined $self->{'exitstatus'}) { -# if($Global::joblog and defined $self->{'exitstatus'}) { # Add to joblog when finished $self->print_joblog(); # Printing is only relevant for grouped/--line-buffer output. @@ -7659,7 +7669,6 @@ sub replaced { # This is actually a CommandLine-object, # but it looks nice to be able to say {= $job->slot() =} my $job = $self; - for my $word (@word) { # word = AB \257< perlexpr \257> CD \257< perlexpr \257> EF ::debug("replace", "Replacing in $word\n"); @@ -7758,7 +7767,10 @@ sub new { # to deal with: {={==} while(s{([^\257]*) \Q$Global::parensleft\E ([^\257]*?) \Q$Global::parensright\E } {$1\257<$2\257>}gx) {} - for my $rpl (keys %Global::rpl) { + for my $rpl (sort { length $b <=> length $a } keys %Global::rpl) { + # Replace long --rpl's before short ones, as a short may be a + # substring of a long: + # --rpl '% s/a/b/' --rpl '%% s/b/a/' # Replace the short hand string (--rpl) # with the {= perl expr =} # Avoid replacing inside existing {= perl expr =} @@ -7930,15 +7942,14 @@ sub get { my $cmd_line = shift @{$self->{'unget'}}; return ($cmd_line); } else { - my $cmd_line; - $cmd_line = CommandLine->new($self->seq(), - $self->{'command'}, - $self->{'arg_queue'}, - $self->{'context_replace'}, - $self->{'max_number_of_args'}, - $self->{'return_files'}, - $self->{'replacecount'}, - $self->{'len'}, + my $cmd_line = CommandLine->new($self->seq(), + $self->{'command'}, + $self->{'arg_queue'}, + $self->{'context_replace'}, + $self->{'max_number_of_args'}, + $self->{'return_files'}, + $self->{'replacecount'}, + $self->{'len'}, ); $cmd_line->populate(); ::debug("init","cmd_line->number_of_args ", diff --git a/src/parallel_design.pod b/src/parallel_design.pod index e6c73b5f..7d451f0f 100644 --- a/src/parallel_design.pod +++ b/src/parallel_design.pod @@ -270,6 +270,43 @@ B<--block-size> gives very poor performance; by exponentially increasing the block size performance will not suffer. +=head2 Convenience options --nice --basefile --transfer --return +--cleanup --tmux --group --compress --cat --fifo --workdir + +These are all convenience options that make it easier to do a +task. But more importantly: They are tested to work on corner cases, +too. Take B<--nice> as an example: + + nice parallel command ... + +will work just fine. But when run remotely, you need to move the nice +command so it is being run on the server: + + parallel --S server nice command ... + +And this will again work just fine, as long as you are running a +single command. When you are running a composed command you need nice +to apply to the whole command, and it gets harder still: + + parallel --S server --q nice bash -c 'command1 ...; command2 | command3' + +It is not impossible, but by using B<--nice> GNU B will do +the right thing for you. Similarly when transferring files: It starts +to get hard when the file names contain space, :, ‘, *, or other +special characters. + +To run the commands in a B session you basically just need to +quote the command. For simple commands that is easy, but when commands +contain special characters, it gets much harder to get right. + +B<--cat> and B<--fifo> are easy to do by hand, until you want to clean +up the tmpfile and keep the exit code of the command. + +The real killer comes when you try to combine several of these: Doing +that correctly for all corner cases is next to impossible to do by +hard. + + =head2 Shell shock The shell shock bug in B did not affect GNU B, but the diff --git a/src/parallel_tutorial.html b/src/parallel_tutorial.html index 6ea3c7d4..4fdffe0b 100644 --- a/src/parallel_tutorial.html +++ b/src/parallel_tutorial.html @@ -56,6 +56,7 @@
  • Number of simultaneous jobs
  • Interactivity
  • +
  • A terminal for every job
  • Timing
  • Progress
  • Termination
  • @@ -1072,6 +1073,18 @@
      parallel -X --tty vi ::: 1 2 3
    +

    A terminal for every job

    + +

    Using tmux GNU Parallel can start a terminal for every job run:

    + +
      seq 10 40 | parallel --tmux 'echo start {}; sleep {}; echo done {}'
    + +

    This will tell you to run something similar to:

    + +
      tmux -S /tmp/paroRLCx.tms attach
    + +

    Using normal tmux keystrokes (CTRL-b n or CTRL-b p) you can cycle between windows of the running jobs. When a job is finished it will pause for 10 seconds before closing the window.

    +

    Timing

    Some jobs do heavy I/O when they start. To avoid a thundering herd GNU Parallel can delay starting new jobs. --delay X will make sure there is at least X seconds between each start:

    @@ -1133,6 +1146,14 @@ Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete local:0/9/100%/1.1s +

    A progress bar can be shown with --bar:

    + +
      parallel --bar sleep ::: 1 3 2 2 1 3 3 2 1
    + +

    And a graphic bar can be shown with --bar and zenity:

    + +
      seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' 2> >(zenity --progress --auto-kill)
    +

    A logfile of the jobs completed so far can be generated with --joblog:

      parallel --joblog /tmp/log exit  ::: 1 2 3 0 
    diff --git a/src/parallel_tutorial.pod b/src/parallel_tutorial.pod
    index 0bdf1dc3..3bb6b941 100644
    --- a/src/parallel_tutorial.pod
    +++ b/src/parallel_tutorial.pod
    @@ -1007,6 +1007,20 @@ Or give multiple argument in one go to open multiple files:
     
       parallel -X --tty vi ::: 1 2 3
     
    +=head2 A terminal for every job
    +
    +Using tmux GNU Parallel can start a terminal for every job run:
    +
    +  seq 10 40 | parallel --tmux 'echo start {}; sleep {}; echo done {}'
    +
    +This will tell you to run something similar to:
    +
    +  tmux -S /tmp/paroRLCx.tms attach
    +
    +Using normal tmux keystrokes (CTRL-b n or CTRL-b p) you can cycle
    +between windows of the running jobs. When a job is finished it will
    +pause for 10 seconds before closing the window.
    +
     =head2 Timing
     
     Some jobs do heavy I/O when they start. To avoid a thundering herd GNU
    @@ -1074,6 +1088,14 @@ Output:
       Computer:jobs running/jobs completed/%of started jobs/Average seconds to complete
       local:0/9/100%/1.1s
     
    +A progress bar can be shown with --bar:
    +
    +  parallel --bar sleep ::: 1 3 2 2 1 3 3 2 1
    +
    +And a graphic bar can be shown with --bar and zenity:
    +
    +  seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' 2> >(zenity --progress --auto-kill)
    +
     A logfile of the jobs completed so far can be generated with --joblog:
     
       parallel --joblog /tmp/log exit  ::: 1 2 3 0 
    diff --git a/testsuite/tests-to-run/parallel-local-0.3s.sh b/testsuite/tests-to-run/parallel-local-0.3s.sh
    index b04db663..e2225628 100644
    --- a/testsuite/tests-to-run/parallel-local-0.3s.sh
    +++ b/testsuite/tests-to-run/parallel-local-0.3s.sh
    @@ -60,5 +60,12 @@ echo '### bug #43817: Some JP char cause problems in positional replacement stri
       parallel -Xj1 echo ::: '�<�>' '�<1 $_=2�>' 'ワ'
       parallel -Xj1 echo {1} ::: '�<�>' '�<1 $_=2�>' 'ワ'
     
    +echo '**'
    +
    +parallel --plus --rpl '%' 
    +  --rpl '%D $_=::shell_quote(::dirname($_));' --rpl '%B s:.*/::;s:\.[^/.]+$::;' --rpl '%E s:.*\.::' 
    +  'echo {}=%;echo %D={//};echo %B={/.};echo %E={+.};echo %D/%B.%E={}' ::: a.b/c.d/e.f
    +
    +echo '**'
     
     EOF
    diff --git a/testsuite/tests-to-run/parallel-local-mem.sh b/testsuite/tests-to-run/parallel-local-mem.sh
    old mode 100644
    new mode 100755
    index 60209096..99748832
    --- a/testsuite/tests-to-run/parallel-local-mem.sh
    +++ b/testsuite/tests-to-run/parallel-local-mem.sh
    @@ -1,32 +1,35 @@
     #!/bin/bash
     
    +make stopvm
    +
     # Jobs that eat more than 2 GB RAM
     cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj1 -k --joblog /tmp/jl-`basename $0` -L1
     echo '### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")'
     echo '### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf'
    -'
    +echo 'Eats 4 GB'
    +perl -e '$buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf."\n"'
    +
     echo 'Eats 2.5 GB'
    -  (yes "`echo {1..100}`" | head -c 2300M; echo ged) | 
    +  (yes "`seq 3000`" | head -c 2300M; echo ged) | 
       PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged md5sum
     echo 'Eats 2.5 GB'
    -  (yes "`echo {1..100}`" | head -c 2300M; echo ged) | 
    +  (yes "`seq 3000`" | head -c 2300M; echo ged) | 
       PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged cat | wc -c
     
     echo '**'
     
     echo '### bug #44358: 2 GB records cause problems for -N'
     echo '5 GB version: Eats 12.5 GB'
    -
    -  (yes "`echo {1..100}`" | head -c 5000000000; echo FOO; 
    -   yes "`echo {1..100}`" | head -c 3000000000; echo FOO; 
    -   yes "`echo {1..100}`" | head -c 1000000000;) | 
    +  (yes "`seq 3000`" | head -c 5000000000; echo FOO; 
    +   yes "`seq 3000`" | head -c 3000000000; echo FOO; 
    +   yes "`seq 3000`" | head -c 1000000000;) | 
        PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl 
        `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
     
     echo '2 GB version: eats 10 GB'
    -  (yes "`echo {1..100}`" | head -c 2300M; echo FOO; 
    -   yes "`echo {1..100}`" | head -c 2300M; echo FOO; 
    -   yes "`echo {1..100}`" | head -c 1000M;) | 
    +  (yes "`seq 3000`" | head -c 2300M; echo FOO; 
    +   yes "`seq 3000`" | head -c 2300M; echo FOO; 
    +   yes "`seq 3000`" | head -c 1000M;) | 
        PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl 
        `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
     
    @@ -37,3 +40,5 @@ echo '### -L >4GB'
        parallel --pipe  -L2 --block 1g -k LANG=c wc -c
     
     EOF
    +
    +make startvm
    \ No newline at end of file
    diff --git a/testsuite/tests-to-run/parallel-local-ssh4.sh b/testsuite/tests-to-run/parallel-local-ssh4.sh
    index b14afdc0..6e59ee2d 100644
    --- a/testsuite/tests-to-run/parallel-local-ssh4.sh
    +++ b/testsuite/tests-to-run/parallel-local-ssh4.sh
    @@ -29,12 +29,12 @@ echo '### Test tmux works on different shells'
       parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?
     
       export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; 
    -  ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status'; 
    -  ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status'; 
    -  ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?'; 
    -  ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?'; 
    -  ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status'; 
    -  ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status'
    +  stdout ssh zsh@lo      "$PARTMUX" 'true  ::: 1 2 3 4; echo $status' | grep -v 'See output'; 
    +  stdout ssh zsh@lo      "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'; 
    +  stdout ssh parallel@lo "$PARTMUX" 'true  ::: 1 2 3 4; echo $?'      | grep -v 'See output'; 
    +  stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?'      | grep -v 'See output'; 
    +  stdout ssh tcsh@lo     "$PARTMUX" 'true  ::: 1 2 3 4; echo $status' | grep -v 'See output'; 
    +  stdout ssh tcsh@lo     "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
     
     echo '### This fails - word too long'
       export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; 
    @@ -42,15 +42,15 @@ echo '### This fails - word too long'
       stdout ssh csh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
     
     echo '### works'
    -  parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    +  stdout parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | grep -v 'See output'
     
     echo '### These blocked due to length'
    -  parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111
    +  stdout parallel -Slo      --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Scsh@lo  --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Szsh@lo  --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Scsh@lo  --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 | grep -v 'See output'
     
     echo '### bug #43746: --transfer and --return of multiple inputs {1} and {2}'
     echo '### and:'
    diff --git a/testsuite/tests-to-run/parallel-local164.sh b/testsuite/tests-to-run/parallel-local164.sh
    index c8a8c434..6f039ae4 100644
    --- a/testsuite/tests-to-run/parallel-local164.sh
    +++ b/testsuite/tests-to-run/parallel-local164.sh
    @@ -144,7 +144,7 @@ echo '### Negative replacement strings'
       parallel --colsep ' ' echo '{-3}orrect' ::: "1 c 3 4"
     
     echo 'bug #38439: "open files" with --files --pipe blocks after a while'
    -  ulimit -n 20; yes |head -n 10M | parallel --pipe -k echo {#} of 20
    +  ulimit -n 20; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 20
     
     echo 'bug #34241: --pipe should not spawn unneeded processes - part 2'
       seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files wc >/dev/null; 
    diff --git a/testsuite/wanted-results/parallel-local-0.3s b/testsuite/wanted-results/parallel-local-0.3s
    index 0dd3d6ba..b64305aa 100644
    --- a/testsuite/wanted-results/parallel-local-0.3s
    +++ b/testsuite/wanted-results/parallel-local-0.3s
    @@ -80,3 +80,13 @@ echo '### bug #43817: Some JP char cause problems in positional replacement stri
     �<�> �<1 $_=2�> ワ
       parallel -Xj1 echo {1} ::: '�<�>' '�<1 $_=2�>' 'ワ'
     �<�>
    +echo '**'
    +**
    +parallel --plus --rpl '%'   --rpl '%D $_=::shell_quote(::dirname($_));' --rpl '%B s:.*/::;s:\.[^/.]+$::;' --rpl '%E s:.*\.::'   'echo {}=%;echo %D={//};echo %B={/.};echo %E={+.};echo %D/%B.%E={}' ::: a.b/c.d/e.f
    +a.b/c.d/e.f=a.b/c.d/e.f
    +a.b/c.d=a.b/c.d
    +e=e
    +f=f
    +a.b/c.d/e.f=a.b/c.d/e.f
    +echo '**'
    +**
    diff --git a/testsuite/wanted-results/parallel-local-mem b/testsuite/wanted-results/parallel-local-mem
    index fa80fe7c..7fd94bb6 100644
    --- a/testsuite/wanted-results/parallel-local-mem
    +++ b/testsuite/wanted-results/parallel-local-mem
    @@ -1,19 +1,24 @@
    +make[2]: Entering directory `/home/tange/privat/parallel/testsuite'
    +VBoxManage controlvm CentOS3-root:centos3 savestate
    +VBoxManage controlvm RedHat9-root:redhat9 savestate
    +VBoxManage controlvm OracleXE savestate
    +make[2]: Leaving directory `/home/tange/privat/parallel/testsuite'
     echo '### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")'
     ### Trouble reading a record > 2 GB for certain versions of Perl (substr($a,0,2G+1)="fails")
     echo '### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf'
     ### perl -e $buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf
    -'
    -/bin/bash: -c: line 0: unexpected EOF while looking for matching `''
    -/bin/bash: -c: line 1: syntax error: unexpected end of file
    -echo 'Eats 2.5 GB'
    +echo 'Eats 4 GB'
    +Eats 4 GB
    +perl -e '$buf=("x"x(2**31))."x"; substr($buf,0,2**31+1)=""; print length $buf."\n"'
    +1echo 'Eats 2.5 GB'
     Eats 2.5 GB
    -  (yes "`echo {1..100}`" | head -c 2300M; echo ged) |   PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged md5sum
    -131cbd7a7f1d19de3dabb379c716396b  -
    +  (yes "`seq 3000`" | head -c 2300M; echo ged) |   PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged md5sum
    +7be046296f6b0cde6049a11c116908ea  -
     68b329da9893e34099c7d8ad5cb9c940  -
     parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1
     echo 'Eats 2.5 GB'
     Eats 2.5 GB
    -  (yes "`echo {1..100}`" | head -c 2300M; echo ged) |   PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged cat | wc -c
    +  (yes "`seq 3000`" | head -c 2300M; echo ged) |   PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl `which parallel` -k --block 2G --pipe --recend ged cat | wc -c
     2411724804
     parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1
     echo '**'
    @@ -22,7 +27,7 @@ echo '### bug #44358: 2 GB records cause problems for -N'
     ### bug #44358: 2 GB records cause problems for -N
     echo '5 GB version: Eats 12.5 GB'
     5 GB version: Eats 12.5 GB
    -  (yes "`echo {1..100}`" | head -c 5000000000; echo FOO;    yes "`echo {1..100}`" | head -c 3000000000; echo FOO;    yes "`echo {1..100}`" | head -c 1000000000;) |    PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl    `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
    +  (yes "`seq 3000`" | head -c 5000000000; echo FOO;    yes "`seq 3000`" | head -c 3000000000; echo FOO;    yes "`seq 3000`" | head -c 1000000000;) |    PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl    `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
     8000000007
     1000000001
     parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001
    @@ -30,7 +35,7 @@ parallel: Warning: A record was longer than 1300000001. Increasing to --blocksiz
     parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647
     echo '2 GB version: eats 10 GB'
     2 GB version: eats 10 GB
    -  (yes "`echo {1..100}`" | head -c 2300M; echo FOO;    yes "`echo {1..100}`" | head -c 2300M; echo FOO;    yes "`echo {1..100}`" | head -c 1000M;) |    PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl    `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
    +  (yes "`seq 3000`" | head -c 2300M; echo FOO;    yes "`seq 3000`" | head -c 2300M; echo FOO;    yes "`seq 3000`" | head -c 1000M;) |    PERL5LIB=input-files/perl-v5.14.2/lib input-files/perl-v5.14.2/perl    `which parallel` --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
     4823449607
     1048576001
     parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001
    @@ -44,3 +49,14 @@ echo '### -L >4GB'
     parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001
     parallel: Warning: A record was longer than 1300000001. Increasing to --blocksize 1690000003
     parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647
    +make[2]: Entering directory `/home/tange/privat/parallel/testsuite'
    +# Make sure we can reach the virtual machines
    +sudo ifconfig wlan0:0 192.168.1.72
    +# If they are already running: Don't fail
    +VBoxManage startvm CentOS3-root:centos3 || VBoxManage controlvm CentOS3-root:centos3 resume || true
    +Waiting for VM "CentOS3-root:centos3" to power on...
    +VM "CentOS3-root:centos3" has been successfully started.
    +VBoxManage startvm RedHat9-root:redhat9 || VBoxManage controlvm RedHat9-root:redhat9 resume || true
    +Waiting for VM "RedHat9-root:redhat9" to power on...
    +VM "RedHat9-root:redhat9" has been successfully started.
    +make[2]: Leaving directory `/home/tange/privat/parallel/testsuite'
    diff --git a/testsuite/wanted-results/parallel-local-ssh4 b/testsuite/wanted-results/parallel-local-ssh4
    index d05f23cf..0658058d 100644
    --- a/testsuite/wanted-results/parallel-local-ssh4
    +++ b/testsuite/wanted-results/parallel-local-ssh4
    @@ -24,7 +24,7 @@ echo '### Test tmux works on different shells'
     0
       parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?
     4
    -  export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux ';   ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status';   ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status';   ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?';   ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?';   ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status';   ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status'
    +  export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux ';   stdout ssh zsh@lo      "$PARTMUX" 'true  ::: 1 2 3 4; echo $status' | grep -v 'See output';   stdout ssh zsh@lo      "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output';   stdout ssh parallel@lo "$PARTMUX" 'true  ::: 1 2 3 4; echo $?'      | grep -v 'See output';   stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?'      | grep -v 'See output';   stdout ssh tcsh@lo     "$PARTMUX" 'true  ::: 1 2 3 4; echo $status' | grep -v 'See output';   stdout ssh tcsh@lo     "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
     0
     4
     0
    @@ -46,16 +46,16 @@ Word too long.
     4
     echo '### works'
     ### works
    -  parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    +  stdout parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | grep -v 'See output'
     parallel: Error: Command line too long (402 >= 238) at input 0: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...
     echo '### These blocked due to length'
     ### These blocked due to length
    -  parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@
    -  parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111
    +  stdout parallel -Slo      --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Scsh@lo  --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Szsh@lo  --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'See output'
    +  stdout parallel -Scsh@lo  --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 | grep -v 'See output'
     echo '### bug #43746: --transfer and --return of multiple inputs {1} and {2}'
     ### bug #43746: --transfer and --return of multiple inputs {1} and {2}
     echo '### and:'
    diff --git a/testsuite/wanted-results/parallel-local164 b/testsuite/wanted-results/parallel-local164
    index b9e57c2d..dd7e8787 100644
    --- a/testsuite/wanted-results/parallel-local164
    +++ b/testsuite/wanted-results/parallel-local164
    @@ -322,7 +322,7 @@ correct
     correct
     echo 'bug #38439: "open files" with --files --pipe blocks after a while'
     bug #38439: "open files" with --files --pipe blocks after a while
    -  ulimit -n 20; yes |head -n 10M | parallel --pipe -k echo {#} of 20
    +  ulimit -n 20; yes "`seq 3000`" |head -c 20M | parallel --pipe -k echo {#} of 20
     1 of 20
     2 of 20
     3 of 20
    diff --git a/testsuite/wanted-results/parallel-local22 b/testsuite/wanted-results/parallel-local22
    index a41f6327..f438bdc7 100644
    --- a/testsuite/wanted-results/parallel-local22
    +++ b/testsuite/wanted-results/parallel-local22
    @@ -354,4 +354,4 @@ Send	Receive	Exitval
     echo '### --tmux test - check termination'
     ### --tmux test - check termination
       perl -e 'map {printf "$_%o%c\n",$_,$_}1..255' |     stdout parallel --tmux echo {} :::: - ::: a b |     perl -pe 's:tmp.par.*tms:tmp/parXXXXX.tms:; s/\d+/0/g'
    -See output with: tmux -S /tmp/parXXXXX.tms attach -t p0
    +See output with: tmux -S /tmp/parXXXXX.tms attach
    diff --git a/testsuite/wanted-results/parallel-local7 b/testsuite/wanted-results/parallel-local7
    index 89b4ef34..632a21f1 100644
    --- a/testsuite/wanted-results/parallel-local7
    +++ b/testsuite/wanted-results/parallel-local7
    @@ -1,67 +1,67 @@
     echo '### tmux1.9'
     ### tmux1.9
       seq 000 100 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 100 200 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 200 300 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 300 400 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 400 500 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 500 600 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 600 700 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 700 800 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 800 900 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 900 1000 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1000 1100 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1100 1200 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1200 1300 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1300 1400 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1400 1500 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1500 1600 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1600 1700 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1700 1800 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1800 1900 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 1900 2000 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
       seq 2000 2021 | TMUX=tmux1.9 par_tmux
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
     echo '### tmux1.9 fails'
     ### tmux1.9 fails
    @@ -71,24 +71,24 @@ parallel: Error: Command line too long (4053 >= 4052) at input 0: 2022
     echo '### tmux1.8'
     ### tmux1.8
       seq 1 50 | TMUX=tmux1.8 par_tmux
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
     0
       seq 51 100 | TMUX=tmux1.8 par_tmux
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
     0
       seq 101 150 | TMUX=tmux1.8 par_tmux
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
     0
       seq 151 200 | TMUX=tmux1.8 par_tmux
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
     0
       seq 201 233 | TMUX=tmux1.8 par_tmux
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
     0
     echo '### tmux1.8 fails'
     ### tmux1.8 fails
       echo 234 | TMUX=tmux1.8 par_tmux
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
     command too long
     1
       echo 235 | TMUX=tmux1.8 par_tmux
    @@ -100,25 +100,25 @@ parallel: Error: Command line too long (480 >= 477) at input 0: 236
     echo '### tmux1.8 0..255 ascii'
     ### tmux1.8 0..255 ascii
     perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' |    TMUX=tmux1.8 stdout parallel --tmux --timeout 3 echo | par_tmux_filter; echo $?
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
     0
     echo '### tmux1.9 0..255 ascii'
     ### tmux1.9 0..255 ascii
     perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' |    TMUX=tmux1.9 stdout parallel --tmux --timeout 3 echo | par_tmux_filter; echo $?
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
     0
     echo '### Test output ascii'
     ### Test output ascii
       rm -f /tmp/paralocal7*;   perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_!=10 } 1..$_),"\n" } 1..255' | stdout parallel --tmux echo {}'>>/tmp/paralocal7{%}' | par_tmux_filter;   sort /tmp/paralocal7* | md5sum
    -See output with: tmux -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux -S /tmp/parXXXXX.tms attach
     a7ee232967c8aab2edf227169e8cdce0  -
     echo '### Test critical lengths. Must not block'
     ### Test critical lengths. Must not block
       seq 70 130  | TMUX=tmux1.8 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
       seq 70 130  | TMUX=tmux1.9 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
       seq 280 425 | TMUX=tmux1.8 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter
    -See output with: tmux1.8 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.8 -S /tmp/parXXXXX.tms attach
       seq 280 425 | TMUX=tmux1.9 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter
    -See output with: tmux1.9 -S /tmp/parXXXXX.tms attach -tpID
    +See output with: tmux1.9 -S /tmp/parXXXXX.tms attach
    diff --git a/testsuite/wanted-results/test15 b/testsuite/wanted-results/test15
    index cafa046e..90b40bb1 100644
    --- a/testsuite/wanted-results/test15
    +++ b/testsuite/wanted-results/test15
    @@ -844,7 +844,7 @@ a b
     echo '### Test --nice remote'
     ### Test --nice remote
     stdout parallel --nice 1 -S .. -vv 'PAR=a bash -c "echo  \$PAR {}"' ::: b |   perl -pe 's/\S*parallel-server\S*/one-server/;s/[a-f0-9]{500,}/hex/;s/\d{5,8}/pId/g;'
    -ssh one-server exec perl\ -e\ \\\$ENV\\\{\\\"PARALLEL_PID\\\"\\\}=\\\"pId\\\"\\\;\\\$ENV\\\{\\\"PARALLEL_SEQ\\\"\\\}=\\\"1\\\"\\\;\\\$bashfunc\\\ =\\\ \\\"\\\"\\\;@ARGV=\\\"\\\\\\\\nice\\\ -n1\\\ /bin/bash\\\ -c\\\ PAR=a\\\\\\\\\\\ bash\\\\\\\\\\\ -c\\\\\\\\\\\ \\\\\\\\\\\\\\\"echo\\\\\\\\\\\ \\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$PAR\\\\\\\\\\\ b\\\\\\\\\\\\\\\"\\\"\\\;\\\$SIG\\\{CHLD\\\}=sub\\\{\\\$done=1\\\;\\\}\\\;\\\$pid=fork\\\;unless\\\(\\\$pid\\\)\\\{setpgrp\\\;exec\\\$ENV\\\{SHELL\\\},\\\"-c\\\",\\\(\\\$bashfunc.\\\"@ARGV\\\"\\\)\\\;die\\\"exec:\\\$\\\!\\\\n\\\"\\\;\\\}do\\\{\\\$s=\\\$s\\\<1\\\?0.001+\\\$s\\\*1.03:\\\$s\\\;select\\\(undef,undef,undef,\\\$s\\\)\\\;\\\}until\\\(\\\$done\\\|\\\|getppid==1\\\)\\\;kill\\\(SIGHUP,-\\\$\\\{pid\\\}\\\)unless\\\$done\\\;wait\\\;exit\\\(\\\$\\\?\\\&127\\\?128+\\\(\\\$\\\?\\\&127\\\):1+\\\$\\\?\\\>\\\>8\\\);
    +ssh one-server exec perl\ -e\ \\\$ENV\\\{\\\"PARALLEL_PID\\\"\\\}=\\\"pId\\\"\\\;\\\$ENV\\\{\\\"PARALLEL_SEQ\\\"\\\}=\\\"1\\\"\\\;\\\$bashfunc\\\ =\\\ \\\"\\\"\\\;@ARGV=\\\"\\\\\\\\nice\\\ -n1\\\ \\\\\\\$SHELL\\\ -c\\\ PAR=a\\\\\\\\\\\ bash\\\\\\\\\\\ -c\\\\\\\\\\\ \\\\\\\\\\\\\\\"echo\\\\\\\\\\\ \\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$PAR\\\\\\\\\\\ b\\\\\\\\\\\\\\\"\\\"\\\;\\\$SIG\\\{CHLD\\\}=sub\\\{\\\$done=1\\\;\\\}\\\;\\\$pid=fork\\\;unless\\\(\\\$pid\\\)\\\{setpgrp\\\;exec\\\$ENV\\\{SHELL\\\},\\\"-c\\\",\\\(\\\$bashfunc.\\\"@ARGV\\\"\\\)\\\;die\\\"exec:\\\$\\\!\\\\n\\\"\\\;\\\}do\\\{\\\$s=\\\$s\\\<1\\\?0.001+\\\$s\\\*1.03:\\\$s\\\;select\\\(undef,undef,undef,\\\$s\\\)\\\;\\\}until\\\(\\\$done\\\|\\\|getppid==1\\\)\\\;kill\\\(SIGHUP,-\\\$\\\{pid\\\}\\\)unless\\\$done\\\;wait\\\;exit\\\(\\\$\\\?\\\&127\\\?128+\\\(\\\$\\\?\\\&127\\\):1+\\\$\\\?\\\>\\\>8\\\);
     a b
     echo '### Test distribute arguments at EOF to 2 jobslots'
     ### Test distribute arguments at EOF to 2 jobslots
    diff --git a/testsuite/wanted-results/test19 b/testsuite/wanted-results/test19
    index ebd4529e..22a20ca5 100644
    --- a/testsuite/wanted-results/test19
    +++ b/testsuite/wanted-results/test19
    @@ -83,11 +83,11 @@ one-server exec perl -e '@GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64"
     -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.'
     'newlineX.out2
     one-server (rm -f ./tmp/parallel.file.'
    -'newlineX; rmdir ./tmp/ ./ 2>/dev/null;)
    +'newlineX; rmdir ./tmp/ ./ >&/dev/null;)
     one-server (rm -f ./tmp/parallel.file.'
    -'newlineX.out; rmdir ./tmp/ ./ 2>/dev/null;)
    +'newlineX.out; rmdir ./tmp/ ./ >&/dev/null;)
     one-server (rm -f ./tmp/parallel.file.'
    -'newlineX.out2; rmdir ./tmp/ ./ 2>/dev/null;)
    +'newlineX.out2; rmdir ./tmp/ ./ >&/dev/null;)
     one-server mkdir -p ./.
     -l parallel one-server rsync --server -lDrRze.iLsfx . ./.
     one-server exec perl -e '@GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64");eval"@GNU_Parallel";$SIG{CHLD}="IGNORE";my$zip=(grep{-x$_}"/usr/local/bin/bzip2")[0]||"bzip2";my($in,$out,$eval);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
    @@ -96,8 +96,8 @@ one-server exec perl -e '@GNU_Parallel=("use","IPC::Open3;","use","MIME::Base64"
     -l parallel one-server cd ././tmp; rsync --server --sender -lDrRze.iLsfx . ./parallel.file.'
     'newlineX.out2
     one-server (rm -f ./tmp/parallel.file.'
    -'newlineX; rmdir ./tmp/ ./ 2>/dev/null;)
    +'newlineX; rmdir ./tmp/ ./ >&/dev/null;)
     one-server (rm -f ./tmp/parallel.file.'
    -'newlineX.out; rmdir ./tmp/ ./ 2>/dev/null;)
    +'newlineX.out; rmdir ./tmp/ ./ >&/dev/null;)
     one-server (rm -f ./tmp/parallel.file.'
    -'newlineX.out2; rmdir ./tmp/ ./ 2>/dev/null;)
    +'newlineX.out2; rmdir ./tmp/ ./ >&/dev/null;)