parallel: bug #54647: parset ignores empty lines.

parallel: minix is working again.
parallel: bug #54128: command too long when exporting big env
testsuite: polarhome parallelized.
This commit is contained in:
Ole Tange 2018-09-21 00:15:14 +02:00
parent 24de94187a
commit 36a8238a20
44 changed files with 792 additions and 439 deletions

View file

@ -206,7 +206,7 @@ to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20180922 ('Myanmar/Jacksonville/Chemnitz') released <<[stable]>>
Subject: GNU Parallel 20180922 ('Danske/Korea/India/Myanmar/Jacksonville/Chemnitz') released <<[stable]>>
GNU Parallel 20180922 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
@ -219,7 +219,10 @@ Quote of the month:
New in this release:
*
* Updated graph showing GNU Parallel's overhead per job for each version. https://www.gnu.org/software/parallel/process-time-j2-1700MHz-3000-1000.pdf
http://carc.unm.edu/education--training/workshops-and-seminars.html
<<Citation not OK: BAMClipper: removing primers from alignments to minimize false-negative mutations in amplicon next-generation sequencing https://www.nature.com/articles/s41598-017-01703-6>>

View file

@ -7,7 +7,7 @@
# after which 'env_parallel' works
#
#
# Copyright (C) 2016,2017,2018
# Copyright (C) 2016-2018
# Ole Tange and Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify

View file

@ -7,7 +7,7 @@
# after which 'env_parallel' works
#
#
# Copyright (C) 2016,2017,2018
# Copyright (C) 2016-2018
# Ole Tange and Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify

View file

@ -7,7 +7,7 @@
# after which 'env_parallel' works
#
#
# Copyright (C) 2016,2017,2018
# Copyright (C) 2016-2018
# Ole Tange and Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
@ -181,12 +181,12 @@ env_parallel() {
# type returns:
# ll is an alias for ls -l (in ash)
# bash is a tracked alias for /bin/bash
# true is a shell builtin
# true is a shell builtin (in bash)
# myfunc is a function (in bash)
# myfunc is a shell function (in zsh)
# which is /usr/bin/which
# which is /usr/bin/which (in sh, bash)
# which is hashed (/usr/bin/which)
# aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
# gi is aliased to `grep -i' (in bash)
# Return 0 if found, 1 otherwise
LANG=C type "$@" |
perl -pe '$exit += (s/ is an alias for .*// ||

View file

@ -7,7 +7,7 @@
# after which 'env_parallel' works
#
#
# Copyright (C) 2016,2017,2018
# Copyright (C) 2016-2018
# Ole Tange and Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify

View file

@ -1,7 +1,6 @@
#!/usr/bin/env perl
# Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,
# 2017,2018 Ole Tange and Free Software Foundation, Inc.
# Copyright (C) 2007-2018 Ole Tange and Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -1555,7 +1554,7 @@ sub check_invalid_option_combinations {
sub init_globals {
# Defaults:
$Global::version = 20180824;
$Global::version = 20180916;
$Global::progname = 'parallel';
$Global::infinity = 2**31;
$Global::debug = 0;
@ -3257,19 +3256,8 @@ sub get_job_with_sshlogin {
return undef;
}
}
my $clean_command = $job->replaced();
if($clean_command =~ /^\s*$/) {
# Do not run empty lines
if(not $Global::JobQueue->empty()) {
return get_job_with_sshlogin($sshlogin);
} else {
return undef;
}
}
$job->set_sshlogin($sshlogin);
if($opt::retries and $clean_command and
$job->failed_here()) {
if($opt::retries and $job->failed_here()) {
# This command with these args failed for this sshlogin
my ($no_of_failed_sshlogins,$min_failures) = $job->min_failed();
# Only look at the Global::host that have > 0 jobslots
@ -4366,17 +4354,17 @@ sub die_bug {
sub version {
# Returns: N/A
print join("\n",
"GNU $Global::progname $Global::version",
"Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018",
"Ole Tange and Free Software Foundation, Inc.",
"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>",
"This is free software: you are free to change and redistribute it.",
"GNU $Global::progname comes with no warranty.",
"",
"Web site: http://www.gnu.org/software/${Global::progname}\n",
"When using programs that use GNU Parallel to process data for publication",
"please cite as described in 'parallel --citation'.\n",
print join
("\n",
"GNU $Global::progname $Global::version",
"Copyright (C) 2007-2018 Ole Tange and Free Software Foundation, Inc.",
"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>",
"This is free software: you are free to change and redistribute it.",
"GNU $Global::progname comes with no warranty.",
"",
"Web site: http://www.gnu.org/software/${Global::progname}\n",
"When using programs that use GNU Parallel to process data for publication",
"please cite as described in 'parallel --citation'.\n",
);
}
@ -4489,8 +4477,8 @@ sub embed {
}
print "#!$Global::shell
# Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,
# 2017,2018 $user, Ole Tange and Free Software Foundation, Inc.
# Copyright (C) 2007-2018 $user, Ole Tange and Free Software
# Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -5022,9 +5010,10 @@ sub which {
# Filter for SysV-style `ps`
my $sysv = q( ps -ef | perl -ane '1..1 and /^(.*)CO?MM?A?N?D/ and $s=length $1;).
q(s/^.{$s}//; print "@F[1,2] $_"' );
# Crazy msys: ' is not accepted on the cmd line, but " are treated as '
my $msys = q( ps -ef | perl -ane "1..1 and /^(.*)CO?MM?A?N?D/ and $s=length $1;).
q(s/^.{$s}//; print qq{@F[1,2] $_}" );
# Minix uses cols 2,3 and can have newlines in the command
# so lines not having numbers in cols 2,3 must be ignored
my $minix = q( ps -ef | perl -ane '1..1 and /^(.*)CO?MM?A?N?D/ and $s=length $1;).
q(s/^.{$s}// and $F[2]>0 and $F[3]>0 and print "@F[2,3] $_"' );
# BSD-style `ps`
my $bsd = q(ps -o pid,ppid,command -ax);
%pid_parentpid_cmd =
@ -5040,7 +5029,8 @@ sub which {
'hpux' => $sysv,
'linux' => $sysv,
'mirbsd' => $bsd,
'msys' => $msys,
'minix' => $minix,
'msys' => $sysv,
'MSWin32' => $sysv,
'netbsd' => $bsd,
'nto' => $sysv,
@ -5639,7 +5629,8 @@ sub swap_activity {
# Should we update the swap_activity file?
my $update_swap_activity_file = 0;
if(-r $self->{'swap_activity_file'}) {
open(my $swap_fh, "<", $self->{'swap_activity_file'}) || ::die_bug("swap_activity_file-r");
open(my $swap_fh, "<", $self->{'swap_activity_file'}) ||
::die_bug("swap_activity_file-r");
my $swap_out = <$swap_fh>;
close $swap_fh;
if($swap_out =~ /^(\d+)$/) {
@ -6170,6 +6161,8 @@ sub compute_number_of_processes {
return 0;
} else {
$job = $Global::JobQueue->get();
# Replacement must happen here due to seq()
$job and $job->replaced();
push(@jobs, $job);
return 1;
}
@ -9954,6 +9947,10 @@ sub len {
$self->{'replacecount'}{$replstring};
}
}
if(defined $Global::parallel_env) {
# If we are using --env, add the prefix for that, too.
$len += length $Global::parallel_env;
}
if($Global::quoting) {
# Pessimistic length if -q is set
# Worse than worst case: every char needs to be quoted with \
@ -9964,8 +9961,12 @@ sub len {
# Worse than worst case: every char needs to be quoted with \ twice
$len *= 4;
}
# If we are using --env, add the prefix for that, too.
$len += 0;
if(@opt::sshlogin) {
# Pessimistic length if remote
# Worst case is BASE64 encoding 3 bytes -> 4 bytes
$len = int($len*4/3);
}
return $len;
}
@ -10513,14 +10514,9 @@ sub get {
"(e.g. 'cat').");
::wait_and_exit(255);
}
} else {
if($cmd_line->number_of_args() == 0) {
# We did not get more args - maybe at EOF string?
return undef;
} elsif($cmd_line->replaced() eq "") {
# Empty command - get the next instead
return $self->get();
}
} elsif($cmd_line->number_of_args() == 0) {
# We did not get more args - maybe at EOF string?
return undef;
}
$self->set_seq($self->seq()+1);
return $cmd_line;

View file

@ -624,17 +624,20 @@ special characters:
echo "The Cure" > My\ brother\'s\ 12\"\ records
ls | \
map 'echo -n `gzip < "%" | wc -c`; echo -n '*100/'; wc -c < "%"' | bc
map 'echo -n `gzip < "%" | wc -c`; echo -n '*100/'; wc -c < "%"' |
bc
It works with GNU B<parallel>:
ls | \
parallel 'echo -n `gzip < {} | wc -c`; echo -n '*100/'; wc -c < {}' | bc
parallel \
'echo -n `gzip < {} | wc -c`; echo -n '*100/'; wc -c < {}' | bc
And you can even get the file name prepended:
ls | \
parallel --tag '(echo -n `gzip < {} | wc -c`'*100/'; wc -c < {}) | bc'
parallel --tag \
'(echo -n `gzip < {} | wc -c`'*100/'; wc -c < {}) | bc'
B<map> has no support for grouping. So this gives the wrong results
without any warnings:
@ -655,23 +658,22 @@ completely for certain jobs (and may even be considered less readable):
parallel echo -n {} ::: 1 2 3
map -p 4 'echo -n % 2>&1 | sed -e "s/^/$$:/"' 1 2 3 | sort | cut -f2- -d:
map -p 4 'echo -n % 2>&1 | sed -e "s/^/$$:/"' 1 2 3 | \
sort | cut -f2- -d:
B<map>s replacement strings (% %D %B %E) can be simulated in GNU
B<parallel> by putting this in B<~/.parallel/config>:
--rpl '%'
--rpl '%D $_=::shell_quote(::dirname($_));'
--rpl '%D $_=Q(::dirname($_));'
--rpl '%B s:.*/::;s:\.[^/.]+$::;'
--rpl '%E s:.*\.::'
B<map> cannot handle bundled options: B<map -vp 0 echo this fails>
B<map> does not have an argument separator on the command line, but
uses the first argument as command. This makes quoting harder which again
may affect readability. Compare:
map -p 2 perl\\\ -ne\\\ \\\'/^\\\\S+\\\\s+\\\\S+\\\$/\\\ and\\\ print\\\ \\\$ARGV,\\\"\\\\n\\\"\\\' *
map -p 2 'perl -ne '"'"'/^\S+\s+\S+$/ and print $ARGV,"\n"'"'" *
parallel -q perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' ::: *
@ -680,16 +682,11 @@ context replace:
parallel --xargs echo 'BEGIN{'{}'}END' ::: 1 2 3
B<map> does not set exit value according to whether one of the jobs
failed:
parallel false ::: 1 || echo Job failed
map false 1 || echo Never run
map "echo 'BEGIN{'%'}END'" 1 2 3
B<map> requires Perl v5.10.0 making it harder to use on old systems.
B<map> has no way of using % in the command (GNU Parallel has -I to
B<map> has no way of using % in the command (GNU B<parallel> has -I to
specify another replacement string than B<{}>).
By design B<map> is option incompatible with B<xargs>, it does not
@ -710,18 +707,21 @@ B<ladon> only works on files and the only way to specify files is
using a quoted glob string (such as \*.jpg). It is not possible to
list the files manually.
As replacement strings it uses FULLPATH DIRNAME BASENAME EXT RELDIR RELPATH
As replacement strings it uses FULLPATH DIRNAME BASENAME EXT RELDIR
RELPATH
These can be simulated using GNU B<parallel> by putting this in B<~/.parallel/config>:
These can be simulated using GNU B<parallel> by putting this in
B<~/.parallel/config>:
--rpl 'FULLPATH $_=::shell_quote($_);chomp($_=qx{readlink -f $_});'
--rpl 'DIRNAME $_=::shell_quote(::dirname($_));chomp($_=qx{readlink -f $_});'
--rpl 'FULLPATH $_=Q($_);chomp($_=qx{readlink -f $_});'
--rpl 'DIRNAME $_=Q(::dirname($_));chomp($_=qx{readlink -f $_});'
--rpl 'BASENAME s:.*/::;s:\.[^/.]+$::;'
--rpl 'EXT s:.*\.::'
--rpl 'RELDIR $_=::shell_quote($_);chomp(($_,$c)=qx{readlink -f $_;pwd});s:\Q$c/\E::;$_=::dirname($_);'
--rpl 'RELPATH $_=::shell_quote($_);chomp(($_,$c)=qx{readlink -f $_;pwd});s:\Q$c/\E::;'
--rpl 'RELDIR $_=Q($_);chomp(($_,$c)=qx{readlink -f $_;pwd});s:\Q$c/\E::;$_=::dirname($_);'
--rpl 'RELPATH $_=Q($_);chomp(($_,$c)=qx{readlink -f $_;pwd});s:\Q$c/\E::;'
B<ladon> deals badly with filenames containing " and newline, and it fails for output larger than 200k:
B<ladon> deals badly with filenames containing " and newline, and it
fails for output larger than 200k:
ladon '*' -- seq 36000 | wc
@ -755,17 +755,23 @@ B<jobflow> can run multiple jobs in parallel.
Just like B<xargs> output from B<jobflow> jobs running in parallel mix
together by default. B<jobflow> can buffer into files (placed in
/run/shm), but these are not cleaned up - not even if B<jobflow> dies
unexpectedly. If the total output is big (in the order of RAM+swap)
it can cause the system to run out of memory.
/run/shm), but these are not cleaned up if B<jobflow> dies
unexpectedly (e.g. by Ctrl-C). If the total output is big (in the
order of RAM+swap) it can cause the system to slow to a crawl and
eventually run out of memory.
B<jobflow> gives no error if the command is unknown, and like B<xargs>
redirection requires wrapping with B<bash -c>.
redirection and composed commands require wrapping with B<bash -c>.
Input lines can at most be 4096 bytes. You can at most have 16 {}'s in
the command template. More than that either crashes the program or
simple does not execute the command.
B<jobflow> has no equivalent for B<--pipe>, or B<--sshlogin>.
B<jobflow> makes it possible to set resource limits on the running
jobs. This can be emulated by GNU B<parallel> using B<bash>'s B<ulimit>:
jobflow -limits=mem=100M,cpu=3,fsize=20M,nofiles=300 myjob
parallel 'ulimit -v 102400 -t 3 -f 204800 -n 300 myjob'
@ -832,7 +838,7 @@ setting SSHPASS and by using B<--ssh "sshpass ssh">.
To make the emulation easier, make a simple alias:
alias par_emul="parallel -j0 --ssh 'sshpass ssh' --nonall --tag --linebuffer"
alias par_emul="parallel -j0 --ssh 'sshpass ssh' --nonall --tag --lb"
If you want to supply a password run:
@ -850,8 +856,10 @@ If the above is set up you can then do:
orgalorg -o frontend1 -o frontend2 -p -C top -bid 1
par_emul -S frontend1 -S frontend2 top -bid 1
orgalorg -o frontend1 -o frontend2 -p -er /tmp -n 'md5sum /tmp/bigfile' -S bigfile
par_emul -S frontend1 -S frontend2 --basefile bigfile --workdir /tmp md5sum /tmp/bigfile
orgalorg -o frontend1 -o frontend2 -p -er /tmp -n \
'md5sum /tmp/bigfile' -S bigfile
par_emul -S frontend1 -S frontend2 --basefile bigfile --workdir /tmp \
md5sum /tmp/bigfile
B<orgalorg> has a progress indicator for the transferring of a
file. GNU B<parallel> does not.
@ -865,8 +873,6 @@ Rust parallel focuses on speed. It is almost as fast as B<xargs>. It
implements a few features from GNU B<parallel>, but lacks many
functions. All these fail:
# Show what would be executed
parallel --dry-run echo ::: a
# Read arguments from file
parallel -a file echo
# Changing the delimiter
@ -874,8 +880,6 @@ functions. All these fail:
These do something different from GNU B<parallel>
# Read more arguments at a time -n
parallel -n 2 echo ::: 1 a 2 b
# -q to protect quoted $ and space
parallel -q perl -e '$a=shift; print "$a"x10000000' ::: a b c
# Generation of combination of inputs
@ -885,7 +889,7 @@ These do something different from GNU B<parallel>
# --pipe
seq 100000 | parallel --pipe wc
# linked arguments
parallel echo ::: S M L :::+ small medium large ::: R G B :::+ red green blue
parallel echo ::: S M L :::+ sml med lrg ::: R G B :::+ red grn blu
# Run different shell dialects
zsh -c 'parallel echo \={} ::: zsh && true'
csh -c 'parallel echo \$\{\} ::: shell && true'
@ -903,6 +907,14 @@ will fail. A malicious user can setup the right permissions and
symlink the output file to one of the user's files and next time the
user uses Rust parallel it will overwrite this file.
attacker$ mkdir /tmp/parallel
attacker$ chmod a+rwX /tmp/parallel
# Symlink to the file the attacker wants to zero out
attacker$ ln -s ~victim/.important-file /tmp/parallel/stderr_1
victim$ seq 1000 | parallel echo
# This file is now overwritten with stderr from 'echo'
victim$ cat ~victim/.important-file
If /tmp/parallel runs full during the run, Rust parallel does not
report this, but finishes with success - thereby risking data loss.
@ -1286,7 +1298,8 @@ E.g.
With GNU B<parallel> this can be emulated by:
echo foosuffix | parallel --plus 'p={%suffix}; echo ${p}_new_suffix'
echo foosuffix |
parallel --plus 'p={%suffix}; echo ${p}_new_suffix'
Opposite B<rush> GNU B<parallel> works fine if the input contains
double space, ' and ":
@ -1501,9 +1514,9 @@ https://github.com/soveran/map
=head2 Todo
Url for map, spread
Url for spread
machma. Requires Go >= 1.7.
https://github.com/fd0/machma Requires Go >= 1.7.
https://github.com/k-bx/par requires Haskell to work. This limits the
number of platforms this can work on.
@ -1518,6 +1531,8 @@ https://github.com/Julian/Verge
https://github.com/amattn/paral
https://github.com/mmstick/concurr
pyargs
@ -1559,7 +1574,8 @@ This test stresses whether output mixes.
chmod +x mycommand
# Run 30 jobs in parallel
seq 30 | $paralleltool ./mycommand > >(tr -s abcdef) 2> >(tr -s abcdef >&2)
seq 30 |
$paralleltool ./mycommand > >(tr -s abcdef) 2> >(tr -s abcdef >&2)
# 'a c e' and 'b d f' should always stay together
# and there should only be a single line per job
@ -1673,6 +1689,18 @@ Some tools can only insert the argument once.
echo bar | $paralleltool echo {} foo {}
=head2 INPUTSIZE: Length of input should not be limited
Some tools limit the length of the input lines artificially with no good
reason. GNU B<parallel> does not:
perl -e 'print "foo."."x"x100_000_000' | parallel echo {.}
GNU B<parallel> limits the command to run to 128 KB due to execve(1):
perl -e 'print "x"x131_000' | parallel echo {} | wc
=head2 NUMWORDS: Speed depends on number of words
Some tools become very slow if output lines have many words.
@ -1705,10 +1733,10 @@ If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
Copyright (C) 2008,2009,2010 Ole Tange, http://ole.tange.dk
Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange,
http://ole.tange.dk and Free Software Foundation, Inc.
Copyright (C) 2010-2018 Ole Tange, http://ole.tange.dk and Free
Software Foundation, Inc.
Parts of the manual concerning B<xargs> compatibility is inspired by
the manual of B<xargs> from GNU findutils 4.4.2.
@ -1716,8 +1744,7 @@ the manual of B<xargs> from GNU findutils 4.4.2.
=head1 LICENSE
Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018
Free Software Foundation, Inc.
Copyright (C) 2007-2018 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View file

@ -7,7 +7,7 @@ testsuite: 3
make stopvm
1: ../src/parallel tests-to-run/* wanted-results/* prereqlocal startdb prereqremote
TRIES=1 time bash Start.sh '' 'mem|polarhome|tutorial' || true
TRIES=1 time bash Start.sh '' '100s|mem|polarhome|tutorial' || true
touch ~/.parallel/will-cite
make stopvm

View file

@ -21,7 +21,7 @@ freepl >/dev/null &
# niceload -q -l 5 perl -e '$a=join"",<>; while(1){push @a,$a}' &
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### --rm and --runmem'
niceload -H --rm 1g free -g | perl -ane '/Mem:/ and print $F[5],"\n"' | grep '[1-9]' >/dev/null && echo OK--rm
niceload -H --runmem 1g free -g | perl -ane '/Mem:/ and print $F[5],"\n"' | grep '[1-9]' >/dev/null && echo OK--runmem

View file

@ -10,7 +10,7 @@ int() {
}
export -f int
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
# The seq 30000000 should take > 1 cpu sec to run.
echo '### --soft -f and test if child is actually suspended and thus takes longer'
niceload --soft -f 0.5 'seq 30000000 | nice wc;echo This should finish last' &

View file

@ -79,7 +79,7 @@ par_load() {
echo '### Test --load (must give 1=true)'
parallel -j0 -N0 --timeout 5 --nice 10 'bzip2 < /dev/zero >/dev/null' ::: 1 2 3 4 5 6 &
parallel --argsep ,, --joblog - -N0 parallel --load 100% echo ::: 1 ,, 1 |
parallel --colsep '\t' --header : echo '{=4 $_=$_>5=}'
parallel -k --colsep '\t' --header : echo '{=4 $_=$_>5=}'
}
par_env_parallel() {

View file

@ -27,7 +27,7 @@ export -f stdsort
# Test amount of parallelization
# parallel --shuf --jl /tmp/myjl -j1 'export JOBS={1};'bash tests-to-run/parallel-local-0.3s.sh ::: {1..16} ::: {1..5}
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj13 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj13 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test bug #45619: "--halt" erroneous error exit code (should give 0)';
seq 10 | parallel --halt now,fail=1 true;
echo $?
@ -837,6 +837,17 @@ par_perlexpr_with_newline() {
rm *"Dad's \"famous\" 1' pizza"
}
par_empty_command() {
echo 'bug #54647: parset ignores empty lines'
# really due to this. Should give an empty line due to -v:
parallel -v :::: <(echo)
. `which env_parallel.bash`
parset a,b,c :::: <(echo echo A; echo; echo echo C)
echo Empty: $b
parset a,b,c :::: <(echo echo A; echo echo B; echo echo C)
echo B: $b
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -6,7 +6,7 @@ mkdir tmp
cd tmp
unset run_test
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | stdout parallel -vj300% -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | stdout parallel -vj300% -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test --load remote'
ssh parallel@lo 'seq 10 | parallel --nice 19 --timeout 15 -j0 -qN0 perl -e while\(1\)\{\ \}' &
sleep 1;
@ -20,17 +20,6 @@ echo '### Stop if all hosts are filtered and there are no hosts left to run on'
echo '### Can csh propagate a variable containing \n';
export A=$(seq 3); parallel -S csh@lo --env A bash -c \''echo "$A"'\' ::: dummy
echo '### bug #41805: Idea: propagate --env for parallel --number-of-cores'
echo '** test_zsh'
FOO=test_zsh parallel --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_zsh_filter'
FOO=test_zsh_filter parallel --filter-hosts --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_csh'
FOO=test_csh parallel --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_csh_filter'
FOO=test_csh_filter parallel --filter-hosts --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** bug #41805 done'
echo '### Test bug #34241: --pipe should not spawn unneeded processes'
seq 5 | ssh csh@lo parallel -k --block 5 --pipe -j10 cat\\\;echo Block_end

View file

@ -2,7 +2,7 @@
# SSH only allowed to localhost/lo
cat <<'EOF' | parallel -vj100% --retries 3 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | parallel -vj100% --retries 3 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### trailing space in sshlogin'
echo 'sshlogin trailing space' | parallel --sshlogin "ssh -l parallel localhost " echo

View file

@ -5,7 +5,7 @@ unset run_once
# SSH only allowed to localhost/lo
# --retries if ssh dies
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj4 --retries 2 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj4 --retries 2 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### --env _'
fUbAr="OK FUBAR" parallel -S parallel@lo --env _ echo '$fUbAr $DEBEMAIL' ::: test
fUbAr="OK FUBAR" parallel -S csh@lo --env _ echo '$fUbAr $DEBEMAIL' ::: test

View file

@ -1833,20 +1833,20 @@ par_mksh_environment_too_big() {
echo 'bug #50815: env_parallel should warn if the environment is too big'
. `which env_parallel.mksh`;
bigvar="$(perl -e 'print "x"x119000')"
bigvar="$(perl -e 'print "x"x110000')"
env_parallel echo ::: OK_bigvar
env_parallel -S lo echo ::: OK_bigvar_remote
bigvar="$(perl -e 'print "\""x119000')"
bigvar="$(perl -e 'print "\""x110000')"
env_parallel echo ::: OK_bigvar_quote
env_parallel -S lo echo ::: OK_bigvar_quote_remote
bigvar=u
eval 'bigfunc() { a="'"$(perl -e 'print "x"x119000')"'"; };'
eval 'bigfunc() { a="'"$(perl -e 'print "x"x110000')"'"; };'
env_parallel echo ::: OK_bigfunc
env_parallel -S lo echo ::: OK_bigfunc_remote
eval 'bigfunc() { a="'"$(perl -e 'print "\""x119000')"'"; };'
eval 'bigfunc() { a="'"$(perl -e 'print "\""x110000')"'"; };'
env_parallel echo ::: OK_bigfunc_quote
env_parallel -S lo echo ::: OK_bigfunc_quote_remote
bigfunc() { true; }

View file

@ -131,6 +131,28 @@ _EOF
ssh zsh@lo "$myscript"
}
par_propagate_env() {
echo '### bug #41805: Idea: propagate --env for parallel --number-of-cores'
echo '** test_zsh'
FOO=test_zsh parallel --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_zsh_filter'
FOO=test_zsh_filter parallel --filter-hosts --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_csh'
FOO=test_csh parallel --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_csh_filter'
FOO=test_csh_filter parallel --filter-hosts --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** bug #41805 done'
}
par_env_parallel_big_env() {
echo '### bug #54128: command too long when exporting big env'
. `which env_parallel.bash`
a=`rand | head -c 75000`
env_parallel -Slo echo should not ::: fail 2>&1
a=`rand | head -c 76000`
env_parallel -Slo echo should not ::: fail 2>/dev/null || echo OK
}
export -f $(compgen -A function | grep par_)
#compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1'
#compgen -A function | grep par_ | sort |

View file

@ -1,6 +1,6 @@
#!/bin/bash
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo "bug #43654: --bar with command not using {} - only last output line "
COLUMNS=80 stdout parallel --bar true {.} ::: 1 | perl -pe 's/.*\r/\r/'

View file

@ -1,6 +1,6 @@
#!/bin/bash
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo "### bug #41482: --pipe --compress blocks at different -j/seq combinations"
seq 1 | parallel -k -j2 --compress -N1 -L1 --pipe cat;
echo echo 1-4 + 1-4

View file

@ -13,7 +13,7 @@ stdsort() {
}
export -f stdsort
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj100 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj100 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### -0 -n3 echo < files0.xi'
stdout xargs -0 -n3 echo < files0.xi
stdout parallel -k -0 -n3 echo < files0.xi

View file

@ -7,7 +7,7 @@ median() { perl -e '@a=sort {$a<=>$b} <>;print $a[$#a/2]';}
export -f median
# -L1 will join lines ending in ' '
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### bug #41565: Print happens in blocks - not after each job complete'
echo 'The timing here is important: a full second between each'
perl -e 'for(1..30){print("$_\n");`sleep 1`}' | parallel -j3 'echo {#}' | timestamp -dd | perl -pe '$_=int($_+0.3)."\n"' | median

View file

@ -1,7 +1,7 @@
#!/bin/bash
# -L1 will join lines ending in ' '
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### bug #38354: -J profile_name should read from `pwd`/profile_name before ~/.parallel/profile_name'
echo "echo echo from ./local_test_profile" > local_test_profile;
parallel --profile local_test_profile echo ::: 1;

View file

@ -34,7 +34,7 @@ ls | parallel -kv rm -- {.}/abc-{.}-{} 2>&1
#test05.sh:find . -type d -print0 | perl -0 -pe 's:^./::' | parallel -0 -v rmdir -- {} 2>&1 \
# -L1 will join lines ending in ' '
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj0 -k -L1 --joblog /tmp/jl-`basename $0`
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj0 -k -L1 --joblog /tmp/jl-`basename $0` -r
echo '### Test compress'
seq 5 | parallel -j2 --tag --compress 'seq {} | pv -q -L 10'

View file

@ -20,7 +20,7 @@ forceload () {
# Force load avg > number of cpu cores
forceload $(parallel --number-of-cores)
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo "bug #38441: CPU usage goes to 100% if load is higher than --load at first job"
/usr/bin/time -f %e parallel --load 100% true ::: a 2>&1 |
perl -ne '$_ > 1 and print "More than 1 secs wall clock: OK\n"'

View file

@ -1,6 +1,6 @@
#!/bin/bash
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test of xargs -m command lines > 130k';
seq 1 60000 | parallel -m -j1 echo a{}b{}c | tee >(wc >/tmp/awc$$) >(sort | md5sum) >/tmp/a$$;
wait;

View file

@ -6,7 +6,7 @@ cp -a input-files/testdir2 tmp
NICEPAR="nice nice parallel"
export NICEPAR
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### bug #42329: --line-buffer gives wrong output';
$NICEPAR --line-buffer --tag seq ::: 10000000 | wc -c;
$NICEPAR --line-buffer seq ::: 10000000 | wc -c

View file

@ -1,6 +1,6 @@
#!/bin/bash
cat <<'EOF' | sed -e 's/;$/; /;' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### -L -n with pipe'
seq 14 | parallel --pipe -k -L 3 -n 2 'cat;echo 6 Ln line record'

View file

@ -5,7 +5,7 @@ echo '### Test --pipe'
seq 1 1000000 >/tmp/parallel-seq
shuf --random-source=/tmp/parallel-seq /tmp/parallel-seq >/tmp/blocktest
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj2 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj2 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test 200M records with too small block';
(
echo start;

View file

@ -24,7 +24,7 @@ export -f par_tmux
# echo '### bug #48841: --tmux(pane) --fg should start tmux in foreground'
# stdout /usr/bin/time -f %e script -q -f -c /tmp/parallel-local7-script /dev/null | perl -ne '$_ >= 26 and $_ <= 45 and print "OK\n"'
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj8 --delay 1 --timeout 100 --retries 1 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj8 --delay 1 --timeout 100 --retries 1 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### tmux-1.9'
seq 0000 10 1000 | PARALLEL_TMUX=tmux-1.9 par_tmux

View file

@ -7,7 +7,7 @@ export XAP
NICEPAR="nice nice parallel"
export NICEPAR
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | stdout parallel -vj4 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | stdout parallel -vj4 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo 'bug #41412: --timeout + --delay causes deadlock';
seq 10 | parallel -j10 --timeout 1 --delay 0.3 echo;
parallel -j3 --timeout 1 --delay 2 echo ::: 1 2 3;

View file

@ -8,14 +8,17 @@ env_parallel --session
P_ALL="openstep qnx pidora alpha tru64 hpux-ia64 syllable raspbian solaris openindiana aix hpux debian-ppc suse solaris-x86 mandriva ubuntu scosysv unixware centos miros macosx redhat netbsd openbsd freebsd debian dragonfly vax ultrix minix irix hurd beaglebone cubieboard2"
P="$P_ALL"
# 2018-04-22 MAXTIME=20
MAXTIME=25
RETRIES=4
MAXPROC=150
# tru64 takes 22s to run 4 parallels
MAXTIME=50
RETRIES=2
MAXPROC=${maxproc:-11}
MAXINNERPROC=${maxinnerproc:-3}
# select a running master (debian or ubuntu)
MASTER=$(parallel -j0 --halt now,success=1 ssh {} echo {} \
::: {suse,ubuntu,debian}.polarhome.com)
export PARALLEL_SSH="ssh -oLogLevel=quiet"
# select a running master (suse, ubuntu, or debian)
MASTER=$(parallel -j0 --delay 0.1 --halt now,success=1 $PARALLEL_SSH {} echo {} \
::: {ubuntu,suse,debian}.polarhome.com)
parallel -j0 --delay 0.1 --retries $RETRIES \
rsync -a /usr/local/bin/{parallel,env_parallel,env_parallel.*[^~],parcat} \
@ -30,11 +33,22 @@ doit() {
export MAXPROC
export RET_TIME_K="-k --retries $RETRIES --timeout $MAXTIME"
echo MAXTIME=$MAXTIME RETRIES=$RETRIES MAXPROC=$MAXPROC
echo MAXTIME=$MAXTIME RETRIES=$RETRIES MAXPROC=$MAXPROC MAXINNERPROC=$MAXINNERPROC
echo '### Filter out working servers'
POLAR="` bin/parallel -j0 $RET_TIME_K $PARALLEL_SSH {} echo {} ::: $P`"
# syllable often gives false positive
parallel --timeout $MAXTIME -j10 ssh syllable true ::: {1..10} 2>/dev/null >/dev/null &
POLAR_ALL="`bin/parallel -j0 -k --timeout 10 echo {} ::: $P`"
POLAR="`bin/parallel -j0 -k --timeout 10 $PARALLEL_SSH {} echo {} ::: $P`"
diff <(echo "$POLAR_ALL") <(echo "$POLAR")
S_POLAR=`bin/parallel -j0 $RET_TIME_K echo -S 1/{} ::: $POLAR`
#" -S '1/sshminix minix'"
sshwithpass() {
# Minix requires sshpass. The other servers will use ssh-keys
sshpass -f ~/.ssh/minix.password ssh -oLogLevel=quiet "$@"
}
export -f sshwithpass
copy() {
# scp, but atomic (avoid half files if disconnected)
@ -42,13 +56,13 @@ doit() {
src="$2"
dst="$3"
cat "$src" |
stdout ssh -oLogLevel=quiet $host "mkdir -p bin;cat > bin/'$dst'.tmp && chmod 755 bin/'$dst'.tmp && mv bin/'$dst'.tmp bin/'$dst'"
sshwithpass $host "mkdir -p bin;cat > bin/'$dst'.tmp && chmod 755 bin/'$dst'.tmp && mv bin/'$dst'.tmp bin/'$dst'" 2>&1
}
export -f copy
par_nonall() {
parallel -j$MAXPROC $RET_TIME_K --delay 0.1 --tag \
--nonall $S_POLAR --argsep ,:- \
--nonall $S_POLAR -S "1/sshminix minix" --argsep ,:- \
'source setupenv >&/dev/null || . `pwd`/setupenv;' "$@"
}
export -f par_nonall
@ -56,53 +70,56 @@ doit() {
echo '### Copy commands to servers'
env_parallel -vj$MAXPROC $RET_TIME_K --delay 0.03 --tag copy {2} {1} {1/} \
::: bin/{parallel,env_parallel,env_parallel.*[^~],parcat,stdout} \
::: $POLAR
::: $POLAR minix
echo Done copying
env_parallel -d '\n\n' -vkj$MAXINNERPROC --delay 2 <<'EOF'
echo
echo '### Works on ...'
echo
par_nonall parallel echo Works on {} ::: '`hostname`' 2>&1
# Test empty command
test_empty_cmd() {
echo '### Test if empty command in process list causes problems'
perl -e '$0=" ";sleep 10' &
parallel echo ::: OK_with_empty_cmd
}
export -f test_empty_cmd
PARALLEL='--env test_empty_cmd' par_nonall test_empty_cmd 2>&1
echo
echo '### --number-of-cores/--number-of-cpus should work with no error'
echo
par_nonall 'parallel --number-of-sockets; parallel --number-of-cores' 2>&1
par_nonall 'parallel --number-of-threads; parallel --number-of-cpus' 2>&1
echo
echo '### Fails if tmpdir is R/O'
echo
par_nonall "stdout parallel --tmpdir / echo ::: test read-only tmp |" \
"perl -pe '\$exit += s:/[a-z0-9_]+.arg:/XXXXXXXX.arg:gi; \$exit += s/[0-9][0-9][0-9][0-9]/0000/gi; END { exit not \$exit }' &&" \
"echo OK readonly tmp" 2>&1
par_nonall "stdout parallel --tmpdir / echo ::: test read-only tmp |
perl -pe '\$exit += s:/[a-z0-9_]+.arg:/XXXXXXXX.arg:gi; \$exit += s/[0-9][0-9][0-9][0-9]/0000/gi; END { exit not \$exit }' &&
echo OK readonly tmp" 2>&1
echo
echo '### --number-of-cores/--number-of-cpus should work with no error'
echo
par_nonall parallel --number-of-sockets 2>&1
par_nonall parallel --number-of-cores 2>&1
par_nonall parallel --number-of-threads 2>&1
par_nonall parallel --number-of-cpus 2>&1
echo
echo '### Does exporting a bash function kill parallel'
echo '### Does exporting a bash function make parallel fail?'
echo 'If login shell is not bash compatible it fails'
echo
# http://zmwangx.github.io/blog/2015-11-25-bash-function-exporting-fiasco.html
par_nonall 'func() { cat <(echo bash only A); };export -f func; bin/parallel func ::: 1' 2>&1
par_nonall 'echo test funcA
funcA() {
cat <(echo bash only A)
}
export -f funcA;
bin/parallel funcA ::: 1' 2>&1
echo
echo '### Does PARALLEL_SHELL help exporting a bash function not kill parallel'
echo '### Does PARALLEL_SHELL help exporting a bash function'
echo 'If login shell is not bash compatible it should work'
echo
(
mkdir -p tmp/bin;
cp /bin/bash tmp/bin
cd tmp
PARALLEL_SHELL=bin/bash par_nonall 'func() { cat <(echo bash only B); };export -f func; bin/parallel func ::: 1'
)
mkdir -p tmp/bin
cp /bin/bash tmp/bin
cd tmp
export PARALLEL_SHELL=bin/bash
par_nonall 'echo test funcB
funcB() {
cat <(echo bash only B)
}
export -f funcB
export PARALLEL_SHELL=bin/bash
bin/parallel funcB ::: 1' 2>&1
echo
echo '### env_parallel echo :::: <(echo OK)'
@ -110,10 +127,22 @@ doit() {
echo
par_nonall 'bin/env_parallel --install && echo install-OK' 2>&1
par_nonall 'env_parallel echo env_parallel ::: run-OK' 2>&1
par_nonall 'env_parallel echo reading from process substitution :::: <(echo OK)' |
# csh on NetBSD does not support process substitution
# csh on NetBSD does not support process substitution
par_nonall 'env_parallel echo reading from process substitution :::: <(echo OK)' 2>&1 |
grep -v ': /tmp/.*: No such file or directory'
# Test empty command name in process list
test_empty_cmd() {
echo '### Test if empty command name in process list causes problems'
perl -e '$0=" ";sleep 1000' &
pid=$!
parallel echo ::: OK_with_empty_cmd
kill $pid
}
export -f test_empty_cmd
export PARALLEL_SHELL=bin/bash
PARALLEL='--env test_empty_cmd' par_nonall test_empty_cmd 2>&1
echo
echo '### parset arr seq ::: 2 3 4'
echo '(bash ksh mksh zsh only)'
@ -129,6 +158,8 @@ doit() {
par_nonall 'parset var1,var2,var3 seq ::: 2 3 4; echo $var1,$var2,$var3' 2>&1
echo '### env_parset var1,var2,var3 seq ::: 2 3 4'
par_nonall 'start=2; env_parset var1,var2,var3 seq \$start ::: 2 3 4; echo $var1,$var2,$var3' 2>&1
EOF
}
env_parallel -u -S$MASTER doit ::: 1

View file

@ -13,7 +13,7 @@ echo 'ssh "$@"; echo "$@" >>/tmp/myssh2-run' >/tmp/myssh2
chmod 755 /tmp/myssh1 /tmp/myssh2
seq 1 100 | parallel --sshdelay 0.03 --retries 10 --sshlogin "/tmp/myssh1 $SSHLOGIN1,/tmp/myssh2 $SSHLOGIN2" -k echo
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/\;s/\$SSHLOGIN1/$SSHLOGIN1/\;s/\$SSHLOGIN2/$SSHLOGIN2/\;s/\$SSHLOGIN3/$SSHLOGIN3/ | parallel -vj3 -k -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/\;s/\$SSHLOGIN1/$SSHLOGIN1/\;s/\$SSHLOGIN2/$SSHLOGIN2/\;s/\$SSHLOGIN3/$SSHLOGIN3/ | parallel -vj3 -k -L1 -r
echo '### test --timeout --retries'
parallel -j0 --timeout 5 --retries 3 -k ssh {} echo {} ::: 192.168.1.197 8.8.8.8 $SSHLOGIN1 $SSHLOGIN2 $SSHLOGIN3

View file

@ -1,7 +1,7 @@
#!/bin/bash
# -L1 will join lines ending in ' '
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test mutex. This should not mix output';
parallel --semaphore --id mutex -u seq 1 10 '|' pv -qL 20;
parallel --semaphore --id mutex -u seq 11 20 '|' pv -qL 100;

View file

@ -1,6 +1,6 @@
#!/bin/bash
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test of --eta'
seq 1 10 | stdout parallel --eta "sleep 1; echo {}" | wc -l

View file

@ -4,7 +4,7 @@ SERVER1=parallel-server3
SERVER2=parallel-server1
# -L1 will join lines ending in ' '
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### bug #32191: Deep recursion on subroutine main::get_job_with_sshlogin'
seq 1 150 | stdout nice parallel -j9 --retries 2 -S localhost,: "/bin/non-existant 2>/dev/null"

View file

@ -6,7 +6,7 @@ SSHLOGIN1=parallel@$SERVER1
SSHLOGIN2=parallel@$SERVER2
# -L1 will join lines ending in ' '
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/\;s/\$SSHLOGIN1/$SSHLOGIN1/\;s/\$SSHLOGIN2/$SSHLOGIN2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/\;s/\$SSHLOGIN1/$SSHLOGIN1/\;s/\$SSHLOGIN2/$SSHLOGIN2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test --onall';
parallel --onall -S $SSHLOGIN1,$SSHLOGIN2 '(echo {1} {2}) | awk \{print\ \$2}' ::: a b c ::: 1 2

View file

@ -3,7 +3,7 @@
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 | perl -pe 's/(PARALLEL_PID....)\d+/$1XXXXX/g'
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r | perl -pe 's/(PARALLEL_PID....)\d+/$1XXXXX/g'
echo '### Test --return of weirdly named file'
stdout parallel --return {} -vv -S 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'

View file

@ -389,7 +389,7 @@ d
(echo a_b' ';echo c;echo d) | xargs -L1 echo
a_b c
d
echo '### xargs -L2 echo'
echo '### xargs -L2 echo'
### xargs -L2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -km -L2 echo
a_b c d
@ -400,7 +400,7 @@ e
(echo a_b' ';echo c;echo d;echo e) | xargs -L2 echo
a_b c d
e
echo '### xargs -l echo'
echo '### xargs -l echo'
### xargs -l echo
(echo a_b' ';echo c;echo d;echo e) | parallel -l -km echo # This behaves wrong
a_b c
@ -414,7 +414,7 @@ e
a_b c
d
e
echo '### xargs -l2 echo'
echo '### xargs -l2 echo'
### xargs -l2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l2 echo
a_b c d
@ -425,7 +425,7 @@ e
(echo a_b' ';echo c;echo d;echo e) | xargs -l2 echo
a_b c d
e
echo '### xargs -l1 echo'
echo '### xargs -l1 echo'
### xargs -l1 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -km -l1 echo
a_b c
@ -439,7 +439,7 @@ e
a_b c
d
e
echo '### xargs --max-lines=2 echo'
echo '### xargs --max-lines=2 echo'
### xargs --max-lines=2 echo
(echo a_b' ';echo c;echo d;echo e) | parallel -km --max-lines 2 echo
a_b c d
@ -450,7 +450,7 @@ e
(echo a_b' ';echo c;echo d;echo e) | xargs --max-lines=2 echo
a_b c d
e
echo '### xargs --max-lines echo'
echo '### xargs --max-lines echo'
### xargs --max-lines echo
(echo a_b' ';echo c;echo d;echo e) | parallel --max-lines -km echo # This behaves wrong
a_b c
@ -464,7 +464,7 @@ e
a_b c
d
e
echo '### test too long args'
echo '### test too long args'
### test too long args
perl -e 'print "z"x1000000' | parallel echo 2>&1
parallel: Error: Command line too long (1000005 >= 131049) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
@ -491,7 +491,7 @@ xargs: argument line too long
7 8
9 10
parallel: Error: Command line too long (1000007 >= 10) at input 0: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz...
echo '### Test -x'
echo '### Test -x'
### Test -x
(seq 1 10; echo 12345; seq 12 15) | stdsort parallel -j1 -km -s 10 -x echo
1 2
@ -546,7 +546,7 @@ xargs: argument line too long
5 6
7 8
9 10
echo '### Test -a and --arg-file: Read input from file instead of stdin'
echo '### Test -a and --arg-file: Read input from file instead of stdin'
### Test -a and --arg-file: Read input from file instead of stdin
seq 1 10 >/tmp/parallel_$$-1; parallel -k -a /tmp/parallel_$$-1 echo; rm /tmp/parallel_$$-1
1
@ -570,7 +570,7 @@ xargs: argument line too long
8
9
10
echo '### Test -i and --replace: Replace with argument'
echo '### Test -i and --replace: Replace with argument'
### Test -i and --replace: Replace with argument
(echo a; echo END; echo b) | parallel -k -i -eEND echo repl{}ce
replace
@ -590,13 +590,13 @@ replace
replace
(echo a; echo END; echo b) | parallel -k -I^ -eEND echo repl^ce
replace
echo '### Test -E: Artificial end-of-file'
echo '### Test -E: Artificial end-of-file'
### Test -E: Artificial end-of-file
(echo include this; echo END; echo not this) | parallel -k -E END echo
include this
(echo include this; echo END; echo not this) | parallel -k -EEND echo
include this
echo '### Test -e and --eof: Artificial end-of-file'
echo '### Test -e and --eof: Artificial end-of-file'
### Test -e and --eof: Artificial end-of-file
(echo include this; echo END; echo not this) | parallel -k -e END echo
include this
@ -606,7 +606,7 @@ include this
include this
(echo include this; echo END; echo not this) | parallel -k --eof END echo
include this
echo '### Test -n and --max-args: Max number of args per line (only with -X and -m)'
echo '### Test -n and --max-args: Max number of args per line (only with -X and -m)'
### Test -n and --max-args: Max number of args per line (only with -X and -m)
(echo line 1;echo line 2;echo line 3) | parallel -k -n1 -m echo
line 1
@ -650,7 +650,7 @@ line 3
(echo line 1;echo line 1;echo line 2) | parallel -k --max-args 2 echo
line 1 line 1
line 2
echo '### Test --max-procs and -P: Number of processes'
echo '### Test --max-procs and -P: Number of processes'
### Test --max-procs and -P: Number of processes
seq 1 10 | parallel -k --max-procs +0 echo max proc
max proc 1
@ -674,7 +674,7 @@ max proc 10
200% proc 8
200% proc 9
200% proc 10
echo '### Test --delimiter and -d: Delimiter instead of newline'
echo '### Test --delimiter and -d: Delimiter instead of newline'
### Test --delimiter and -d: Delimiter instead of newline
echo '# Yes there is supposed to be an extra newline for -d N'
# Yes there is supposed to be an extra newline for -d N
@ -696,7 +696,7 @@ line 3
delimiter TAB line 1
line 2
line 3
echo '### Test --max-chars and -s: Max number of chars in a line'
echo '### Test --max-chars and -s: Max number of chars in a line'
### Test --max-chars and -s: Max number of chars in a line
(echo line 1;echo line 1;echo line 2) | parallel -k --max-chars 25 -X echo
line 1 line 1
@ -704,11 +704,11 @@ line 2
(echo line 1;echo line 1;echo line 2) | parallel -k -s 25 -X echo
line 1 line 1
line 2
echo '### Test --no-run-if-empty and -r: This should give no output'
echo '### Test --no-run-if-empty and -r: This should give no output'
### Test --no-run-if-empty and -r: This should give no output
echo " " | parallel -r echo
echo " " | parallel --no-run-if-empty echo
echo '### Test --help and -h: Help output (just check we get the same amount of lines)'
echo '### Test --help and -h: Help output (just check we get the same amount of lines)'
### Test --help and -h: Help output (just check we get the same amount of lines)
echo Output from -h and --help
Output from -h and --help
@ -716,11 +716,11 @@ Output from -h and --help
37
parallel --help | wc -l
37
echo '### Test --version: Version output (just check we get the same amount of lines)'
echo '### Test --version: Version output (just check we get the same amount of lines)'
### Test --version: Version output (just check we get the same amount of lines)
parallel --version | wc -l
11
echo '### Test --verbose and -t'
10
echo '### Test --verbose and -t'
### Test --verbose and -t
(echo b; echo c; echo f) | parallel -k -t echo {}ar 2>&1 >/dev/null
echo bar
@ -730,7 +730,7 @@ echo far
echo bar
echo car
echo far
echo '### Test --show-limits'
echo '### Test --show-limits'
### Test --show-limits
(echo b; echo c; echo f) | parallel -k --show-limits echo {}ar
Maximal size of command: 131049
@ -750,11 +750,11 @@ Execution of will continue now, and it will try to read its input
and run commands; if this is not what you wanted to happen, please
press CTRL-D or CTRL-C
bar car far
echo '### Test empty line as input'
echo '### Test empty line as input'
### Test empty line as input
echo | parallel echo empty input line
empty input line
echo '### Tests if (cat | sh) works'
echo '### Tests if (cat | sh) works'
### Tests if (cat | sh) works
perl -e 'for(1..25) {print "echo a $_; echo b $_\n"}' | parallel 2>&1 | sort
a 1
@ -807,7 +807,7 @@ b 6
b 7
b 8
b 9
echo '### Test if xargs-mode works'
echo '### Test if xargs-mode works'
### Test if xargs-mode works
perl -e 'for(1..25) {print "a $_\nb $_\n"}' | parallel echo 2>&1 | sort
a 1
@ -860,12 +860,12 @@ b 6
b 7
b 8
b 9
echo '### Test -q'
echo '### Test -q'
### Test -q
parallel -kq perl -e '$ARGV[0]=~/^\S+\s+\S+$/ and print $ARGV[0],"\n"' ::: "a b" c "d e f" g "h i"
a b
h i
echo '### Test -q {#}'
echo '### Test -q {#}'
### Test -q {#}
parallel -kq echo {#} ::: a b
1
@ -876,7 +876,7 @@ h i
parallel -kq echo {\\#} ::: a b
{\#} a
{\#} b
echo '### Test long commands do not take up all memory'
echo '### Test long commands do not take up all memory'
### Test long commands do not take up all memory
seq 1 100 | parallel -j0 -qv perl -e '$r=rand(shift);for($f=0;$f<$r;$f++){$a="a"x100};print shift,"\n"' 10000 2>/dev/null | sort
1
@ -1079,7 +1079,7 @@ perl -e '$r=rand(shift);for($f=0;$f<$r;$f++){$a="a"x100};print shift,"\n"' 10000
perl -e '$r=rand(shift);for($f=0;$f<$r;$f++){$a="a"x100};print shift,"\n"' 10000 97
perl -e '$r=rand(shift);for($f=0;$f<$r;$f++){$a="a"x100};print shift,"\n"' 10000 98
perl -e '$r=rand(shift);for($f=0;$f<$r;$f++){$a="a"x100};print shift,"\n"' 10000 99
echo '### Test 0-arguments'
echo '### Test 0-arguments'
### Test 0-arguments
seq 1 2 | parallel -k -n0 echo n0
n0
@ -1090,34 +1090,34 @@ L0
seq 1 2 | parallel -k -N0 echo N0
N0
N0
echo '### Because of --tollef -l, then -l0 == -l1, sorry'
echo '### Because of --tollef -l, then -l0 == -l1, sorry'
### Because of --tollef -l, then -l0 == -l1, sorry
seq 1 2 | parallel -k -l0 echo l0
l0 1
l0 2
echo '### Test replace {}'
echo '### Test replace {}'
### Test replace {}
seq 1 2 | parallel -k -N0 echo replace {} curlies
replace curlies
replace curlies
echo '### Test arguments on commandline'
echo '### Test arguments on commandline'
### Test arguments on commandline
parallel -k -N0 echo args on cmdline ::: 1 2
args on cmdline
args on cmdline
echo '### Test --nice locally'
echo '### Test --nice locally'
### Test --nice locally
parallel --nice 1 -vv 'PAR=a bash -c "echo \$PAR {}"' ::: b
PAR=a bash -c "echo \$PAR b"
a b
echo '### Test distribute arguments at EOF to 2 jobslots'
echo '### Test distribute arguments at EOF to 2 jobslots'
### Test distribute arguments at EOF to 2 jobslots
seq 1 92 | parallel -j2 -kX -s 100 echo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
66 67 68 69 70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89 90 91 92
echo '### Test distribute arguments at EOF to 5 jobslots'
echo '### Test distribute arguments at EOF to 5 jobslots'
### Test distribute arguments at EOF to 5 jobslots
seq 1 92 | parallel -j5 -kX -s 100 echo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
@ -1127,7 +1127,7 @@ a b
78 79 80 81 82 83
84 85 86 87 88 89
90 91 92
echo '### Test distribute arguments at EOF to infinity jobslots'
echo '### Test distribute arguments at EOF to infinity jobslots'
### Test distribute arguments at EOF to infinity jobslots
seq 1 92 | parallel -j0 -kX -s 100 echo 2>/dev/null
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
@ -1159,26 +1159,26 @@ a b
90
91
92
echo '### Test -N is not broken by distribution - single line'
echo '### Test -N is not broken by distribution - single line'
### Test -N is not broken by distribution - single line
seq 9 | parallel -N 10 echo
1 2 3 4 5 6 7 8 9
echo '### Test -N is not broken by distribution - two lines'
echo '### Test -N is not broken by distribution - two lines'
### Test -N is not broken by distribution - two lines
seq 19 | parallel -k -N 10 echo
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19
echo '### Test -N context replace'
echo '### Test -N context replace'
### Test -N context replace
seq 19 | parallel -k -N 10 echo a{}b
a1b a2b a3b a4b a5b a6b a7b a8b a9b a10b
a11b a12b a13b a14b a15b a16b a17b a18b a19b
echo '### Test -L context replace'
echo '### Test -L context replace'
### Test -L context replace
seq 19 | parallel -k -L 10 echo a{}b
a1b a2b a3b a4b a5b a6b a7b a8b a9b a10b
a11b a12b a13b a14b a15b a16b a17b a18b a19b
echo '**'
echo '**'
**
echo '### Test {} multiple times in different commands'
### Test {} multiple times in different commands
@ -1313,6 +1313,10 @@ par_dryrun_append_joblog echo 4
par_dryrun_append_joblog 4
par_empty bug #:
par_empty true
par_empty_command bug #54647: parset ignores empty lines
par_empty_command
par_empty_command Empty:
par_empty_command B: B
par_empty_line ### Test bug: empty line for | sh with -k
par_empty_line a
par_empty_line b

View file

@ -258,7 +258,7 @@ par_linebuffer_tag_slow_output b b
par_linebuffer_tag_slow_output b
par_long_line_remote ### Deal with long command lines on remote servers
par_long_line_remote 2 6 30006
par_long_line_remote 2 50 250050
par_long_line_remote 3 50 250050
par_maxlinelen_X_I ### Test max line length -X -I
par_maxlinelen_X_I 3cfc69ee81b0fe7fdbe8eb059ad2da61 -
par_maxlinelen_X_I Chars per line (817788/7): 116826

View file

@ -34,30 +34,6 @@ echo '### Can csh propagate a variable containing \n'; export A=$(seq 3); para
1
2
3
echo '### bug #41805: Idea: propagate --env for parallel --number-of-cores'
### bug #41805: Idea: propagate --env for parallel --number-of-cores
echo '** test_zsh'
** test_zsh
FOO=test_zsh parallel --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_zsh
HOME=~
echo '** test_zsh_filter'
** test_zsh_filter
FOO=test_zsh_filter parallel --filter-hosts --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_zsh_filter
HOME=~
echo '** test_csh'
** test_csh
FOO=test_csh parallel --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_csh
HOME=~
echo '** test_csh_filter'
** test_csh_filter
FOO=test_csh_filter parallel --filter-hosts --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_csh_filter
HOME=~
echo '** bug #41805 done'
** bug #41805 done
echo '### Test bug #34241: --pipe should not spawn unneeded processes'
### Test bug #34241: --pipe should not spawn unneeded processes
seq 5 | ssh csh@lo parallel -k --block 5 --pipe -j10 cat\\\;echo Block_end

View file

@ -40,6 +40,20 @@ par_sh_embed your
par_sh_embed code
par_sh_embed here
par_sh_embed Put your code here
par_propagate_env ### bug #41805: Idea: propagate --env for parallel --number-of-cores
par_propagate_env ** test_zsh
par_propagate_env FOO=test_zsh
par_propagate_env HOME=~
par_propagate_env ** test_zsh_filter
par_propagate_env FOO=test_zsh_filter
par_propagate_env HOME=~
par_propagate_env ** test_csh
par_propagate_env FOO=test_csh
par_propagate_env HOME=~
par_propagate_env ** test_csh_filter
par_propagate_env FOO=test_csh_filter
par_propagate_env HOME=~
par_propagate_env ** bug #41805 done
par_ksh_embed --embed
par_ksh_embed Redirect the output to a file and add your changes at the end:
par_ksh_embed /usr/local/bin/parallel --embed > new_script
@ -66,6 +80,9 @@ par_ksh_embed code
par_ksh_embed here
par_ksh_embed Put your code here
par_fish_embed Not implemented
par_env_parallel_big_env ### bug #54128: command too long when exporting big env
par_env_parallel_big_env should not fail
par_env_parallel_big_env OK
par_csh_embed Not implemented
par_bash_embed --embed
par_bash_embed Redirect the output to a file and add your changes at the end:

View file

@ -135,7 +135,7 @@ a13.gifb13c13 a14.gifb14c14 a15.gifb15c15
a1.gif 2.gif 3.gif 4.gif 5.gif 6.gif 7.gifb1 2 3 4 5 6 7c1 2 3 4 5 6 7
a8.gif 9.gif 10.gif 11.gif 12.gif 13.gifb8 9 10 11 12 13c8 9 10 11 12 13
a14.gif 15.gifb14 15c14 15
echo '### Test -I with shell meta chars'
echo '### Test -I with shell meta chars'
### Test -I with shell meta chars
seq 10000 | parallel -j1 -I :: -X echo a::b::c:: | wc -l
2
@ -145,7 +145,7 @@ a14.gif 15.gifb14 15c14 15
2
seq 10000 | parallel -j1 -I '>' -X echo 'a>b>c>' | wc -l
2
echo '### Test {.}'
echo '### Test {.}'
### Test {.}
echo a | parallel -qX echo "'"{.}"' "
'a'

View file

@ -61,8 +61,8 @@ 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,2017,2018
Ole Tange and Free Software Foundation, Inc.
GNU parallel 20180916
Copyright (C) 2007-2018 Ole Tange and Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
GNU parallel comes with no warranty.

File diff suppressed because it is too large Load diff