Allow $TMPDIR to contain spaces and newlines.

This commit is contained in:
Ole Tange 2023-01-30 22:51:56 +01:00
parent 4307949091
commit e6fe5fafcd
56 changed files with 916 additions and 13820 deletions

View file

@ -278,6 +278,8 @@ New in this release:
News about GNU Parallel:
https://www.redhat.com/sysadmin/perl-scripts
<<>>
GNU Parallel - For people who live life in the parallel lane.

View file

@ -252,8 +252,8 @@ sub pipe_tee_setup() {
# (rm fifo2; grep 2) < fifo2
# (rm fifo3; grep 3) < fifo3
# Remove the tmpfifo as soon as it is open
@Global::cat_prepends = map { "(rm $_;" } @fifos;
@Global::cat_appends = map { ") < $_" } @fifos;
@Global::cat_prepends = map { "(rm $_;" } shell_quote(@fifos);
@Global::cat_appends = map { ") < $_" } shell_quote(@fifos);
}
@ -578,7 +578,7 @@ sub pipe_shard_setup() {
# The PERL_HASH_SEED must be the same for all sharders
# so B::hash will return the same value for any given input
$ENV{'PERL_HASH_SEED'} = $$;
exec qw(parallel --block 100k -q --pipe -j), $njobs,
exec qw(parallel -0 --block 100k -q --pipe -j), $njobs,
qw(--roundrobin -u perl -e), $script, ($opt::colsep || ","),
$col, $perlexpr, '{}', (map { (':::+', @{$_}) } @parcatfifos);
}
@ -591,7 +591,9 @@ sub pipe_shard_setup() {
::error("'parcat' must be in path.");
::wait_and_exit(255);
}
@Global::cat_prepends = map { "perl -e $parcat @$_ | " } @parcatfifos;
@Global::cat_prepends =
map { "perl -e $parcat ".
join(" ",shell_quote(@$_))." | "} @parcatfifos;
}
sub pipe_part_files(@) {
@ -3301,7 +3303,7 @@ sub read_options() {
} else {
@options = shift @ARGV;
}
my $script = Q(Q(shift @ARGV));
my $script = Q(Q(shift @ARGV)); # TODO - test if script = " "
my @args = map{ Q($_) } @ARGV;
# exec myself to split $ARGV[0] into separate fields
exec "$0 --_pipe-means-argfiles @options @parser $script ".
@ -5250,23 +5252,24 @@ sub onall($@) {
my $joblog = tmp_joblog($opt::joblog);
if($joblog) {
push @joblogs, $joblog;
$joblog = "--joblog $joblog";
$joblog = "--joblog ".::Q($joblog);
}
my $quad = $opt::arg_file_sep || "::::";
# If PARALLEL_ENV is set: Pass it on
my $penv=$Global::parallel_env ?
"PARALLEL_ENV=".Q($Global::parallel_env) :
'';
my $qsshlogin = Q($sshlogin->string());
::debug("init", "$penv $0 $suboptions -j1 $joblog ",
((defined $opt::tag) ?
"--tagstring ".Q($sshlogin->string()) : ""),
" -S ", Q($sshlogin->string())," ",
join(" ",shell_quote(@command))," $quad @argfiles\n");
"--tagstring ".$qsshlogin : ""),
" -S $qsshlogin ",
join(" ",shell_quote(@command,$quad,@argfiles)),"\n");
print $parallel_fh "$penv $0 $suboptions -j1 $joblog ",
((defined $opt::tag) ?
"--tagstring ".Q($sshlogin->string()) : ""),
" -S ", Q($sshlogin->string())," ",
join(" ",shell_quote(@command))," $quad @argfiles\0";
"--tagstring ".$qsshlogin : ""),
" -S $qsshlogin ",
join(" ",shell_quote(@command,$quad,@argfiles)),"\0";
}
close $parallel_fh;
$Global::exitstatus = $? >> 8;
@ -6015,10 +6018,11 @@ sub tmpname($) {
my $name = shift;
my($tmpname);
if(not -w $ENV{'TMPDIR'}) {
my $qtmp = ::Q($ENV{'TMPDIR'});
if(not -e $ENV{'TMPDIR'}) {
::error("Tmpdir '$ENV{'TMPDIR'}' does not exist.","Try 'mkdir $ENV{'TMPDIR'}'");
::error("Tmpdir $qtmp does not exist.","Try: mkdir -p $qtmp");
} else {
::error("Tmpdir '$ENV{'TMPDIR'}' is not writable.","Try 'chmod +w $ENV{'TMPDIR'}'");
::error("Tmpdir $qtmp is not writable.","Try: chmod +w $qtmp");
}
::wait_and_exit(255);
}
@ -7078,6 +7082,7 @@ sub sshcmd($) {
# [sshpass -e] ssh -p port -l user
if($self->{'password'}) { push @local, "sshpass -e"; }
# [ssh] -p port -l user
# TODO sshpass + space
push @local, $self->{'sshcommand'};
# [-p port] -l user
if($self->{'port'}) { push @local, '-p',$self->{'port'}; }
@ -7086,7 +7091,7 @@ sub sshcmd($) {
if($opt::controlmaster) {
# Use control_path to make ssh faster
my $control_path = $self->control_path_dir()."/ssh-%r@%h:%p";
push @local, "-S", $control_path;
if(not $self->{'control_path'}{$control_path}++) {
# Master is not running for this control_path
# Start it
@ -7094,6 +7099,7 @@ sub sshcmd($) {
if($pid) {
$Global::sshmaster{$pid} ||= 1;
} else {
push @local, "-S", $control_path;
$SIG{'TERM'} = undef;
# Run a sleep that outputs data, so it will discover
# if the ssh connection closes.
@ -7107,6 +7113,7 @@ sub sshcmd($) {
"perl", "-e", $sleep);
}
}
push @local, "-S", ::Q($control_path);
}
return "@local";
@ -7454,7 +7461,9 @@ sub swap_activity($) {
my $file = $self->{'swap_activity_file'};
my ($dummy_fh, $tmpfile) = ::tmpfile(SUFFIX => ".swp");
::debug("swap", "\n", $swap_activity, "\n");
::qqx("($swap_activity > $tmpfile && mv $tmpfile $file || rm $tmpfile &)");
my $qtmp = ::Q($tmpfile);
my $qfile = ::Q($file);
::qqx("($swap_activity > $qtmp && mv $qtmp $qfile || rm $qtmp &)");
}
return $self->{'swap_activity'};
}
@ -9376,7 +9385,8 @@ sub filter_through_compress($) {
# it is known that output file is opened,
# thus output file can then be removed by the decompressor.
# empty_input_wrapper is needed for plzip
my $wpid = open(my $fdw,"|-", "(echo > $comfile; ".
my $qcom = ::Q($comfile);
my $wpid = open(my $fdw,"|-", "(echo > $qcom; ".
empty_input_wrapper($opt::compress_program).") >".
::Q($self->fh($fdno,'name'))) || die $?;
$self->set_fh($fdno,'w',$fdw);
@ -9855,9 +9865,9 @@ sub wrapped($) {
# Prepend 'cat > $PARALLEL_TMP;'
# Append 'unlink $PARALLEL_TMP without affecting $?'
$command =
'cat > $PARALLEL_TMP;'.
'cat > "$PARALLEL_TMP";'.
$command.";". postpone_exit_and_cleanup().
'$PARALLEL_TMP';
'"$PARALLEL_TMP"';
} elsif($opt::fifo) {
# Prepend fifo-wrapper. In essence:
# mkfifo {}
@ -9867,7 +9877,7 @@ sub wrapped($) {
# wait; rm {}
# without affecting $?
$command = fifo_wrap(). " ".
$Global::shell. " ". ::Q($command). ' $PARALLEL_TMP'. ';';
$Global::shell. " ". ::Q($command). ' "$PARALLEL_TMP"'. ';';
}
# Wrap with ssh + tranferring of files
$command = $self->sshlogin_wrap($command);
@ -10827,6 +10837,7 @@ sub interactive_start($) {
{
my $tmuxsocket;
my $qsocket;
sub tmux_wrap($) {
# Wrap command with tmux for session pPID
@ -10837,7 +10848,6 @@ sub interactive_start($) {
# Temporary file name. Used for fifo to communicate exit val
my $tmpfifo = ::tmpname("tmx");
$self->add_rm($tmpfifo);
if(length($tmpfifo) >=100) {
::error("tmux does not support sockets with path > 100.");
::wait_and_exit(255);
@ -10888,36 +10898,36 @@ sub interactive_start($) {
$ENV{'PARALLEL_TMUX'} ||= "tmux";
if(not $tmuxsocket) {
$tmuxsocket = ::tmpname("tms");
::debug("tmux", "Start: $ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach");
$qsocket = ::Q($tmuxsocket);
::debug("tmux", "Start: $ENV{'PARALLEL_TMUX'} -S $qsocket attach");
if($opt::fg) {
if(not fork) {
# Run tmux in the foreground
# Wait for the socket to appear
while (not -e $tmuxsocket) { }
`$ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach`;
`$ENV{'PARALLEL_TMUX'} -S $qsocket attach`;
exit;
}
}
::status("See output with: $ENV{'PARALLEL_TMUX'} -S $tmuxsocket attach");
::status("See output with: $ENV{'PARALLEL_TMUX'} -S $qsocket attach");
}
$tmux = "sh -c '".
$tmux = "sh -c ".::Q(
$ENV{'PARALLEL_TMUX'}.
" -S $tmuxsocket new-session -s p$$ -d \"sleep .2\" >/dev/null 2>&1';" .
" -S $qsocket new-session -s p$$ -d \"sleep .2\" >/dev/null 2>&1").";" .
$ENV{'PARALLEL_TMUX'}.
" -S $tmuxsocket new-window -t p$$ -n $title";
" -S $qsocket new-window -t p$$ -n $title";
::debug("tmux", "title len:", $l_tit, " act ", $l_act, " max ",
$Limits::Command::line_max_len, " tot ",
$l_tot, "\n");
return "mkfifo $tmpfifo && $tmux ".
return "mkfifo ".::Q($tmpfifo)." && $tmux ".
# Run in tmux
::Q
(
"(".$actual_command.');'.
# The triple print is needed - otherwise the testsuite fails
q[ perl -e 'while($t++<3){ print $ARGV[0],"\n" }' $?h/$status >> ].
$tmpfifo."&".
::Q($tmpfifo)."&".
"echo $title; echo \007Job finished at: `date`;sleep 10"
).
# Run outside tmux
@ -10925,7 +10935,7 @@ sub interactive_start($) {
# If csh the first will be 0h, so use the second as exit value.
# Otherwise just use the first value as exit value.
q{; exec perl -e '$/="/";$_=<>;$c=<>;unlink $ARGV; }.
q{/(\d+)h/ and exit($1);exit$c' }.$tmpfifo;
q{/(\d+)h/ and exit($1);exit$c' }.::Q($tmpfifo);
}
}
@ -12159,7 +12169,7 @@ sub slot($) {
$Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->get();
# $PARALLEL_TMP will point to a tempfile that will be used as {}
$Global::JobQueue->{'commandlinequeue'}->{'arg_queue'}->
unget([Arg->new('$PARALLEL_TMP')]);
unget([Arg->new('"$PARALLEL_TMP"')]);
}
while (not $self->{'arg_queue'}->empty()) {
$next_arg = $self->{'arg_queue'}->get();
@ -13385,9 +13395,10 @@ sub tmux_length($) {
my @out;
for my $l (1, 2020, 16320, 30000, $len) {
my $tmpfile = ::tmpname("tms");
my $qtmp = ::Q($tmpfile);
my $tmuxcmd = $ENV{'PARALLEL_TMUX'}.
" -S $tmpfile new-session -d -n echo $l".
("t"x$l). " && echo $l; rm -f $tmpfile";
" -S $qtmp new-session -d -n echo $l".
("t"x$l). " && echo $l; rm -f $qtmp";
push @out, ::qqx($tmuxcmd);
::rm($tmpfile);
}

View file

@ -3790,6 +3790,72 @@ fails.
https://github.com/aaronriekenberg/rust-parallel
(Last checked: 2023-01)
=head2 DIFFERENCES BETWEEN parallelium AND GNU Parallel
Summary (see legend above):
=over
=item - I2 - - - - -
=item M1 - - - - M6
=item O1 - O3 - - - - N/A - -
=item E1 - - E4 - - -
=item - - - - - - - - -
=item - -
=back
B<parallelium> merges standard output (stdout) and standard error
(stderr). The maximal output of a command is 8192 bytes. Bigger output
makes B<parallelium> go into an infinite loop.
In the input file for B<parallelium> you can define a tag, so that you
can select to run only these commands. A bit like a target in a
Makefile.
Progress is printed on standard output (stdout) prepended with '#'
with similar information as GNU B<parallel>'s B<--bar>.
=head3 EXAMPLES
$ cat testjobs.txt
#tag common sleeps classA
(sleep 4.495;echo "job 000")
:
(sleep 2.587;echo "job 016")
#tag common sleeps classB
(sleep 0.218;echo "job 017")
:
(sleep 2.269;echo "job 040")
#tag common sleeps classC
(sleep 2.586;echo "job 041")
:
(sleep 1.626;echo "job 099")
#tag lasthalf, sleeps, classB
(sleep 1.540;echo "job 100")
:
(sleep 2.001;echo "job 199")
1$ parallelium -f testjobs.txt -l logdir -t classB,classC
1$ cat testjobs.txt |
parallel --plus --results logdir/testjobs.txt_{0#}.output \
'{= if(/^#tag /) { @tag = split/,|\s+/ }
(grep /^(classB|classC)$/, @tag) or skip =}'
https://github.com/beomagi/parallelium
(Last checked: 2023-01)
=head2 Todo
http://code.google.com/p/push/ (cannot compile)

View file

@ -159,12 +159,19 @@ sub sort_files {
# The commands split at \n (or \0)
# and there will be at least one for each CPU thread
my @subopt = $opt::zero_terminated ? qw(--recend "\0") : ();
# $uniq is needed because @files could contain \n
my $uniq = join "", map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..20);
open(my $par,"-|",qw(parallel), @subopt,
qw(--pipepart --block -1 --dryrun -vv sort),
@Global::sortoptions, '::::', @files) || die;
my @cmd = merge(<$par>);
@Global::sortoptions, $uniq, '::::', @files) || die;
# Generated commands:
# <file perl-catter | (sort ... $uniq )
# Use $uniq to split into commands
# (We cannot use \n because 'file' may contain newline)
my @cmd = map { "$_)\n" } split(/$uniq[)]\n/, join("",<$par>));
debug(1,@cmd);
close $par;
debug(@cmd);
@cmd = merge(@cmd);
# The command uses <(...) so it is incompatible with /bin/sh
open(my $bash,"|-","bash") || die;
print $bash @cmd;
@ -186,7 +193,7 @@ sub sort_stdin {
if(fork) {
} else {
my @subopt = $opt::zero_terminated ? qw(--recend "\0") : ();
exec(qw(parallel -j), $numthreads, @subopt,
exec(qw(parallel -0 -j), $numthreads, @subopt,
# 286k is the best mean value after testing 250..350
qw(--block 286k --pipe --roundrobin cat > {} :::),@fifos);
}

55
src/sql
View file

@ -523,6 +523,27 @@ use Getopt::Long;
use strict;
use File::Temp qw/tempfile tempdir/;
sub shell_quote($) {
# Quote for other shells (Bourne compatibles)
# Inputs:
# $string = string to be quoted
# Returns:
# $shell_quoted = string quoted as needed by the shell
my $s = $_[0];
if($s =~ /[^-_.+a-z0-9\/]/i) {
$s =~ s/'/'"'"'/g; # "-quote single quotes
$s = "'$s'"; # '-quote entire string
$s =~ s/^''//; # Remove unneeded '' at ends
$s =~ s/''$//; # (faster than s/^''|''$//g)
return $s;
} elsif ($s eq "") {
return "''";
} else {
# No quoting needed
return $s;
}
}
parse_options();
my $pass_through_options = (defined $::opt_p) ? join(" ",@{$::opt_p}) : "";
@ -587,29 +608,11 @@ if($dburl{'query'}) {
($fh,$queryfile) = tempfile(SUFFIX => ".sql");
print $fh $dburl{'query'},"\n";
close $fh;
$batch_command = "(cat $queryfile;rm $queryfile; cat) | $batch_command";
my $qfile = shell_quote($queryfile);
$batch_command = "(cat $qfile;rm $qfile; cat) | $batch_command";
}
sub shell_quote($) {
# Quote for other shells (Bourne compatibles)
# Inputs:
# $string = string to be quoted
# Returns:
# $shell_quoted = string quoted as needed by the shell
my $s = $_[0];
if($s =~ /[^-_.+a-z0-9\/]/i) {
$s =~ s/'/'"'"'/g; # "-quote single quotes
$s = "'$s'"; # '-quote entire string
$s =~ s/^''//; # Remove unneeded '' at ends
$s =~ s/''$//; # (faster than s/^''|''$//g)
return $s;
} elsif ($s eq "") {
return "''";
} else {
# No quoting needed
return $s;
}
}
do {
if(@ARGV) {
@ -776,10 +779,10 @@ sub mysql_commands {
close $credential_fh;
# Prepend with a remover of the credential tempfile
# -C: Compression if both ends support it
my $qtmp = shell_quote($tmp);
$batch_command =
"((sleep 1; rm $tmp) & ".
"mysql --defaults-extra-file=$tmp -C $pass_through_options ".
"((sleep 1; rm $qtmp) & ".
"mysql --defaults-extra-file=$qtmp $pass_through_options ".
"$no_headers $html $ssl $host $user $port $database)";
$interactive_command = $batch_command;
return($batch_command,$interactive_command);
@ -1109,7 +1112,9 @@ sub get_alias {
"$path/dburl.aliases", "$path/dburl.aliases.dist");
for my $alias_file (@search) {
if(-r $alias_file) {
push @urlalias, `cat "$alias_file"`;
open(my $fh, "<", $alias_file) || die;
push @urlalias, <$fh>;
close $fh;
}
}
my ($alias_part,$rest) = $alias=~/(:\w*)(.*)/;

View file

@ -16,15 +16,27 @@ export TIMEOUT=$MAX_SEC_PER_TEST
run_once() {
script=$1
base=`basename "$script" .sh`
diff -Naur wanted-results/"$base" actual-results/"$base" >/dev/null ||
bash "$script" | perl -pe 's:'$HOME':~:g' > actual-results/"$base"
if diff -Naur wanted-results/"$base" actual-results/"$base" >/dev/null; then
true skip
else
(
testsuitedir=$(pwd)
export testsuitedir
cd "$TMPDIR"
bash "$testsuitedir/$script" |
perl -pe 's:'$HOME':~:g' > "$testsuitedir"/actual-results/"$base"
)
fi
}
export -f run_once
run_test() {
script="$1"
base=`basename "$script" .sh`
export TMPDIR=/tmp/"$base"-tmpdir
# Force spaces and < into TMPDIR - this will expose bugs
export TMPDIR=/tmp/"$base-tmp"/'
<'/tmp
rm -rf "$TMPDIR"
mkdir -p "$TMPDIR"
# Clean before. May be owned by other users
sudo rm -f /tmp/*.{tmx,pac,arg,all,log,swp,loa,ssh,df,pip,tmb,chr,tms,par} ||

View file

@ -49,6 +49,10 @@ start_centos3() {
start_centos3
(
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd $testsuitedir
# Copy binaries to server
cd testsuite/vagrant/tange/centos3/ 2>/dev/null
cd vagrant/tange/centos3/ 2>/dev/null

View file

@ -11,8 +11,13 @@ SSHLOGIN1=$SSHUSER1@$SERVER1
echo $SSHUSER1@$SERVER1
ssh $SSHLOGIN1 touch .parallel/will-cite
scp -q .*/src/{parallel,sem,sql,niceload,env_parallel*} $SSHLOGIN1:bin/
(
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd $testsuitedir
scp -q "$testsuitedir"/../src/{parallel,sem,sql,niceload,env_parallel*} $SSHLOGIN1:bin/
)
. `which env_parallel.bash`
env_parallel --session

View file

@ -22,10 +22,10 @@ par_ll_long_followed_by_short() {
par_PARALLEL_HOME_not_exist() {
echo '### bug #62311: --pipepart + ::: fail'
tmp1=$(mktemp)
rm $tmp1
PARALLEL_HOME=$tmp1 parallel echo ::: OK
rm -r $tmp1
tmp1="$(mktemp)"
rm "$tmp1"
PARALLEL_HOME="$tmp1" parallel echo ::: OK
rm -r "$tmp1"
echo Should warn:
PARALLEL_HOME=/does-not-exist parallel -k echo ::: should warn
}
@ -38,10 +38,10 @@ par_colour_failed() {
par_pipepart_triple_colon() {
echo '### bug #62311: --pipepart + ::: fail'
tmp1=$(mktemp)
seq 3 >$tmp1
parallel --pipepart -a $tmp1 wc ::: a
rm $tmp1
tmp1="$(mktemp)"
seq 3 >"$tmp1"
parallel --pipepart -a "$tmp1" wc ::: a
rm "$tmp1"
}
par_open-tty() {
@ -137,11 +137,11 @@ EOF
cat <<'EOF' > "$tmp2"
2: Job:{#} Slot:{%} All:{} Arg[1]:{1} Arg[-1]:{-1} Perl({}+4):{=$_+=4=}
EOF
parallel --colsep , -j2 --cleanup --tmpl $tmp1=t1.{#} --tmpl $tmp2=t2.{%} \
parallel --colsep , -j2 --cleanup --tmpl "$tmp1"=t1.{#} --tmpl "$tmp2"=t2.{%} \
'sleep 0.{#}; cat t1.{#} t2.{%}' ::: 1,a 1,b 2,a 2,b
echo should give no files
ls t[12].*
parallel -j2 --cleanup --tmpl $tmp1=t1.{#} --tmpl $tmp2=t2.{%} \
parallel -j2 --cleanup --tmpl "$tmp1"=t1.{#} --tmpl "$tmp2"=t2.{%} \
'sleep 0.{#}; cat t1.{#} t2.{%}' ::: 1 2 ::: a b
echo should give no files
ls t[12].*
@ -150,12 +150,12 @@ EOF
par_resume_k() {
echo '### --resume -k'
tmp=$(mktemp)
parallel -k --resume --joblog $tmp echo job{}id\;exit {} ::: 0 1 2 3 0 5
parallel -k --resume --joblog "$tmp" echo job{}id\;exit {} ::: 0 1 2 3 0 5
echo try 2 = nothing
parallel -k --resume --joblog $tmp echo job{}id\;exit {} ::: 0 1 2 3 0 5
parallel -k --resume --joblog "$tmp" echo job{}id\;exit {} ::: 0 1 2 3 0 5
echo two extra
parallel -k --resume --joblog $tmp echo job{}id\;exit 0 ::: 0 1 2 3 0 5 6 7
rm -f $tmp
parallel -k --resume --joblog "$tmp" echo job{}id\;exit 0 ::: 0 1 2 3 0 5 6 7
rm -f "$tmp"
}
par_empty_string_quote() {
@ -415,10 +415,10 @@ par_argfile() {
echo '### Test -a and --arg-file: Read input from file instead of stdin'
tmp=$(mktemp)
seq 1 10 >$tmp
parallel -k -a $tmp echo
parallel -k --arg-file $tmp echo
rm $tmp
seq 1 10 >"$tmp"
parallel -k -a "$tmp" echo
parallel -k --arg-file "$tmp" echo
rm "$tmp"
}
par_pipe_unneeded_procs() {
@ -453,19 +453,19 @@ par_pipepart_roundrobin() {
echo '### bug #45769: --round-robin --pipepart gives wrong results'
tmp=$(mktemp)
seq 10000 >$tmp
parallel -j2 --pipepart -a $tmp --block 14 --round-robin wc | wc -l
rm $tmp
seq 10000 >"$tmp"
parallel -j2 --pipepart -a "$tmp" --block 14 --round-robin wc | wc -l
rm "$tmp"
}
par_pipepart_header() {
echo '### bug #44614: --pipepart --header off by one'
tmp=$(mktemp)
seq 10 >$tmp
parallel --pipepart -a $tmp -k --block 5 'echo foo; cat'
parallel --pipepart -a $tmp -k --block 2 --regexp --recend 3'\n' 'echo foo; cat'
rm $tmp
seq 10 >"$tmp"
parallel --pipepart -a "$tmp" -k --block 5 'echo foo; cat'
parallel --pipepart -a "$tmp" -k --block 2 --regexp --recend 3'\n' 'echo foo; cat'
rm "$tmp"
}
par_quote() {
@ -492,9 +492,9 @@ par_read_from_stdin() {
par_total_from_joblog() {
echo 'bug #47086: [PATCH] Initialize total_completed from joblog'
tmp=$(mktemp)
parallel -j1 --joblog $tmp --halt now,fail=1 echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
parallel -j1 --joblog $tmp --halt now,fail=1 --resume echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
rm $tmp
parallel -j1 --joblog "$tmp" --halt now,fail=1 echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
parallel -j1 --joblog "$tmp" --halt now,fail=1 --resume echo '{= $_=$Global::total_completed =};exit {}' ::: 0 0 0 1 0 0
rm "$tmp"
}
par_xapply() {
@ -626,10 +626,10 @@ par_empty_line() {
par_append_joblog() {
echo '### can you append to a joblog using +'
tmp=$(mktemp)
parallel --joblog $tmp echo ::: 1
parallel --joblog +$tmp echo ::: 1
wc -l < $tmp
rm $tmp
parallel --joblog "$tmp" echo ::: 1
parallel --joblog +"$tmp" echo ::: 1
wc -l < "$tmp"
rm "$tmp"
}
par_file_ending_in_newline() {
@ -653,16 +653,16 @@ par_python_children() {
par_pipepart_block_bigger_2G() {
echo '### Test that --pipepart can have blocks > 2GB'
tmp=$(mktemp)
echo foo >$tmp
parallel --pipepart -a $tmp --block 3G wc
rm $tmp
echo foo >"$tmp"
parallel --pipepart -a "$tmp" --block 3G wc
rm "$tmp"
}
par_retries_replacement_string() {
tmp=$(mktemp)
parallel --retries {//} "echo {/} >>$tmp;exit {/}" ::: 1/11 2/22 3/33
sort $tmp
rm $tmp
parallel --retries {//} "echo {/} >>'$tmp';exit {/}" ::: 1/11 2/22 3/33
sort "$tmp"
rm "$tmp"
}
par_tee() {
@ -693,17 +693,17 @@ par_basic_halt() {
cpuburn=$(mktemp)
cpuburn2=$(mktemp)
(echo '#!/usr/bin/perl'
echo "eval{setpriority(0,0,9)}; while(1){}") > $cpuburn
chmod 700 $cpuburn
cp -a $cpuburn $cpuburn2
echo "eval{setpriority(0,0,9)}; while(1){}") > "$cpuburn"
chmod 700 "$cpuburn"
cp -a "$cpuburn" "$cpuburn2"
parallel -j4 --halt 2 ::: 'sleep 1' $cpuburn false;
killall $(basename $cpuburn) 2>/dev/null &&
parallel -0 -j4 --halt 2 ::: 'sleep 1' "'$cpuburn'" false;
killall $(basename "$cpuburn") 2>/dev/null &&
echo ERROR: cpuburn should already have been killed
parallel -j4 --halt -2 ::: 'sleep 1' $cpuburn2 true;
killall $(basename $cpuburn2) 2>/dev/null &&
parallel -0 -j4 --halt -2 ::: 'sleep 1' "'$cpuburn2'" true;
killall $(basename "$cpuburn2") 2>/dev/null &&
echo ERROR: cpuburn2 should already have been killed
rm $cpuburn $cpuburn2
rm "$cpuburn" "$cpuburn2"
parallel --halt error echo ::: should not print
parallel --halt soon echo ::: should not print
@ -722,12 +722,12 @@ par_wd_3dot_local() {
echo 'bug #45993: --wd ... should also work when run locally'
(
parallel --wd /bi 'pwd; echo $OLDPWD; echo' ::: fail
parallel --wd /bin 'pwd; echo $OLDPWD; echo' ::: OK
parallel --wd / 'pwd; echo $OLDPWD; echo' ::: OK
parallel --wd /tmp 'pwd; echo $OLDPWD; echo' ::: OK
parallel --wd ... 'pwd; echo $OLDPWD; echo' ::: OK
parallel --wd . 'pwd; echo $OLDPWD; echo' ::: OK
parallel --wd /bi 'pwd; echo "$OLDPWD"; echo' ::: fail
parallel --wd /bin 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd / 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd /tmp 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd ... 'pwd; echo "$OLDPWD"; echo' ::: OK
parallel --wd . 'pwd; echo "$OLDPWD"; echo' ::: OK
) |
perl -pe 's:/mnt/4tb::; s:/home/tange:~:;' |
perl -pe 's:parallel./:parallel/:;' |
@ -747,21 +747,24 @@ par_X_eta_div_zero() {
par_parcat_args_stdin() {
echo 'bug #51690: parcat: read args from stdin'
# parcat reads files line by line
# so this does not work if TMPDIR contains \n
TMPDIR='/tmp/Y/ </i'
mkdir -p "$TMPDIR"
tmp1=$(mktemp)
tmp2=$(mktemp)
echo OK1 > $tmp1
echo OK2 > $tmp2
(echo $tmp1
echo $tmp2) | parcat | sort
rm $tmp1 $tmp2
echo OK1 > "$tmp1"
echo OK2 > "$tmp2"
(echo "$tmp1"; echo "$tmp2") | parcat | sort
rm "$tmp1" "$tmp2"
}
par_parcat_rm() {
echo 'bug #51691: parcat --rm remove fifo when opened'
tmp1=$(mktemp)
echo OK1 > $tmp1
parcat --rm $tmp1
rm $tmp1 2>/dev/null || echo OK file removed
echo OK1 > "$tmp1"
parcat --rm "$tmp1"
rm "$tmp1" 2>/dev/null || echo OK file removed
}
par_linebuffer_files() {
@ -795,10 +798,10 @@ par_blocking_redir() {
par_pipepart_recend_recstart() {
echo 'bug #52343: --recend/--recstart does wrong thing with --pipepart'
tmp1=$(mktemp)
seq 10 > $tmp1
parallel -k --pipepart -a $tmp1 --recend '\n' --recstart '6' --block 1 'echo a; cat'
parallel -k --pipe < $tmp1 --recend '\n' --recstart '6' --block 1 'echo a; cat'
rm $tmp1 2>/dev/null
seq 10 > "$tmp1"
parallel -k --pipepart -a "$tmp1" --recend '\n' --recstart '6' --block 1 'echo a; cat'
parallel -k --pipe < "$tmp1" --recend '\n' --recstart '6' --block 1 'echo a; cat'
rm "$tmp1" 2>/dev/null
}
par_pipe_tag_v() {
@ -812,11 +815,11 @@ par_pipe_tag_v() {
par_dryrun_append_joblog() {
echo '--dry-run should not append to joblog'
tmp=$(mktemp)
parallel -k --jl $tmp echo ::: 1 2 3
parallel --dryrun -k --jl +$tmp echo ::: 1 2 3 4
parallel -k --jl "$tmp" echo ::: 1 2 3
parallel --dryrun -k --jl +"$tmp" echo ::: 1 2 3 4
# Job 4 should not show up: 3 lines + header = 4
wc -l < $tmp
rm $tmp
wc -l < "$tmp"
rm "$tmp"
}
par_0_no_newline() {
@ -869,7 +872,7 @@ par_results() {
tmp=$(mktemp)
parallel -k --results "$tmp"-dir echo ::: a b c
cat "$tmp"-dir/*/*/stdout
rm -r $tmp "$tmp"-dir
rm -r "$tmp" "$tmp"-dir
}
par_results_json() {
@ -877,7 +880,7 @@ par_results_json() {
tmp=$(mktemp -d)
parallel -k --results "$tmp"/foo.json seq ::: 2 3 ::: 4 5
cat "$tmp"/foo.json | perl -pe 's/\d+\.\d{3}/9.999/g'
rm -r $tmp
rm -r "$tmp"
parallel -k --results -.json seq ::: 2 3 ::: 4 5 |
perl -pe 's/\d+\.\d{3}/9.999/g'
}
@ -908,15 +911,15 @@ par_PARALLEL_ENV() {
PARALLEL_ENV="v='OK as variable'" parallel {} '$v' ::: echo
PARALLEL_ENV=$(mktemp)
echo '### PARALLEL_ENV as file'
echo "v='OK as file'" > $PARALLEL_ENV
echo "v='OK as file'" > "$PARALLEL_ENV"
PARALLEL_ENV="$PARALLEL_ENV" parallel {} '$v' ::: echo
echo '### PARALLEL_ENV as fifo'
rm $PARALLEL_ENV
mkfifo $PARALLEL_ENV
rm "$PARALLEL_ENV"
mkfifo "$PARALLEL_ENV"
# () needed to avoid [1]+ Done
(echo "v='OK as fifo'" > $PARALLEL_ENV &) 2>/dev/null
(echo "v='OK as fifo'" > "$PARALLEL_ENV" &) 2>/dev/null
PARALLEL_ENV="$PARALLEL_ENV" parallel {} '$v' ::: echo
rm $PARALLEL_ENV
rm "$PARALLEL_ENV"
}
par_pipe_recend() {
@ -1050,7 +1053,7 @@ par_profile() {
parallel -J ./testprofile_local echo ::: local
rm testprofile_local
echo --tag > testprofile_abs
parallel -J `pwd`/testprofile_abs echo ::: abs
parallel -J "`pwd`"/testprofile_abs echo ::: abs
rm testprofile_abs
echo --tag > ~/.parallel/testprofile_config
parallel -J testprofile_config echo ::: config

View file

@ -51,31 +51,32 @@ par_load_from_PARALLEL() {
}
par_quote_special_results() {
echo "### Test --results on file systems with limited UTF8 support"
doit() {
mkfs=$1
img=$(mktemp /dev/shm/par-test-loop-XXXX.img)
dir=$(mktemp -d /tmp/par-test-loop-XXXX)
dd if=/dev/zero bs=1000k count=150 > $img
dd if=/dev/zero bs=1000k count=150 > "$img"
# Use the mkfs.$filesystem
$mkfs $img
sudo mount $img $dir -oloop,uid=`id -u` 2>/dev/null ||
sudo mount $img $dir -oloop
cd $dir
$mkfs "$img"
sudo mount "$img" "$dir" -oloop,uid=`id -u` 2>/dev/null ||
sudo mount "$img" "$dir" -oloop
cd "$dir"
sudo chown `id -u` .
df $dir
df "$dir"
printf "%s\0" '' +m . +_ .. +__ ,. ,.. + ++ / +z |
parallel -0 --results a echo
find a | sort
(cd a/1 && find . -type d | sort | fmt -2000)
seq 128 | perl -ne 'printf "%c\0",$_' |
parallel -0 --results b128 echo
find b128 | sort
(cd b128/1 && find . -type d | sort | fmt -2000)
seq 128 255 | perl -ne 'printf "%c\0",$_' |
parallel -0 --results b255 echo
find b255 | sort
(cd b255/1 && find . -type d | sort | fmt -2000)
cd
sudo umount $dir
rm -r $dir/
rm $img
sudo umount "$dir"
rmdir "$dir"/
rm "$img"
}
export -f doit
stdout parallel -k --tag --plus doit ::: \
@ -83,7 +84,7 @@ par_quote_special_results() {
"mkfs.reiserfs -fq" "mkfs.ntfs -F" "mkfs.xfs -f" mkfs.minix \
mkfs.fat mkfs.vfat mkfs.msdos mkfs.f2fs |
perl -pe 's:(/dev/loop|par-test-loop)\S+:$1:g;s/ +/ /g' |
G -v MB/s -v UUID -v Binutils
G --v MB/s GB/s UUID Binutils
# Skip:
# mkfs.bfs - ro
# mkfs.cramfs - ro
@ -297,12 +298,13 @@ par_failing_compressor() {
,,, files --files -k \
,,, comp 'cat;true' 'cat;false' \
,,, decomp 'cat;true' 'cat;false' |
perl -pe 's:/par......par:/tmpfile:'
perl -pe 's:/.*par......par:/tmpfile:'
}
par_fifo_under_csh() {
echo '### Test --fifo under csh'
# csh does not seem to work with TMPDIR containing \n
TMPDIR=/tmp
csh -c "seq 3000000 | parallel -k --pipe --fifo 'sleep .{#};cat {}|wc -c ; false; echo \$status; false'"
echo exit $?
}
@ -531,28 +533,17 @@ par_sem_2jobs() {
echo done
}
par_semaphore() {
echo '### Test if parallel invoked as sem will run parallel --semaphore'
sem --id as_sem -u -j2 'echo job1a 1; sleep 3; echo job1b 3'
sleep 0.5
sem --id as_sem -u -j2 'echo job2a 2; sleep 3; echo job2b 5'
sleep 0.5
sem --id as_sem -u -j2 'echo job3a 4; sleep 3; echo job3b 6'
sem --id as_sem --wait
echo done
}
par_line_buffer() {
echo "### --line-buffer"
tmp1=$(mktemp)
tmp2=$(mktemp)
seq 10 | parallel -j20 --line-buffer 'seq {} 10 | pv -qL 10' > $tmp1
seq 10 | parallel -j20 'seq {} 10 | pv -qL 10' > $tmp2
cat $tmp1 | wc
diff $tmp1 $tmp2 >/dev/null
seq 10 | parallel -j20 --line-buffer 'seq {} 10 | pv -qL 10' > "$tmp1"
seq 10 | parallel -j20 'seq {} 10 | pv -qL 10' > "$tmp2"
cat "$tmp1" | wc
diff "$tmp1" "$tmp2" >/dev/null
echo These must diff: $?
rm $tmp1 $tmp2
rm "$tmp1" "$tmp2"
}
par_pipe_line_buffer() {
@ -568,17 +559,19 @@ par_pipe_line_buffer() {
}
export PARALLEL="-N10 -L1 --pipe -j20 --tagstring {#}"
seq 200| parallel --line-buffer pv -qL 10 > $tmp1 2> >(nowarn)
seq 200| parallel pv -qL 10 > $tmp2 2> >(nowarn)
cat $tmp1 | wc
diff $tmp1 $tmp2 >/dev/null
seq 200| parallel --line-buffer pv -qL 10 > "$tmp1" 2> >(nowarn)
seq 200| parallel pv -qL 10 > "$tmp2" 2> >(nowarn)
cat "$tmp1" | wc
diff "$tmp1" "$tmp2" >/dev/null
echo These must diff: $?
rm $tmp1 $tmp2
rm "$tmp1" "$tmp2"
}
par_pipe_line_buffer_compress() {
echo "### --pipe --line-buffer --compress"
seq 200| parallel -N10 -L1 --pipe -j20 --line-buffer --compress --tagstring {#} pv -qL 10 | wc
seq 200 |
parallel -N10 -L1 --pipe -j20 --line-buffer --compress --tagstring {#} pv -qL 10 |
wc
}
par__pipepart_spawn() {
@ -610,9 +603,9 @@ par__pipepart_tee() {
head -c 100M;
}
tmp=$(mktemp)
random100M >$tmp
random100M >"$tmp"
parallel --pipepart --tee -a $tmp cat ::: {1..3} | LC_ALL=C wc -c
rm $tmp
rm "$tmp"
}
par_k() {
@ -671,7 +664,7 @@ par_results_csv() {
export -f doit
parallel -k --tag doit ::: '--header :' '' \
::: --tag '' ::: --files '' ::: --compress '' |
perl -pe 's:/par......par:/tmpfile:g;s/\d+\.\d+/999.999/g'
perl -pe 's:/.*par......par:/tmpfile:g;s/\d+\.\d+/999.999/g'
}
par_kill_children_timeout() {
@ -694,7 +687,7 @@ par_kill_children_timeout() {
par_tmux_fg() {
echo 'bug #50107: --tmux --fg should also write how to access it'
stdout parallel --tmux --fg sleep ::: 3 | perl -pe 's/.tmp\S+/tmp/'
stdout parallel --tmux --fg sleep ::: 3 | perl -pe 's:/tmp.*tms.....:tmpfile:'
}
@ -769,6 +762,6 @@ compgen -A function | grep par_ | LC_ALL=C sort |
parallel --timeout 1000% -j10 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1' |
perl -pe 's/,31,0/,15,0/' |
# Replace $PWD with . even if given as ~/...
perl -pe 's:~:'$HOME':g' |
perl -pe 's:'$PWD':.:g' |
perl -pe 's:'$HOME':~:g'
perl -pe 's:~:'"$HOME"':g' |
perl -pe 's:'"$PWD"':.:g' |
perl -pe 's:'"$HOME"':~:g'

View file

@ -102,7 +102,7 @@ par_compute_command_len() {
}
par_skip_first_line() {
tmp=$(mktemp)
tmp="$(mktemp)"
(echo `seq 10000`;echo MyHeader; seq 10) |
parallel -k --skip-first-line --pipe --block 10 --header '1' cat
(echo `seq 10000`;echo MyHeader; seq 10) > "$tmp"
@ -152,21 +152,21 @@ par_uninstalled_sshpass() {
}
par_results_compress() {
tmpdir=$(mktemp)
tmpdir="$(mktemp)"
rm -r "$tmpdir"
parallel --results $tmpdir --compress echo ::: 1
parallel --results "$tmpdir" --compress echo ::: 1
cat "$tmpdir"/*/*/stdout | pzstd -qdc
rm -r "$tmpdir"
parallel --results $tmpdir echo ::: 1
parallel --results "$tmpdir" echo ::: 1
cat "$tmpdir"/*/*/stdout
rm -r "$tmpdir"
parallel --results $tmpdir --compress echo ::: ' ' /
parallel --results "$tmpdir" --compress echo ::: ' ' /
cat "$tmpdir"/*/*/stdout | pzstd -qdc
rm -r "$tmpdir"
parallel --results $tmpdir echo ::: ' ' /
parallel --results "$tmpdir" echo ::: ' ' /
cat "$tmpdir"/*/*/stdout
rm -r "$tmpdir"
@ -197,11 +197,15 @@ par_open_files_blocks() {
par_pipe_unneeded_procs() {
echo 'bug #34241: --pipe should not spawn unneeded processes - part 2'
tmp="$(mktemp -d)"
cd "$tmp"
seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files wc >/dev/null
ls *.par | wc -l; rm *.par
seq 500 | parallel --tmpdir . -j10 --pipe --block 1k --files --dry-run wc >/dev/null
echo No .par should exist
stdout ls *.par
cd ..
rm -r "$tmp"
}
par_interactive() {
@ -1065,11 +1069,11 @@ par_pipepart_block() {
}
par_block_negative_prefix() {
tmp=`mktemp`
seq 100000 > $tmp
tmp="$(mktemp)"
seq 100000 > "$tmp"
echo '### This should generate 10*2 jobs'
parallel -j2 -a $tmp --pipepart --block -0.01k -k md5sum | wc
rm $tmp
parallel -j2 -a "$tmp" --pipepart --block -0.01k -k md5sum | wc
rm "$tmp"
}
par_sql_colsep() {

View file

@ -307,12 +307,12 @@ par_groupby_pipepart() {
generator="$1"
colsep="$2"
groupby="$3"
tmp=`mktemp`
tmp=$(mktemp)
echo "### test $generator | --colsep $colsep --groupby $groupby"
$generator > $tmp
$generator > "$tmp"
parallel --header 1 --pipepart -k \
-a $tmp --colsep "$colsep" --groupby "$groupby" 'echo NewRec; wc'
-a "$tmp" --colsep "$colsep" --groupby "$groupby" 'echo NewRec; wc'
}
export -f tester
parallel --tag -k tester \
@ -348,7 +348,7 @@ par_memory_leak() {
export -f a_run
echo "### Test for memory leaks"
echo "Of 300 runs of 1 job at least one should be bigger than a 3000 job run"
. `which env_parallel.bash`
. $(which env_parallel.bash)
parset small_max,big ::: 'seq 300 | parallel a_run 1 | jq -s max' 'a_run 3000'
if [ $small_max -lt $big ] ; then
echo "Bad: Memleak likely."
@ -571,4 +571,4 @@ par_test_ipv6_format() {
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
# parallel --delay 0.3 --timeout 1000% -j6 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'
parallel --delay 0.3 --timeout 1000% -j6 --lb --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'
parallel --delay 0.3 --timeout 3000% -j6 --lb --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -22,9 +22,9 @@ par_retries_0() {
echo '--retries 0 = inf'
echo this wraps at 256 and should retry until it wraps
tmp=$(mktemp)
parallel --retries 0 -u 'printf {} >> '$tmp';a=`stat -c %s '$tmp'`; echo -n " $a"; exit $a' ::: a
parallel --retries 0 -u 'printf {} >> '"'$tmp'"';a=`stat -c %s '"'$tmp'"'`; echo -n " $a"; exit $a' ::: a
echo
rm -f $tmp
rm -f "$tmp"
}
par_prefix_for_L_n_N_s() {
@ -135,7 +135,10 @@ EOF
}
export -f run gp oct pl py r rb sh
parallel --tag -k run ::: gp oct pl py r rb sh
parallel --tag -k run ::: gp oct pl py rb sh
# R fails if TMPDIR contains space
TMPDIR=/tmp
parallel --tag -k run ::: r
}
par_pipe_regexp() {
@ -300,8 +303,8 @@ par_tee_with_premature_close() {
correct="$(seq 1000000 | parallel -k --tee --pipe ::: wc head tail 'sleep 1')"
echo "$correct"
echo 'tee without --output-error=warn-nopipe support'
tmpdir=$(mktemp)
cat > tmp/tee <<-EOF
tmpdir=$(mktemp -d)
cat > "$tmpdir"/tee <<-EOF
#!/usr/bin/perl
if(grep /output-error=warn-nopipe/, @ARGV) {
@ -309,8 +312,8 @@ par_tee_with_premature_close() {
}
exec "/usr/bin/tee", @ARGV;
EOF
chmod +x tmp/tee
PATH=tmp:$PATH
chmod +x "$tmpdir"/tee
PATH="$tmpdir":$PATH
# This gives incomplete output due to:
# * tee not supporting --output-error=warn-nopipe
# * sleep closes stdin before EOF
@ -321,6 +324,8 @@ par_tee_with_premature_close() {
else
echo OK
fi
rm "$tmpdir"/tee
rmdir "$tmpdir"
}
par_tee_too_many_args() {

View file

@ -6,7 +6,7 @@
setup() {
tmp=$(mktemp)
perl -pe 's/\n/\n\0/' >$tmp <<EOF
perl -pe 's/\n/\n\0/' >"$tmp" <<EOF
chr1 1 Sample 1
chr1 11 Sample 1
chr1 111 Sample 1
@ -67,10 +67,10 @@ EOF
parsort_test() {
echo "### parsort $@"
parsort "$@" $tmp | md5sum
sort "$@" $tmp | md5sum
parsort "$@" < $tmp | md5sum
sort "$@" < $tmp | md5sum
parsort "$@" "$tmp" | md5sum
sort "$@" "$tmp" | md5sum
parsort "$@" < "$tmp" | md5sum
sort "$@" < "$tmp" | md5sum
}
export -f parsort_test

View file

@ -22,9 +22,9 @@ par_parcat_mixing() {
echo 'parcat output should mix: a b a b'
mktempfifo() {
tmp=$(mktemp)
rm $tmp
mkfifo $tmp
echo $tmp
rm "$tmp"
mkfifo "$tmp"
echo "$tmp"
}
slow_output() {
string=$1
@ -34,10 +34,10 @@ par_parcat_mixing() {
}
tmp1=$(mktempfifo)
tmp2=$(mktempfifo)
slow_output a > $tmp1 &
slow_output a > "$tmp1" &
sleep 1
slow_output b > $tmp2 &
parcat $tmp1 $tmp2 | tr -s ab
slow_output b > "$tmp2" &
parcat "$tmp1" "$tmp2" | tr -s ab
}
par_tmux_termination() {

View file

@ -6,6 +6,17 @@
# These fail regularly
par_semaphore() {
echo '### Test if parallel invoked as sem will run parallel --semaphore'
sem --id as_sem -u -j2 'echo job1a 1; sleep 3; echo job1b 3'
sleep 0.5
sem --id as_sem -u -j2 'echo job2a 2; sleep 3; echo job2b 5'
sleep 0.5
sem --id as_sem -u -j2 'echo job3a 4; sleep 3; echo job3b 6'
sem --id as_sem --wait
echo done
}
ctrlz_should_suspend_children() {
echo 'bug #46120: Suspend should suspend (at least local) children'
echo 'it should burn 1.9 CPU seconds, but no more than that'
@ -52,7 +63,7 @@ par_sql_CSV() {
par_hostgroup() {
echo '### --hostgroup force ncpu'
parallel --delay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8} | sort
parallel --delay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8} | sort -u
echo '### --hostgroup two group arg'
parallel -k --sshdelay 0.1 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.3{} ::: {1..8}@g1+g2 | sort
@ -61,7 +72,7 @@ par_hostgroup() {
parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g2/3/lo whoami\;sleep 0.4{} ::: {1..8}@g2
echo '### --hostgroup multiple group arg + unused group'
parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g1/3/lo -S @g3/100/tcsh@lo whoami\;sleep 0.8{} ::: {1..8}@g1+g2 | sort
parallel --delay 0.2 --hgrp -S @g1/1/parallel@lo -S @g1/3/lo -S @g3/100/tcsh@lo whoami\;sleep 0.8{} ::: {1..8}@g1+g2 | sort -u
echo '### --hostgroup two groups @'
parallel -k --hgrp -S @g1/parallel@lo -S @g2/lo --tag whoami\;echo ::: parallel@g1 tange@g2
@ -73,7 +84,7 @@ par_hostgroup() {
parallel -k --hostgroups -S parallel@lo echo ::: no_group implicit_group@parallel@lo
echo '### --hostgroup -S @group'
parallel -S @g1/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort
parallel -S @g1/ -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort -u
echo '### --hostgroup -S @group1 -Sgrp2'
parallel -S @g1/ -S @g2 -S @g1/1/tcsh@lo -S @g1/1/localhost -S @g2/1/parallel@lo whoami\;true ::: {1..6} | sort
@ -155,15 +166,15 @@ par_kill_hup() {
par_resume_failed_k() {
echo '### bug #38299: --resume-failed -k'
tmp=$(mktemp)
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
echo try 2. Gives failing - not 0
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
echo with exit 0
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit 0 ::: 0 1 2 3 0 1
parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit 0 ::: 0 1 2 3 0 1
sleep 0.5
echo try 2 again. Gives empty
parallel -k --resume-failed --joblog $tmp echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
rm $tmp
parallel -k --resume-failed --joblog "$tmp" echo job{#} val {}\;exit {} ::: 0 1 2 3 0 1
rm "$tmp"
}
par_testhalt() {

View file

@ -28,8 +28,8 @@ p_wrapper() {
echo Exit=$?
wait
echo Exit=$?
$DEBUG && sort -u $T1 $T2;
rm $T1 $T2
$DEBUG && sort -u "$T1" "$T2";
rm "$T1" "$T2"
p_showsqlresult $SERVERURL $TABLE
$DEBUG || sql $SERVERURL "drop table $TABLE;" >/dev/null 2>/dev/null
}
@ -38,9 +38,9 @@ p_template() {
(
# Make sure all jobs are inserted before starting a worker
sleep 10;
parallel --sqlworker $DBURL "$@" sleep .3\;echo >$T1
parallel --sqlworker $DBURL "$@" sleep .3\;echo >"$T1"
) &
parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >$T2;
parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
}
par_sqlandworker() {
@ -68,35 +68,35 @@ par_sqlandworker_total_jobs() {
}
par_append_different_cmd() {
parallel --sqlmaster $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} >$T2;
parallel --sqlmaster +$DBURL sleep .3\;echo {2}-{1} ::: {11..15} ::: {A..E} >>$T2;
parallel --sqlworker $DBURL >$T1
parallel --sqlmaster "$DBURL" sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlmaster +"$DBURL" sleep .3\;echo {2}-{1} ::: {11..15} ::: {A..E} >>"$T2";
parallel --sqlworker "$DBURL" >"$T1"
}
par_shuf() {
MD5=$(echo $SERVERURL | md5sum | perl -pe 's/(...).*/$1/')
T=/tmp/parallel-bug49791-$MD5
[ -e $T ] && rm -rf $T
export PARALLEL="--shuf --result $T"
MD5=$(echo "$SERVERURL" | md5sum | perl -pe 's/(...).*/$1/')
T=/tmp/parallel-bug49791-" <$MD5"
[ -e "$T" ] && rm -rf "$T"
export PARALLEL="--shuf --result '$T'"
parallel --sqlandworker $DBURL sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2;
parallel --sqlworker $DBURL >$T2 &
parallel --sqlworker $DBURL >$T2 &
parallel --sqlworker $DBURL >$T2 &
parallel --sqlworker $DBURL >$T2 &
::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker $DBURL >"$T2" &
parallel --sqlworker $DBURL >"$T2" &
parallel --sqlworker $DBURL >"$T2" &
parallel --sqlworker $DBURL >"$T2" &
unset PARALLEL
wait;
# Did it compute correctly?
cat $T/1/*/*/*/stdout
cat "$T"/1/*/*/*/stdout
# Did it shuffle
SHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
export PARALLEL="--result $T"
parallel --sqlandworker $DBURL sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2;
parallel --sqlworker $DBURL >$T2 &
parallel --sqlworker $DBURL >$T2 &
parallel --sqlworker $DBURL >$T2 &
parallel --sqlworker $DBURL >$T2 &
SHUF=$(sql "$SERVERURL" "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
export PARALLEL="--result '$T'"
parallel --sqlandworker "$DBURL" sleep .3\;echo \
::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker "$DBURL" >"$T2" &
parallel --sqlworker "$DBURL" >"$T2" &
parallel --sqlworker "$DBURL" >"$T2" &
parallel --sqlworker "$DBURL" >"$T2" &
unset PARALLEL
wait;
NOSHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
@ -104,8 +104,8 @@ par_shuf() {
if [ $DIFFSIZE -gt 2500 ]; then
echo OK: Diff bigger than 2500 char
fi
[ -e $T ] && rm -rf $T
touch $T1
[ -e "$T" ] && rm -rf "$T"
touch "$T1"
}
par_sql_joblog() {
@ -115,10 +115,10 @@ par_sql_joblog() {
perl -pe 's/\d+\.\d+/999.999/g' | sort -n &
sleep 0.5
T=$(mktemp)
parallel -k --joblog - --sqlworker $DBURL > $T
parallel -k --joblog - --sqlworker $DBURL > "$T"
wait
# Needed because of race condition
cat $T; rm $T
cat "$T"; rm "$T"
echo '### --sqlandworker'
parallel -k --joblog - --sqlandworker $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} |
perl -pe 's/\d+\.\d+/999.999/g' | sort -n

View file

@ -38,8 +38,8 @@ p_wrapper() {
wait
echo Exit=$?
# For debugging show the tempfiles
$DEBUG && sort -u $T1 $T2;
rm $T1 $T2
$DEBUG && sort -u "$T1" "$T2";
rm "$T1" "$T2"
p_showsqlresult $SERVERURL $TABLE
# Drop the table if not debugging
$DEBUG || sql $SERVERURL "drop table $TABLE;" >/dev/null 2>/dev/null
@ -50,9 +50,9 @@ p_template() {
(
# Make sure there is work to be done
sleep 6;
parallel --sqlworker $DBURL "$@" sleep .3\;echo >$T1
parallel --sqlworker $DBURL "$@" sleep .3\;echo >"$T1"
) &
parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >$T2;
parallel --sqlandworker $DBURL "$@" sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
}
par_sqlandworker() {
@ -92,9 +92,9 @@ par_sqlandworker_total_jobs() {
}
par_append() {
parallel --sqlmaster $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} >$T2;
parallel --sqlmaster +$DBURL sleep .3\;echo ::: {11..15} ::: {A..E} >>$T2;
parallel --sqlworker $DBURL sleep .3\;echo >$T1
parallel --sqlmaster $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} >"$T2";
parallel --sqlmaster +$DBURL sleep .3\;echo ::: {11..15} ::: {A..E} >>"$T2";
parallel --sqlworker $DBURL sleep .3\;echo >"$T1"
}
par_shuf() {
@ -103,11 +103,11 @@ par_shuf() {
[ -e $T ] && rm -rf $T
export PARALLEL="--shuf --result $T"
parallel --sqlandworker $DBURL sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2;
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
unset PARALLEL
wait;
# Did it compute correctly?
@ -116,11 +116,11 @@ par_shuf() {
SHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
export PARALLEL="--result $T"
parallel --sqlandworker $DBURL sleep .3\;echo \
::: {1..5} ::: {a..e} >$T2;
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
parallel --sqlworker $DBURL sleep .3\;echo >$T2 &
::: {1..5} ::: {a..e} >"$T2";
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
parallel --sqlworker $DBURL sleep .3\;echo >"$T2" &
unset PARALLEL
wait;
NOSHUF=$(sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;")
@ -129,7 +129,7 @@ par_shuf() {
echo OK: Diff bigger than 2500 char
fi
[ -e $T ] && rm -rf $T
touch $T1
touch "$T1"
}
par_empty() {

View file

@ -28,8 +28,8 @@ par_few_duplicate_run() {
wait
) | wc -l)
sql "$1" "drop table $TABLE;"
if [ $lines -gt 105 ] ; then
echo Error: $lines are more than 5% duplicates
if [ $lines -gt 110 ] ; then
echo Error: $lines are more than 10% duplicates
else
echo OK
fi

View file

@ -60,6 +60,8 @@ par_pipe_unneeded_spawn() {
par_files_nonall() {
echo '### bug #40002: --files and --nonall seem not to work together:'
# --files does not work with TMPDIR containing \n
TMPDIR=/tmp
parallel --files --nonall -S localhost true | tee >(parallel rm) | wc -l
}

View file

@ -109,9 +109,9 @@ par_bigvar_rc() {
par_tmux_different_shells() {
echo '### Test tmux works on different shells'
(stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux echo ::: 1 2 3 4; echo $?) |
grep -v 'See output';
grep -v 'attach';
(stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?) |
grep -v 'See output';
grep -v 'attach';
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';
@ -128,16 +128,16 @@ par_tmux_different_shells() {
par_tmux_length() {
echo '### works'
stdout parallel -Sparallel@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ |
perl -pe 's:/tmp/\S+::'
perl -pe 's:/tmp/.*tms.....::'
stdout parallel -Sparallel@lo --tmux echo ::: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
perl -pe 's:/tmp/\S+::'
perl -pe 's:/tmp/.*tms.....::'
echo '### These blocked due to length'
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'
stdout parallel -Slo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Scsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Stcsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Szsh@lo --tmux echo ::: \\\\\\\"\\\\\\\"\\\;\@ | grep -v 'attach'
stdout parallel -Scsh@lo --tmux echo ::: 111111111111111111111111111111111111111111111111111111111 | grep -v 'attach'
}
par_transfer_return_multiple_inputs() {

View file

@ -1,11 +1,29 @@
#!/bin/bash
# SPDX-FileCopyrightText: 2021-2022 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
# SPDX-FileCopyrightText: 2021-2023 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
#
# SPDX-License-Identifier: GPL-3.0-or-later
# SSH only allowed to localhost/lo
par_ssh_cmd_with_newline() {
echo '### Check --ssh with \n works'
ssh=$(mktemp)
cp -a /usr/bin/ssh "$ssh"
parallel --ssh "'$ssh'" -S sh@lo ::: id
}
par_controlmaster() {
echo '### Check -M works if TMPDIR contains space'
(
seq 1 3 | parallel -j10 --retries 3 -k -M -S sh@lo echo
seq 1 3 | parallel -j10 --retries 3 -k -M -S sh@lo echo
)
echo Part2
parallel -j1 -k -M -S sh@lo echo ::: OK
}
par_autossh() {
echo '### --ssh autossh'
(

View file

@ -5,6 +5,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later
echo '### Test with old perl libs'
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd "$testsuitedir"
# Old libraries are put into input-files/perllib
PERL5LIB=input-files/perllib:../input-files/perllib; export PERL5LIB

View file

@ -4,11 +4,15 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
rm -rf tmp 2>/dev/null
cd input-files
(
cd "$testsuitedir"/input-files
tar xjf random_dirs_no_newline.tar.bz2
cd ..
cp -a input-files/random_dirs_no_newline tmp
)
cp -a "$testsuitedir"/input-files/random_dirs_no_newline tmp
cd tmp
echo '### Tests if special dir names causes problems'

View file

@ -7,8 +7,10 @@
TMP=/run/shm/parallel_local105
rm -rf $TMP 2>/dev/null
mkdir -p $TMP
tar -C $TMP -xf input-files/random_dirs_with_newline.tar.bz2
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
tar -C $TMP -xf "$testsuitedir"/input-files/random_dirs_with_newline.tar.bz2
cd $TMP/random_dirs_with_newline
# tests if special dir names causes problems

View file

@ -6,7 +6,11 @@
echo '### Tests from xargs'
rsync -Ha --delete input-files/xargs-inputs/ tmp/
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
rsync -Ha --delete "$testsuitedir"/input-files/xargs-inputs/ tmp/
cd tmp
PARALLEL=-j8

View file

@ -6,10 +6,12 @@
TMP=/run/shm/parallel_$$
pwd=`pwd`
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
mkdir -p $TMP
cd $TMP/
tar xjf "$pwd"/input-files/testdir.tar.bz2
tar xjf "$testsuitedir"/input-files/testdir.tar.bz2
echo echo test of cat pipe sh | parallel -j 50 2>&1
find . -name '*.jpg' | parallel -j +0 convert -geometry 120 {} {//}/thumb_{/}

View file

@ -4,6 +4,7 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
mkdir -p tmp
cd tmp
median() { perl -e '@a=sort {$a<=>$b} <>;print $a[$#a/2]';}

View file

@ -6,14 +6,15 @@
cpuburn=$(mktemp)
(echo '#!/usr/bin/perl'
echo "eval{setpriority(0,0,9)}; while(1){}") > $cpuburn
chmod 700 $cpuburn
echo "eval{setpriority(0,0,9)}; while(1){}") > "$cpuburn"
chmod 700 "$cpuburn"
basename=$(basename "$cpuburn")
forceload () {
# Force load
LOAD=$1
# Start 10 times as many cpuburn
seq 0 0.1 $1 | parallel -j0 timeout 20 $cpuburn 2>/dev/null &
seq 0 0.1 $1 | parallel -j0 timeout 20 "'$cpuburn'" 2>/dev/null &
PID=$!
# Give GNU Parallel 1 second to startup
sleep 1
@ -37,15 +38,15 @@ echo '### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834'
EOF
# Make sure we got all the cpuburn killed
killall $(basename $cpuburn) 2>/dev/null
killall "$basename" 2>/dev/null
echo '### Test too slow spawning'
# Let the commands below run during high load
seq 1000 | timeout 20 parallel -j400% -N0 $cpuburn 2>/dev/null &
seq 1000 | timeout 20 parallel -j400% -N0 "'$cpuburn'" 2>/dev/null &
PID=$!
seq 1 1000 | stdout nice nice parallel --halt 1 -uj0 -N0 kill $PID |
perl -pe '/parallel: Warning: Starting \d+ processes took/ and do {close STDIN; `kill '$PID';killall '$(basename $cpuburn)'`; print "OK\n"; exit }';
perl -pe '/parallel: Warning: Starting \d+ processes took/ and do {close STDIN; `kill '$PID';killall "$basename"`; print "OK\n"; exit }';
# Make sure we got all the cpuburn killed
killall $(basename $cpuburn) 2>/dev/null
rm $cpuburn
killall "$basename" 2>/dev/null
rm "$cpuburn"

View file

@ -52,8 +52,8 @@ echo '### bug #42041: Implement $PARALLEL_JOBSLOT'
echo '### bug #42363: --pipepart and --fifo/--cat does not work'
seq 100 > /tmp/bug42363;
parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:';
parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:';
parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:';
parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:';
rm /tmp/bug42363
echo '### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile'

View file

@ -103,17 +103,17 @@ echo '### Race condition bug - 2 - would block';
seq 1 100 | nice parallel -j100 --block 1 --recend "" --pipe cat >/dev/null
echo '### Test --block size=1';
seq 1 10| parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {}
seq 1 10| TMPDIR=/tmp parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {}
echo '### Test --block size=1M -j10 --files - more jobs than data';
sort -n < /tmp/blocktest | md5sum;
cat /tmp/blocktest | parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --block size=1M -j1 - more data than cpu';
cat /tmp/blocktest | parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --block size=1M -j1 - more data than cpu';
cat /tmp/blocktest | parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --pipe default settings';
cat /tmp/blocktest | parallel --pipe sort | sort -n | md5sum

View file

@ -6,7 +6,7 @@
par_tmux_filter() {
# /tmp/parallel-local7/tmsOU2Ig
perl -pe 's:(/tmp\S+/tms).....:$1XXXXX:;s/ p\d+/pID/;'
perl -pe 's:(/tmp.*/tms).....:$1XXXXX:;s/ p\d+/pID/;'
}
export -f par_tmux_filter

View file

@ -50,8 +50,9 @@ echo '### Test --spreadstdin - this failed during devel';
echo '### Test --spreadstdin -k';
nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum
# --files requires TMPDIR does not contain \n
echo '### Test --spreadstdin --files';
nice seq 1 1000000 | shuf | $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
nice seq 1 1000000 | shuf | TMPDIR=/tmp $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --tag ::: a ::: b';
stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b

View file

@ -51,6 +51,7 @@ par_filter_hosts_no_ssh_nxserver() {
par_controlmaster_is_faster() {
echo '### bug #41964: --controlmaster not seems to reuse OpenSSH connections to the same host'
echo '-M should finish first - eventhough there are 2x jobs'
export SSHLOGIN1=sh@lo
(parallel -S $SSHLOGIN1 true ::: {1..20};
echo No --controlmaster - finish last) &
(parallel -M -S $SSHLOGIN1 true ::: {1..40};

View file

@ -3,21 +3,24 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | parallel rm
cd testsuite 2>/dev/null
rm -rf tmp
mkdir tmp
cd tmp
cleanup() {
find {"$TMPDIR",/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 -print0 2>/dev/null |
parallel -0 rm 2>/dev/null
}
cleanup
touch ~/.parallel/will-cite
echo '### test parallel_tutorial'
rm -f /tmp/runs
srcdir=$(pwd | perl -pe 's=$ENV{HOME}==')
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
srcdir=$(echo "$testsuitedir" | perl -pe 's=$ENV{HOME}==')
export SERVER1=parallel@lo
export SERVER2=csh@lo
export PARALLEL=-k
perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/parallel_tutorial.pod |
perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' "$testsuitedir"/../src/parallel_tutorial.pod |
egrep -v 'curl|tty|parallel_tutorial|interactive|example.(com|net)|shellquote|works' |
perl -pe 's/username@//;s/user@//;
s/zenity/zenity --timeout=15/;
@ -101,9 +104,14 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/
s/doi.*=.*//;
s/url.*= .*doi.org.*//;
s/.Feel free to use .nocite.*//;
# tmpdir and files
s:/tmp/parallel-tutorial-tmpdir/par-job-\S+:script:g;
s:/tmp/par-job-\S+:script:g;
s:par......par:tempfile:g;
s:^tempfile\n::g;
' | uniq
# 3+3 .par files (from --files), 1 .tms-file from tmux attach
find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | wc -l
find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | parallel rm
echo "### 3+3 .par files (from --files), 1 .tms-file from tmux attach"
find {"$TMPDIR",/var/tmp}/{fif,tms,par[^a]}* -mmin -10 -type f -print0 2>/dev/null |
parallel -0 grep . | sort
cleanup

View file

@ -7,6 +7,10 @@
start_centos3() {
stdout ping -w 1 -c 1 centos3 >/dev/null || (
# Vagrant does not set the IP addr
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd "$testsuitedir"
cd testsuite/vagrant/tange/centos3/ 2>/dev/null
cd vagrant/tange/centos3/ 2>/dev/null
cd ../vagrant/tange/centos3/ 2>/dev/null
@ -55,6 +59,10 @@ compgen -A function | grep par_ | LC_ALL=C sort |
perl -pe 's:/usr/bin:/bin:g;'
(
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
cd "$testsuitedir"
cd vagrant/tange/centos3/
stdout vagrant suspend |
grep -v '==> default: Saving VM state' |

View file

@ -9,12 +9,12 @@ par_stdin() {
seq 10 | parallel --semaphore --id stdin wc
seq 10 | parallel --semaphore --id stdin --fg wc
tmp=$(mktemp)
seq 10 > $tmp
parallel -a $tmp --semaphore --id stdin wc
parallel -a $tmp --semaphore --id stdin --fg wc
seq 10 > "$tmp"
parallel -a "$tmp" --semaphore --id stdin wc
parallel -a "$tmp" --semaphore --id stdin --fg wc
parallel --semaphore --id stdin --wait
# Should fail: More files are not supported
parallel -a $tmp -a $tmp --semaphore --id stdin --fg wc
parallel -a "$tmp" -a "$tmp" --semaphore --id stdin --fg wc
}
par_mutex() {

View file

@ -64,16 +64,18 @@ echo "### Test sql:sql::alias"
sql sql:sql::sqlunittest "SELECT 'Yes it works' as 'Test sql:sql::alias';"
echo "### Test --noheaders --no-headers -n"
sql -n :sqlunittest 'select * from unittest order by id' \
| parallel -k --colsep '\t' echo {2} {1}
sql --noheaders :sqlunittest 'select * from unittest order by id' \
| parallel -k --colsep '\t' echo {2} {1}
sql --no-headers :sqlunittest 'select * from unittest order by id' \
| parallel -k --colsep '\t' echo {2} {1}
sql -n :sqlunittest 'select * from unittest order by id' |
parallel -k --colsep '\t' echo {2} {1}
sql --noheaders :sqlunittest 'select * from unittest order by id' |
parallel -k --colsep '\t' echo {2} {1}
sql --no-headers :sqlunittest 'select * from unittest order by id' |
parallel -k --colsep '\t' echo {2} {1}
echo "### Test --sep -s";
sql --no-headers -s : pg:/// 'select 1,2' | parallel --colsep ':' echo {2} {1}
sql --no-headers --sep : pg:/// 'select 1,2' | parallel --colsep ':' echo {2} {1}
sql --no-headers -s : pg:/// 'select 1,2' |
parallel --colsep ':' echo {2} {1}
sql --no-headers --sep : pg:/// 'select 1,2' |
parallel --colsep ':' echo {2} {1}
echo "### Test --passthrough -p";
sql -p -H :sqlunittest 'select * from unittest'
@ -101,7 +103,7 @@ sql --table-size :sqlunittest | wc -l
echo "### Test --debug"
sql --debug :sqlunittest "SELECT 'Yes it does' as 'Test if --debug works';" |
perl -pe 's:/tmp/sql01-tmpdir/...........sql:tmpfile:g'
perl -pe 's:/tmp/...........sql:tmpfile:g'
echo "### Test --version -V"
sql --version | wc

View file

@ -6,7 +6,7 @@
par_sqlite() {
tmp=$(mktemp -d)
cd $tmp
cd "$tmp"
echo '### Test of sqlite'
for CMDSQL in sqlite sqlite3 ; do
echo "Current command: $CMDSQL"

View file

@ -10,7 +10,11 @@ SSHLOGIN1=$SSHUSER1@$SERVER1
mkdir -p tmp
cd tmp
tar xjf ../input-files/testdir.tar.bz2
pwd=$(pwd)
# If not run in dir parallel/testsuite: set testsuitedir to path of testsuite
testsuitedir=${testsuitedir:-$pwd}
tar xjf "$testsuitedir"/input-files/testdir.tar.bz2
#rsync -Ha --delete input-files/testdir/ tmp/
#cd tmp

View file

@ -319,7 +319,7 @@ par_l0_is_l1 ### Because of --tollef -l, then -l0 == -l1, sorry
par_l0_is_l1 l0 1
par_l0_is_l1 l0 2
par_linebuffer_files ### bug #48658: --linebuffer --files
par_linebuffer_files 10
par_linebuffer_files 20
par_link_files_as_only_arg bug #50685: single ::::+ does not work
par_link_files_as_only_arg 1 1 1
par_link_files_as_only_arg 2 2 2
@ -692,7 +692,8 @@ par_pipe_tag_v foo cat
par_pipe_tag_v foo 1
par_pipe_tag_v foo 2
par_pipe_tag_v foo 3
par_pipe_tag_v foo /tmp/tmpfile.par
par_pipe_tag_v foo /tmp/parallel-local-0.3s-tmp/
par_pipe_tag_v </tmp/tmpfile.par
par_pipe_to_func ### bug #45998: --pipe to function broken
par_pipe_to_func 1
par_pipe_to_func pipefunc OK
@ -1355,19 +1356,25 @@ par_version 11
par_wd_3dot_local bug #45993: --wd ... should also work when run locally
par_wd_3dot_local parallel: Error: Cannot change into non-executable dir /bi: No such file or directory
par_wd_3dot_local /bin
par_wd_3dot_local ~/privat/parallel/testsuite
par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK
par_wd_3dot_local /
par_wd_3dot_local ~/privat/parallel/testsuite
par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK
par_wd_3dot_local /tmp
par_wd_3dot_local ~/privat/parallel/testsuite
par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK
par_wd_3dot_local ~/.parallel/tmp/hostname-0-0
par_wd_3dot_local ~/privat/parallel/testsuite
par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK
par_wd_3dot_local ~/privat/parallel/testsuite
par_wd_3dot_local ~/privat/parallel/testsuite
par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local /tmp/parallel-local-0.0s-tmp/
par_wd_3dot_local </tmp
par_wd_3dot_local OK
par_wd_dotdotdot ### parallel --wd ... should clean up
par_wd_dotdotdot 1 == 1

File diff suppressed because it is too large Load diff

View file

@ -126,13 +126,18 @@ par_eof_on_command_line_input_source foo
par_file_rpl ### file as replacement string
par_file_rpl contest1
par_file_rpl contest2
par_file_rpl File name /tmp/parallel-local-1s-tmpdir/tmp.XXXXXX
par_file_rpl File name /tmp/parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX
par_file_rpl contest1
par_file_rpl contest2
par_file_rpl File name /parallel-local-1s-tmpdir/tmp.XXXXXX/parallel-local-1s-tmpdir/tmp.XXXXXX
par_file_rpl File name /parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX/parallel-local-1s-tmp/
par_file_rpl </parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX/tmp.XXXXXX
par_file_rpl contest1
par_file_rpl contest2
par_file_rpl File name /tmp/parallel-local-1s-tmpdir/tmp.XXXXXX
par_file_rpl File name /tmp/parallel-local-1s-tmp/
par_file_rpl </tmp/tmp.XXXXXX
par_file_rpl 1
par_file_rpl 1
par_file_rpl 2
@ -487,7 +492,8 @@ par_profiles_with_space ### bug #42902: profiles containing arguments with space
par_profiles_with_space /bin/bash=/bin/bash
par_profiles_with_space echo '/bin/bash=/bin/bash'
par_profiles_with_space /bin/bash=/bin/bash
par_profiles_with_space With script in $PARALLEL /bin/bash=~/privat/parallel/testsuite
par_profiles_with_space With script in $PARALLEL /bin/bash=/tmp/parallel-local-1s-tmp/
par_profiles_with_space </tmp
par_pxz_complains bug #44250: pxz complains File format not recognized but decompresses anyway
par_pxz_complains ls: cannot access '/OK-if-missing-file': No such file or directory
par_pxz_complains can not seek in input: Illegal seek

View file

@ -646,15 +646,15 @@ par_shebang pl C
par_shebang py A
par_shebang py B
par_shebang py C
par_shebang r [1] "A"
par_shebang r [1] "B"
par_shebang r [1] "C"
par_shebang rb ["A"]
par_shebang rb ["B"]
par_shebang rb ["C"]
par_shebang sh A
par_shebang sh B
par_shebang sh C
par_shebang r [1] "A"
par_shebang r [1] "B"
par_shebang r [1] "C"
par_show_limits ### Test --show-limits
par_show_limits Maximal size of command: 130xxx
par_show_limits Maximal usable size of command: 63xxx

View file

@ -96,4 +96,5 @@ par_print_before_halt_on_error 2 perl -e 'sleep 1; sleep $ARGV[0]; print STDERR
par_sem_dir ### bug #58985: sem stall if .parallel/semaphores is chmod 0
par_sem_dir parallel: Error: Semaphoredir must be writable: '~/.parallel/semaphores'
par_tmux_termination ### --tmux test - check termination
par_tmux_termination See output with: tmux -S /tmp/parallel-local-race01-tmpdir/tmsXXXXX attach
par_tmux_termination See output with: tmux -S '/tmp/parallel-local-race01-tmp/
par_tmux_termination </tmp/tmsXXXXX' attach

View file

@ -43,12 +43,6 @@ par_continuous_output 1
par_continuous_output 1
par_hostgroup ### --hostgroup force ncpu
par_hostgroup parallel
par_hostgroup parallel
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup ### --hostgroup two group arg
par_hostgroup parallel
@ -70,12 +64,6 @@ par_hostgroup tange
par_hostgroup tange
par_hostgroup ### --hostgroup multiple group arg + unused group
par_hostgroup parallel
par_hostgroup parallel
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup ### --hostgroup two groups @
par_hostgroup parallel parallel
@ -91,10 +79,6 @@ par_hostgroup no_group
par_hostgroup implicit_group
par_hostgroup ### --hostgroup -S @group
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tcsh
par_hostgroup tcsh
par_hostgroup tcsh
par_hostgroup ### --hostgroup -S @group1 -Sgrp2
par_hostgroup parallel
@ -163,6 +147,14 @@ par_retries_bug_from_2010 4
par_retries_bug_from_2010 4
par_retries_bug_from_2010 4
par_retries_bug_from_2010 2
par_semaphore ### Test if parallel invoked as sem will run parallel --semaphore
par_semaphore job1a 1
par_semaphore job2a 2
par_semaphore job1b 3
par_semaphore job3a 4
par_semaphore job2b 5
par_semaphore job3b 6
par_semaphore done
par_sql_CSV ### CSV write to the right place
par_sql_CSV ran OK
par_sql_CSV ok

View file

@ -332,31 +332,31 @@ par_shuf $MYSQL OK: Diff bigger than 2500 char
par_shuf $MYSQL Exit=0
par_shuf $MYSQL Exit=0
par_shuf $MYSQL Command V1 V2 Stdout Stderr
par_shuf $MYSQL sleep .3;echo 1 a 1 a /tmp/parallel-bug49791-c20/1/1/2/a/stdout /tmp/parallel-bug49791-c20/1/1/2/a/stderr
par_shuf $MYSQL sleep .3;echo 1 b 1 b /tmp/parallel-bug49791-c20/1/1/2/b/stdout /tmp/parallel-bug49791-c20/1/1/2/b/stderr
par_shuf $MYSQL sleep .3;echo 1 c 1 c /tmp/parallel-bug49791-c20/1/1/2/c/stdout /tmp/parallel-bug49791-c20/1/1/2/c/stderr
par_shuf $MYSQL sleep .3;echo 1 d 1 d /tmp/parallel-bug49791-c20/1/1/2/d/stdout /tmp/parallel-bug49791-c20/1/1/2/d/stderr
par_shuf $MYSQL sleep .3;echo 1 e 1 e /tmp/parallel-bug49791-c20/1/1/2/e/stdout /tmp/parallel-bug49791-c20/1/1/2/e/stderr
par_shuf $MYSQL sleep .3;echo 2 a 2 a /tmp/parallel-bug49791-c20/1/2/2/a/stdout /tmp/parallel-bug49791-c20/1/2/2/a/stderr
par_shuf $MYSQL sleep .3;echo 2 b 2 b /tmp/parallel-bug49791-c20/1/2/2/b/stdout /tmp/parallel-bug49791-c20/1/2/2/b/stderr
par_shuf $MYSQL sleep .3;echo 2 c 2 c /tmp/parallel-bug49791-c20/1/2/2/c/stdout /tmp/parallel-bug49791-c20/1/2/2/c/stderr
par_shuf $MYSQL sleep .3;echo 2 d 2 d /tmp/parallel-bug49791-c20/1/2/2/d/stdout /tmp/parallel-bug49791-c20/1/2/2/d/stderr
par_shuf $MYSQL sleep .3;echo 2 e 2 e /tmp/parallel-bug49791-c20/1/2/2/e/stdout /tmp/parallel-bug49791-c20/1/2/2/e/stderr
par_shuf $MYSQL sleep .3;echo 3 a 3 a /tmp/parallel-bug49791-c20/1/3/2/a/stdout /tmp/parallel-bug49791-c20/1/3/2/a/stderr
par_shuf $MYSQL sleep .3;echo 3 b 3 b /tmp/parallel-bug49791-c20/1/3/2/b/stdout /tmp/parallel-bug49791-c20/1/3/2/b/stderr
par_shuf $MYSQL sleep .3;echo 3 c 3 c /tmp/parallel-bug49791-c20/1/3/2/c/stdout /tmp/parallel-bug49791-c20/1/3/2/c/stderr
par_shuf $MYSQL sleep .3;echo 3 d 3 d /tmp/parallel-bug49791-c20/1/3/2/d/stdout /tmp/parallel-bug49791-c20/1/3/2/d/stderr
par_shuf $MYSQL sleep .3;echo 3 e 3 e /tmp/parallel-bug49791-c20/1/3/2/e/stdout /tmp/parallel-bug49791-c20/1/3/2/e/stderr
par_shuf $MYSQL sleep .3;echo 4 a 4 a /tmp/parallel-bug49791-c20/1/4/2/a/stdout /tmp/parallel-bug49791-c20/1/4/2/a/stderr
par_shuf $MYSQL sleep .3;echo 4 b 4 b /tmp/parallel-bug49791-c20/1/4/2/b/stdout /tmp/parallel-bug49791-c20/1/4/2/b/stderr
par_shuf $MYSQL sleep .3;echo 4 c 4 c /tmp/parallel-bug49791-c20/1/4/2/c/stdout /tmp/parallel-bug49791-c20/1/4/2/c/stderr
par_shuf $MYSQL sleep .3;echo 4 d 4 d /tmp/parallel-bug49791-c20/1/4/2/d/stdout /tmp/parallel-bug49791-c20/1/4/2/d/stderr
par_shuf $MYSQL sleep .3;echo 4 e 4 e /tmp/parallel-bug49791-c20/1/4/2/e/stdout /tmp/parallel-bug49791-c20/1/4/2/e/stderr
par_shuf $MYSQL sleep .3;echo 5 a 5 a /tmp/parallel-bug49791-c20/1/5/2/a/stdout /tmp/parallel-bug49791-c20/1/5/2/a/stderr
par_shuf $MYSQL sleep .3;echo 5 b 5 b /tmp/parallel-bug49791-c20/1/5/2/b/stdout /tmp/parallel-bug49791-c20/1/5/2/b/stderr
par_shuf $MYSQL sleep .3;echo 5 c 5 c /tmp/parallel-bug49791-c20/1/5/2/c/stdout /tmp/parallel-bug49791-c20/1/5/2/c/stderr
par_shuf $MYSQL sleep .3;echo 5 d 5 d /tmp/parallel-bug49791-c20/1/5/2/d/stdout /tmp/parallel-bug49791-c20/1/5/2/d/stderr
par_shuf $MYSQL sleep .3;echo 5 e 5 e /tmp/parallel-bug49791-c20/1/5/2/e/stdout /tmp/parallel-bug49791-c20/1/5/2/e/stderr
par_shuf $MYSQL sleep .3;echo 1 a 1 a /tmp/parallel-bug49791- <c20/1/1/2/a/stdout /tmp/parallel-bug49791- <c20/1/1/2/a/stderr
par_shuf $MYSQL sleep .3;echo 1 b 1 b /tmp/parallel-bug49791- <c20/1/1/2/b/stdout /tmp/parallel-bug49791- <c20/1/1/2/b/stderr
par_shuf $MYSQL sleep .3;echo 1 c 1 c /tmp/parallel-bug49791- <c20/1/1/2/c/stdout /tmp/parallel-bug49791- <c20/1/1/2/c/stderr
par_shuf $MYSQL sleep .3;echo 1 d 1 d /tmp/parallel-bug49791- <c20/1/1/2/d/stdout /tmp/parallel-bug49791- <c20/1/1/2/d/stderr
par_shuf $MYSQL sleep .3;echo 1 e 1 e /tmp/parallel-bug49791- <c20/1/1/2/e/stdout /tmp/parallel-bug49791- <c20/1/1/2/e/stderr
par_shuf $MYSQL sleep .3;echo 2 a 2 a /tmp/parallel-bug49791- <c20/1/2/2/a/stdout /tmp/parallel-bug49791- <c20/1/2/2/a/stderr
par_shuf $MYSQL sleep .3;echo 2 b 2 b /tmp/parallel-bug49791- <c20/1/2/2/b/stdout /tmp/parallel-bug49791- <c20/1/2/2/b/stderr
par_shuf $MYSQL sleep .3;echo 2 c 2 c /tmp/parallel-bug49791- <c20/1/2/2/c/stdout /tmp/parallel-bug49791- <c20/1/2/2/c/stderr
par_shuf $MYSQL sleep .3;echo 2 d 2 d /tmp/parallel-bug49791- <c20/1/2/2/d/stdout /tmp/parallel-bug49791- <c20/1/2/2/d/stderr
par_shuf $MYSQL sleep .3;echo 2 e 2 e /tmp/parallel-bug49791- <c20/1/2/2/e/stdout /tmp/parallel-bug49791- <c20/1/2/2/e/stderr
par_shuf $MYSQL sleep .3;echo 3 a 3 a /tmp/parallel-bug49791- <c20/1/3/2/a/stdout /tmp/parallel-bug49791- <c20/1/3/2/a/stderr
par_shuf $MYSQL sleep .3;echo 3 b 3 b /tmp/parallel-bug49791- <c20/1/3/2/b/stdout /tmp/parallel-bug49791- <c20/1/3/2/b/stderr
par_shuf $MYSQL sleep .3;echo 3 c 3 c /tmp/parallel-bug49791- <c20/1/3/2/c/stdout /tmp/parallel-bug49791- <c20/1/3/2/c/stderr
par_shuf $MYSQL sleep .3;echo 3 d 3 d /tmp/parallel-bug49791- <c20/1/3/2/d/stdout /tmp/parallel-bug49791- <c20/1/3/2/d/stderr
par_shuf $MYSQL sleep .3;echo 3 e 3 e /tmp/parallel-bug49791- <c20/1/3/2/e/stdout /tmp/parallel-bug49791- <c20/1/3/2/e/stderr
par_shuf $MYSQL sleep .3;echo 4 a 4 a /tmp/parallel-bug49791- <c20/1/4/2/a/stdout /tmp/parallel-bug49791- <c20/1/4/2/a/stderr
par_shuf $MYSQL sleep .3;echo 4 b 4 b /tmp/parallel-bug49791- <c20/1/4/2/b/stdout /tmp/parallel-bug49791- <c20/1/4/2/b/stderr
par_shuf $MYSQL sleep .3;echo 4 c 4 c /tmp/parallel-bug49791- <c20/1/4/2/c/stdout /tmp/parallel-bug49791- <c20/1/4/2/c/stderr
par_shuf $MYSQL sleep .3;echo 4 d 4 d /tmp/parallel-bug49791- <c20/1/4/2/d/stdout /tmp/parallel-bug49791- <c20/1/4/2/d/stderr
par_shuf $MYSQL sleep .3;echo 4 e 4 e /tmp/parallel-bug49791- <c20/1/4/2/e/stdout /tmp/parallel-bug49791- <c20/1/4/2/e/stderr
par_shuf $MYSQL sleep .3;echo 5 a 5 a /tmp/parallel-bug49791- <c20/1/5/2/a/stdout /tmp/parallel-bug49791- <c20/1/5/2/a/stderr
par_shuf $MYSQL sleep .3;echo 5 b 5 b /tmp/parallel-bug49791- <c20/1/5/2/b/stdout /tmp/parallel-bug49791- <c20/1/5/2/b/stderr
par_shuf $MYSQL sleep .3;echo 5 c 5 c /tmp/parallel-bug49791- <c20/1/5/2/c/stdout /tmp/parallel-bug49791- <c20/1/5/2/c/stderr
par_shuf $MYSQL sleep .3;echo 5 d 5 d /tmp/parallel-bug49791- <c20/1/5/2/d/stdout /tmp/parallel-bug49791- <c20/1/5/2/d/stderr
par_shuf $MYSQL sleep .3;echo 5 e 5 e /tmp/parallel-bug49791- <c20/1/5/2/e/stdout /tmp/parallel-bug49791- <c20/1/5/2/e/stderr
par_shuf $PG p_wrapper par_shuf '$PG'
par_shuf $PG 1 a
par_shuf $PG 1 b
@ -387,32 +387,32 @@ par_shuf $PG OK: Diff bigger than 2500 char
par_shuf $PG Exit=0
par_shuf $PG Exit=0
par_shuf $PG command | v1 | v2 | stdout | stderr
par_shuf $PG -------------------+----+----+-------------------------------------------+-------------------------------------------
par_shuf $PG sleep .3;echo 1 a | 1 | a | /tmp/parallel-bug49791-792/1/1/2/a/stdout | /tmp/parallel-bug49791-792/1/1/2/a/stderr
par_shuf $PG sleep .3;echo 1 b | 1 | b | /tmp/parallel-bug49791-792/1/1/2/b/stdout | /tmp/parallel-bug49791-792/1/1/2/b/stderr
par_shuf $PG sleep .3;echo 1 c | 1 | c | /tmp/parallel-bug49791-792/1/1/2/c/stdout | /tmp/parallel-bug49791-792/1/1/2/c/stderr
par_shuf $PG sleep .3;echo 1 d | 1 | d | /tmp/parallel-bug49791-792/1/1/2/d/stdout | /tmp/parallel-bug49791-792/1/1/2/d/stderr
par_shuf $PG sleep .3;echo 1 e | 1 | e | /tmp/parallel-bug49791-792/1/1/2/e/stdout | /tmp/parallel-bug49791-792/1/1/2/e/stderr
par_shuf $PG sleep .3;echo 2 a | 2 | a | /tmp/parallel-bug49791-792/1/2/2/a/stdout | /tmp/parallel-bug49791-792/1/2/2/a/stderr
par_shuf $PG sleep .3;echo 2 b | 2 | b | /tmp/parallel-bug49791-792/1/2/2/b/stdout | /tmp/parallel-bug49791-792/1/2/2/b/stderr
par_shuf $PG sleep .3;echo 2 c | 2 | c | /tmp/parallel-bug49791-792/1/2/2/c/stdout | /tmp/parallel-bug49791-792/1/2/2/c/stderr
par_shuf $PG sleep .3;echo 2 d | 2 | d | /tmp/parallel-bug49791-792/1/2/2/d/stdout | /tmp/parallel-bug49791-792/1/2/2/d/stderr
par_shuf $PG sleep .3;echo 2 e | 2 | e | /tmp/parallel-bug49791-792/1/2/2/e/stdout | /tmp/parallel-bug49791-792/1/2/2/e/stderr
par_shuf $PG sleep .3;echo 3 a | 3 | a | /tmp/parallel-bug49791-792/1/3/2/a/stdout | /tmp/parallel-bug49791-792/1/3/2/a/stderr
par_shuf $PG sleep .3;echo 3 b | 3 | b | /tmp/parallel-bug49791-792/1/3/2/b/stdout | /tmp/parallel-bug49791-792/1/3/2/b/stderr
par_shuf $PG sleep .3;echo 3 c | 3 | c | /tmp/parallel-bug49791-792/1/3/2/c/stdout | /tmp/parallel-bug49791-792/1/3/2/c/stderr
par_shuf $PG sleep .3;echo 3 d | 3 | d | /tmp/parallel-bug49791-792/1/3/2/d/stdout | /tmp/parallel-bug49791-792/1/3/2/d/stderr
par_shuf $PG sleep .3;echo 3 e | 3 | e | /tmp/parallel-bug49791-792/1/3/2/e/stdout | /tmp/parallel-bug49791-792/1/3/2/e/stderr
par_shuf $PG sleep .3;echo 4 a | 4 | a | /tmp/parallel-bug49791-792/1/4/2/a/stdout | /tmp/parallel-bug49791-792/1/4/2/a/stderr
par_shuf $PG sleep .3;echo 4 b | 4 | b | /tmp/parallel-bug49791-792/1/4/2/b/stdout | /tmp/parallel-bug49791-792/1/4/2/b/stderr
par_shuf $PG sleep .3;echo 4 c | 4 | c | /tmp/parallel-bug49791-792/1/4/2/c/stdout | /tmp/parallel-bug49791-792/1/4/2/c/stderr
par_shuf $PG sleep .3;echo 4 d | 4 | d | /tmp/parallel-bug49791-792/1/4/2/d/stdout | /tmp/parallel-bug49791-792/1/4/2/d/stderr
par_shuf $PG sleep .3;echo 4 e | 4 | e | /tmp/parallel-bug49791-792/1/4/2/e/stdout | /tmp/parallel-bug49791-792/1/4/2/e/stderr
par_shuf $PG sleep .3;echo 5 a | 5 | a | /tmp/parallel-bug49791-792/1/5/2/a/stdout | /tmp/parallel-bug49791-792/1/5/2/a/stderr
par_shuf $PG sleep .3;echo 5 b | 5 | b | /tmp/parallel-bug49791-792/1/5/2/b/stdout | /tmp/parallel-bug49791-792/1/5/2/b/stderr
par_shuf $PG sleep .3;echo 5 c | 5 | c | /tmp/parallel-bug49791-792/1/5/2/c/stdout | /tmp/parallel-bug49791-792/1/5/2/c/stderr
par_shuf $PG sleep .3;echo 5 d | 5 | d | /tmp/parallel-bug49791-792/1/5/2/d/stdout | /tmp/parallel-bug49791-792/1/5/2/d/stderr
par_shuf $PG sleep .3;echo 5 e | 5 | e | /tmp/parallel-bug49791-792/1/5/2/e/stdout | /tmp/parallel-bug49791-792/1/5/2/e/stderr
par_shuf $PG -------------------+----+----+----------------------------------------------+----------------------------------------------
par_shuf $PG sleep .3;echo 1 a | 1 | a | /tmp/parallel-bug49791- <792/1/1/2/a/stdout | /tmp/parallel-bug49791- <792/1/1/2/a/stderr
par_shuf $PG sleep .3;echo 1 b | 1 | b | /tmp/parallel-bug49791- <792/1/1/2/b/stdout | /tmp/parallel-bug49791- <792/1/1/2/b/stderr
par_shuf $PG sleep .3;echo 1 c | 1 | c | /tmp/parallel-bug49791- <792/1/1/2/c/stdout | /tmp/parallel-bug49791- <792/1/1/2/c/stderr
par_shuf $PG sleep .3;echo 1 d | 1 | d | /tmp/parallel-bug49791- <792/1/1/2/d/stdout | /tmp/parallel-bug49791- <792/1/1/2/d/stderr
par_shuf $PG sleep .3;echo 1 e | 1 | e | /tmp/parallel-bug49791- <792/1/1/2/e/stdout | /tmp/parallel-bug49791- <792/1/1/2/e/stderr
par_shuf $PG sleep .3;echo 2 a | 2 | a | /tmp/parallel-bug49791- <792/1/2/2/a/stdout | /tmp/parallel-bug49791- <792/1/2/2/a/stderr
par_shuf $PG sleep .3;echo 2 b | 2 | b | /tmp/parallel-bug49791- <792/1/2/2/b/stdout | /tmp/parallel-bug49791- <792/1/2/2/b/stderr
par_shuf $PG sleep .3;echo 2 c | 2 | c | /tmp/parallel-bug49791- <792/1/2/2/c/stdout | /tmp/parallel-bug49791- <792/1/2/2/c/stderr
par_shuf $PG sleep .3;echo 2 d | 2 | d | /tmp/parallel-bug49791- <792/1/2/2/d/stdout | /tmp/parallel-bug49791- <792/1/2/2/d/stderr
par_shuf $PG sleep .3;echo 2 e | 2 | e | /tmp/parallel-bug49791- <792/1/2/2/e/stdout | /tmp/parallel-bug49791- <792/1/2/2/e/stderr
par_shuf $PG sleep .3;echo 3 a | 3 | a | /tmp/parallel-bug49791- <792/1/3/2/a/stdout | /tmp/parallel-bug49791- <792/1/3/2/a/stderr
par_shuf $PG sleep .3;echo 3 b | 3 | b | /tmp/parallel-bug49791- <792/1/3/2/b/stdout | /tmp/parallel-bug49791- <792/1/3/2/b/stderr
par_shuf $PG sleep .3;echo 3 c | 3 | c | /tmp/parallel-bug49791- <792/1/3/2/c/stdout | /tmp/parallel-bug49791- <792/1/3/2/c/stderr
par_shuf $PG sleep .3;echo 3 d | 3 | d | /tmp/parallel-bug49791- <792/1/3/2/d/stdout | /tmp/parallel-bug49791- <792/1/3/2/d/stderr
par_shuf $PG sleep .3;echo 3 e | 3 | e | /tmp/parallel-bug49791- <792/1/3/2/e/stdout | /tmp/parallel-bug49791- <792/1/3/2/e/stderr
par_shuf $PG sleep .3;echo 4 a | 4 | a | /tmp/parallel-bug49791- <792/1/4/2/a/stdout | /tmp/parallel-bug49791- <792/1/4/2/a/stderr
par_shuf $PG sleep .3;echo 4 b | 4 | b | /tmp/parallel-bug49791- <792/1/4/2/b/stdout | /tmp/parallel-bug49791- <792/1/4/2/b/stderr
par_shuf $PG sleep .3;echo 4 c | 4 | c | /tmp/parallel-bug49791- <792/1/4/2/c/stdout | /tmp/parallel-bug49791- <792/1/4/2/c/stderr
par_shuf $PG sleep .3;echo 4 d | 4 | d | /tmp/parallel-bug49791- <792/1/4/2/d/stdout | /tmp/parallel-bug49791- <792/1/4/2/d/stderr
par_shuf $PG sleep .3;echo 4 e | 4 | e | /tmp/parallel-bug49791- <792/1/4/2/e/stdout | /tmp/parallel-bug49791- <792/1/4/2/e/stderr
par_shuf $PG sleep .3;echo 5 a | 5 | a | /tmp/parallel-bug49791- <792/1/5/2/a/stdout | /tmp/parallel-bug49791- <792/1/5/2/a/stderr
par_shuf $PG sleep .3;echo 5 b | 5 | b | /tmp/parallel-bug49791- <792/1/5/2/b/stdout | /tmp/parallel-bug49791- <792/1/5/2/b/stderr
par_shuf $PG sleep .3;echo 5 c | 5 | c | /tmp/parallel-bug49791- <792/1/5/2/c/stdout | /tmp/parallel-bug49791- <792/1/5/2/c/stderr
par_shuf $PG sleep .3;echo 5 d | 5 | d | /tmp/parallel-bug49791- <792/1/5/2/d/stdout | /tmp/parallel-bug49791- <792/1/5/2/d/stderr
par_shuf $PG sleep .3;echo 5 e | 5 | e | /tmp/parallel-bug49791- <792/1/5/2/e/stdout | /tmp/parallel-bug49791- <792/1/5/2/e/stderr
par_shuf $PG (25 rows)
par_shuf $PG
par_shuf $SQLITE p_wrapper par_shuf '$SQLITE'
@ -445,31 +445,31 @@ par_shuf $SQLITE OK: Diff bigger than 2500 char
par_shuf $SQLITE Exit=0
par_shuf $SQLITE Exit=0
par_shuf $SQLITE Command|V1|V2|Stdout|Stderr
par_shuf $SQLITE sleep .3;echo 1 a|1|a|/tmp/parallel-bug49791-932/1/1/2/a/stdout|/tmp/parallel-bug49791-932/1/1/2/a/stderr
par_shuf $SQLITE sleep .3;echo 1 b|1|b|/tmp/parallel-bug49791-932/1/1/2/b/stdout|/tmp/parallel-bug49791-932/1/1/2/b/stderr
par_shuf $SQLITE sleep .3;echo 1 c|1|c|/tmp/parallel-bug49791-932/1/1/2/c/stdout|/tmp/parallel-bug49791-932/1/1/2/c/stderr
par_shuf $SQLITE sleep .3;echo 1 d|1|d|/tmp/parallel-bug49791-932/1/1/2/d/stdout|/tmp/parallel-bug49791-932/1/1/2/d/stderr
par_shuf $SQLITE sleep .3;echo 1 e|1|e|/tmp/parallel-bug49791-932/1/1/2/e/stdout|/tmp/parallel-bug49791-932/1/1/2/e/stderr
par_shuf $SQLITE sleep .3;echo 2 a|2|a|/tmp/parallel-bug49791-932/1/2/2/a/stdout|/tmp/parallel-bug49791-932/1/2/2/a/stderr
par_shuf $SQLITE sleep .3;echo 2 b|2|b|/tmp/parallel-bug49791-932/1/2/2/b/stdout|/tmp/parallel-bug49791-932/1/2/2/b/stderr
par_shuf $SQLITE sleep .3;echo 2 c|2|c|/tmp/parallel-bug49791-932/1/2/2/c/stdout|/tmp/parallel-bug49791-932/1/2/2/c/stderr
par_shuf $SQLITE sleep .3;echo 2 d|2|d|/tmp/parallel-bug49791-932/1/2/2/d/stdout|/tmp/parallel-bug49791-932/1/2/2/d/stderr
par_shuf $SQLITE sleep .3;echo 2 e|2|e|/tmp/parallel-bug49791-932/1/2/2/e/stdout|/tmp/parallel-bug49791-932/1/2/2/e/stderr
par_shuf $SQLITE sleep .3;echo 3 a|3|a|/tmp/parallel-bug49791-932/1/3/2/a/stdout|/tmp/parallel-bug49791-932/1/3/2/a/stderr
par_shuf $SQLITE sleep .3;echo 3 b|3|b|/tmp/parallel-bug49791-932/1/3/2/b/stdout|/tmp/parallel-bug49791-932/1/3/2/b/stderr
par_shuf $SQLITE sleep .3;echo 3 c|3|c|/tmp/parallel-bug49791-932/1/3/2/c/stdout|/tmp/parallel-bug49791-932/1/3/2/c/stderr
par_shuf $SQLITE sleep .3;echo 3 d|3|d|/tmp/parallel-bug49791-932/1/3/2/d/stdout|/tmp/parallel-bug49791-932/1/3/2/d/stderr
par_shuf $SQLITE sleep .3;echo 3 e|3|e|/tmp/parallel-bug49791-932/1/3/2/e/stdout|/tmp/parallel-bug49791-932/1/3/2/e/stderr
par_shuf $SQLITE sleep .3;echo 4 a|4|a|/tmp/parallel-bug49791-932/1/4/2/a/stdout|/tmp/parallel-bug49791-932/1/4/2/a/stderr
par_shuf $SQLITE sleep .3;echo 4 b|4|b|/tmp/parallel-bug49791-932/1/4/2/b/stdout|/tmp/parallel-bug49791-932/1/4/2/b/stderr
par_shuf $SQLITE sleep .3;echo 4 c|4|c|/tmp/parallel-bug49791-932/1/4/2/c/stdout|/tmp/parallel-bug49791-932/1/4/2/c/stderr
par_shuf $SQLITE sleep .3;echo 4 d|4|d|/tmp/parallel-bug49791-932/1/4/2/d/stdout|/tmp/parallel-bug49791-932/1/4/2/d/stderr
par_shuf $SQLITE sleep .3;echo 4 e|4|e|/tmp/parallel-bug49791-932/1/4/2/e/stdout|/tmp/parallel-bug49791-932/1/4/2/e/stderr
par_shuf $SQLITE sleep .3;echo 5 a|5|a|/tmp/parallel-bug49791-932/1/5/2/a/stdout|/tmp/parallel-bug49791-932/1/5/2/a/stderr
par_shuf $SQLITE sleep .3;echo 5 b|5|b|/tmp/parallel-bug49791-932/1/5/2/b/stdout|/tmp/parallel-bug49791-932/1/5/2/b/stderr
par_shuf $SQLITE sleep .3;echo 5 c|5|c|/tmp/parallel-bug49791-932/1/5/2/c/stdout|/tmp/parallel-bug49791-932/1/5/2/c/stderr
par_shuf $SQLITE sleep .3;echo 5 d|5|d|/tmp/parallel-bug49791-932/1/5/2/d/stdout|/tmp/parallel-bug49791-932/1/5/2/d/stderr
par_shuf $SQLITE sleep .3;echo 5 e|5|e|/tmp/parallel-bug49791-932/1/5/2/e/stdout|/tmp/parallel-bug49791-932/1/5/2/e/stderr
par_shuf $SQLITE sleep .3;echo 1 a|1|a|/tmp/parallel-bug49791- <932/1/1/2/a/stdout|/tmp/parallel-bug49791- <932/1/1/2/a/stderr
par_shuf $SQLITE sleep .3;echo 1 b|1|b|/tmp/parallel-bug49791- <932/1/1/2/b/stdout|/tmp/parallel-bug49791- <932/1/1/2/b/stderr
par_shuf $SQLITE sleep .3;echo 1 c|1|c|/tmp/parallel-bug49791- <932/1/1/2/c/stdout|/tmp/parallel-bug49791- <932/1/1/2/c/stderr
par_shuf $SQLITE sleep .3;echo 1 d|1|d|/tmp/parallel-bug49791- <932/1/1/2/d/stdout|/tmp/parallel-bug49791- <932/1/1/2/d/stderr
par_shuf $SQLITE sleep .3;echo 1 e|1|e|/tmp/parallel-bug49791- <932/1/1/2/e/stdout|/tmp/parallel-bug49791- <932/1/1/2/e/stderr
par_shuf $SQLITE sleep .3;echo 2 a|2|a|/tmp/parallel-bug49791- <932/1/2/2/a/stdout|/tmp/parallel-bug49791- <932/1/2/2/a/stderr
par_shuf $SQLITE sleep .3;echo 2 b|2|b|/tmp/parallel-bug49791- <932/1/2/2/b/stdout|/tmp/parallel-bug49791- <932/1/2/2/b/stderr
par_shuf $SQLITE sleep .3;echo 2 c|2|c|/tmp/parallel-bug49791- <932/1/2/2/c/stdout|/tmp/parallel-bug49791- <932/1/2/2/c/stderr
par_shuf $SQLITE sleep .3;echo 2 d|2|d|/tmp/parallel-bug49791- <932/1/2/2/d/stdout|/tmp/parallel-bug49791- <932/1/2/2/d/stderr
par_shuf $SQLITE sleep .3;echo 2 e|2|e|/tmp/parallel-bug49791- <932/1/2/2/e/stdout|/tmp/parallel-bug49791- <932/1/2/2/e/stderr
par_shuf $SQLITE sleep .3;echo 3 a|3|a|/tmp/parallel-bug49791- <932/1/3/2/a/stdout|/tmp/parallel-bug49791- <932/1/3/2/a/stderr
par_shuf $SQLITE sleep .3;echo 3 b|3|b|/tmp/parallel-bug49791- <932/1/3/2/b/stdout|/tmp/parallel-bug49791- <932/1/3/2/b/stderr
par_shuf $SQLITE sleep .3;echo 3 c|3|c|/tmp/parallel-bug49791- <932/1/3/2/c/stdout|/tmp/parallel-bug49791- <932/1/3/2/c/stderr
par_shuf $SQLITE sleep .3;echo 3 d|3|d|/tmp/parallel-bug49791- <932/1/3/2/d/stdout|/tmp/parallel-bug49791- <932/1/3/2/d/stderr
par_shuf $SQLITE sleep .3;echo 3 e|3|e|/tmp/parallel-bug49791- <932/1/3/2/e/stdout|/tmp/parallel-bug49791- <932/1/3/2/e/stderr
par_shuf $SQLITE sleep .3;echo 4 a|4|a|/tmp/parallel-bug49791- <932/1/4/2/a/stdout|/tmp/parallel-bug49791- <932/1/4/2/a/stderr
par_shuf $SQLITE sleep .3;echo 4 b|4|b|/tmp/parallel-bug49791- <932/1/4/2/b/stdout|/tmp/parallel-bug49791- <932/1/4/2/b/stderr
par_shuf $SQLITE sleep .3;echo 4 c|4|c|/tmp/parallel-bug49791- <932/1/4/2/c/stdout|/tmp/parallel-bug49791- <932/1/4/2/c/stderr
par_shuf $SQLITE sleep .3;echo 4 d|4|d|/tmp/parallel-bug49791- <932/1/4/2/d/stdout|/tmp/parallel-bug49791- <932/1/4/2/d/stderr
par_shuf $SQLITE sleep .3;echo 4 e|4|e|/tmp/parallel-bug49791- <932/1/4/2/e/stdout|/tmp/parallel-bug49791- <932/1/4/2/e/stderr
par_shuf $SQLITE sleep .3;echo 5 a|5|a|/tmp/parallel-bug49791- <932/1/5/2/a/stdout|/tmp/parallel-bug49791- <932/1/5/2/a/stderr
par_shuf $SQLITE sleep .3;echo 5 b|5|b|/tmp/parallel-bug49791- <932/1/5/2/b/stdout|/tmp/parallel-bug49791- <932/1/5/2/b/stderr
par_shuf $SQLITE sleep .3;echo 5 c|5|c|/tmp/parallel-bug49791- <932/1/5/2/c/stdout|/tmp/parallel-bug49791- <932/1/5/2/c/stderr
par_shuf $SQLITE sleep .3;echo 5 d|5|d|/tmp/parallel-bug49791- <932/1/5/2/d/stdout|/tmp/parallel-bug49791- <932/1/5/2/d/stderr
par_shuf $SQLITE sleep .3;echo 5 e|5|e|/tmp/parallel-bug49791- <932/1/5/2/e/stdout|/tmp/parallel-bug49791- <932/1/5/2/e/stderr
par_sql_joblog $MYSQL p_wrapper par_sql_joblog '$MYSQL'
par_sql_joblog $MYSQL ### should only give a single --joblog heading
par_sql_joblog $MYSQL ### --sqlmaster/--sqlworker

View file

@ -62,7 +62,9 @@ par_sshloginfile parallel
par_sshloginfile parallel
par_sshloginfile parallel
par_tmux_different_shells ### Test tmux works on different shells
par_tmux_different_shells See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_different_shells 0
par_tmux_different_shells See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_different_shells 4
par_tmux_different_shells 0
par_tmux_different_shells 4
@ -74,9 +76,16 @@ par_tmux_different_shells # command is currently too long for csh. Maybe it can
par_tmux_different_shells 0
par_tmux_different_shells 4
par_tmux_length ### works
par_tmux_length See output with: tmux -S attach
par_tmux_length See output with: tmux -S attach
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length <' attach
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length <' attach
par_tmux_length ### These blocked due to length
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_tmux_length See output with: tmux -S '/tmp/parallel-local-ssh4-tmp/
par_transfer_return_multiple_inputs ### bug #43746: --transfer and --return of multiple inputs {1} and {2}
par_transfer_return_multiple_inputs ### and:
par_transfer_return_multiple_inputs ### bug #44371: --trc with csh complains

View file

@ -1,3 +1,5 @@
par_ssh_cmd_with_newline ### Check --ssh with \n works
par_ssh_cmd_with_newline uid=1003(sh) gid=1003(sh) groups=1003(sh)
par_pipe_retries ### bug #45025: --pipe --retries does not reschedule on other host
par_pipe_retries parallel: Warning: Could not figure out number of cpus on a.a (). Using 1.
par_pipe_retries 165668 165668 1048571
@ -18,6 +20,15 @@ par_env_parallel_onall Myfunc works
par_controlmaster_eats bug #36707: --controlmaster eats jobs
par_controlmaster_eats OK1
par_controlmaster_eats OK2
par_controlmaster ### Check -M works if TMPDIR contains space
par_controlmaster 1
par_controlmaster 2
par_controlmaster 3
par_controlmaster 1
par_controlmaster 2
par_controlmaster 3
par_controlmaster Part2
par_controlmaster OK
par_command_len_shellquote ### test quoting will not cause a crash if too long
par_command_len_shellquote -Slo -j10 " 1 1 1 1 4
par_command_len_shellquote -Slo -j10 " 1 2 1 1 10

View file

@ -45,25 +45,25 @@ echo '### bug #42041: Implement $PARALLEL_JOBSLOT'
2
echo '### bug #42363: --pipepart and --fifo/--cat does not work'
### bug #42363: --pipepart and --fifo/--cat does not work
seq 100 > /tmp/bug42363; parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:'; parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp\S+par).....:${1}XXXXX:'; rm /tmp/bug42363
14 14 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
9 9 28 /tmp/parallel-local22-tmpdir/parXXXXX
14 14 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
11 11 33 /tmp/parallel-local22-tmpdir/parXXXXX
9 9 28 /tmp/parallel-local22-tmpdir/parXXXXX
seq 100 > /tmp/bug42363; parallel --pipepart --block 31 -a /tmp/bug42363 -k --fifo wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:'; parallel --pipepart --block 31 -a /tmp/bug42363 -k --cat wc | perl -pe 's:(/tmp.*par).....:${1}XXXXX:'; rm /tmp/bug42363
14 14 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
9 9 28 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
14 14 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
11 11 33 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
9 9 28 '/tmp/parallel-local22-tmp/'$'\n'' </tmp/parXXXXX'
echo '### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile'
### bug #42055: --pipepart -a bigfile should not require sequential reading of bigfile
parallel --pipepart -a /etc/passwd -L 1 should not be run

View file

@ -254,7 +254,7 @@ echo '### Race condition bug - 1 - would block'; seq 1 80 | nice parallel -j0
### Race condition bug - 1 - would block
echo '### Race condition bug - 2 - would block'; seq 1 100 | nice parallel -j100 --block 1 --recend "" --pipe cat >/dev/null
### Race condition bug - 2 - would block
echo '### Test --block size=1'; seq 1 10| parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {}
echo '### Test --block size=1'; seq 1 10| TMPDIR=/tmp parallel --block 1 --files --recend "" --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {}
### Test --block size=1
@ -277,14 +277,14 @@ echo '### Test --block size=1'; seq 1 10| parallel --block 1 --files --recend
7
8
9
echo '### Test --block size=1M -j10 --files - more jobs than data'; sort -n < /tmp/blocktest | md5sum; cat /tmp/blocktest | parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --block size=1M -j10 --files - more jobs than data'; sort -n < /tmp/blocktest | md5sum; cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j10 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --block size=1M -j10 --files - more jobs than data
8a7095c1c23bfadc311fe6b16d950582 -
8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j1 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --block size=1M -j1 - more data than cpu
8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
echo '### Test --block size=1M -j1 - more data than cpu'; cat /tmp/blocktest | TMPDIR=/tmp parallel --files --recend "\n" -j2 --pipe sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --block size=1M -j1 - more data than cpu
8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --pipe default settings'; cat /tmp/blocktest | parallel --pipe sort | sort -n | md5sum

View file

@ -1,13 +1,16 @@
echo '### tmux-1.9'
### tmux-1.9
seq 510 512 | PARALLEL_TMUX=tmux-1.9 par_tmux
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach
See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0
seq 0000 10 510 | PARALLEL_TMUX=tmux-1.9 par_tmux
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach
See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0
echo '### tmux-1.9 fails' seq 512 10 2000 | PARALLEL_TMUX=tmux-1.9 par_tmux
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach
See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0
seq 2001 10 3000 | PARALLEL_TMUX=tmux-1.9 par_tmux
parallel: Error: Command line too long (2012 >= 523) at input 0: 2001
@ -62,19 +65,22 @@ parallel: Error: Command line too long (6 >= -1264) at input 0: 0
echo '### tmux-1.9 0..255 ascii'
### tmux-1.9 0..255 ascii
perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } 0..$_),"\n" } 0..255' | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux --timeout 5 echo | par_tmux_filter; echo $?
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach
See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
0
echo '### Test output ascii'
### Test output ascii
rm -f /tmp/paralocal7-ascii*; perl -e 'print map { ($_, map { pack("c*",$_) } grep { $_>=1 && $_!=10 } $_-10..$_),"\n" } 1..255' | stdout parallel --tmux echo {}'>>/tmp/paralocal7-ascii{%}' | par_tmux_filter; sort /tmp/paralocal7-ascii* | md5sum
See output with: tmux -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach
See output with: tmux -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
053c7e8e945ef7641fc63bc309ac069d -
echo '### Test critical lengths. Must not block'
### Test critical lengths. Must not block
seq 140 260 | PARALLEL_TMUX=tmux-1.8 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
parallel: Error: Command line too long (150 >= -1264) at input 0: 140
seq 140 260 | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux echo '{}{=$_="&"x$_=}' | par_tmux_filter
See output with: tmux-1.9 -S /tmp/parallel-local7-tmpdir/tmsXXXXX attach
See output with: tmux-1.9 -S '/tmp/parallel-local7-tmp/
</tmp/tmsXXXXX' attach
seq 560 850 | PARALLEL_TMUX=tmux-1.8 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter
parallel: Error: Command line too long (568 >= -1264) at input 0: 560
seq 560 850 | PARALLEL_TMUX=tmux-1.9 stdout parallel --tmux echo '{}{=$_="a"x$_=}' | par_tmux_filter

View file

@ -61,7 +61,8 @@ echo '### Test --spreadstdin - this failed during devel'; nice seq 1 1000000 |
echo '### Test --spreadstdin -k'; nice seq 1 1000000 | $NICEPAR -k --recend "\n" -j10 --spreadstdin gzip -9 | zcat | md5sum
### Test --spreadstdin -k
8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --spreadstdin --files'; nice seq 1 1000000 | shuf | $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
# --files requires TMPDIR does not contain \n
echo '### Test --spreadstdin --files'; nice seq 1 1000000 | shuf | TMPDIR=/tmp $NICEPAR --files --recend "\n" -j10 --spreadstdin sort -n | parallel -Xj1 sort -nm {} ";"rm {} | md5sum
### Test --spreadstdin --files
8a7095c1c23bfadc311fe6b16d950582 -
echo '### Test --tag ::: a ::: b'; stdout $NICEPAR -k --tag -j1 echo stderr-{.} ">&2;" echo stdout-{} ::: a ::: b

View file

@ -150,7 +150,8 @@ num30000
num8
tsv-file.tsv
foo
~
/tmp/parallel-tutorial-tmp/
</tmp
my_func() {
echo in my_func $1
}
@ -439,9 +440,14 @@ echo C
1-middle
1-end
parallel --files echo ::: A B C
/tmp/parallel-tutorial-tmpdir/parXXXXX.par
/tmp/parallel-tutorial-tmp/
</tmp/tempfile
/tmp/parallel-tutorial-tmp/
</tmp/tempfile
/tmp/parallel-tutorial-tmp/
</tmp/tempfile
parallel --tmpdir /var/tmp --files echo ::: A B C
/var/tmp/parXXXXX.par
/var/tmp/tempfile
parallel --results outdir echo ::: A B C
outdir/1/A/seq
outdir/1/A/stderr
@ -509,7 +515,8 @@ parallel: Warning: or increasing /proc/sys/fs/file-max
parallel --shuf echo ::: 1 2 3 ::: a b c ::: A B C
123 abc ABC
seq 10 20 | parallel --tmux 'echo start {}; sleep {}; echo done {}'
See output with: tmux -S /tmp/parallel-tutorial-tmpdir/tmsXXXXX attach
See output with: tmux -S '/tmp/parallel-tutorial-tmp/
</tmp/tmsXXXXX' attach
tmux -S /tmp/tmsXXXXX attach
no sessions
parallel --delay 2.5 echo Starting {}\;date ::: 1 2 3
@ -701,6 +708,8 @@ foo
parallel --workdir . -S $SERVER1 pwd ::: ""
parallel --workdir ... -S $SERVER1 pwd ::: ""
/home/parallel
/tmp/parallel-tutorial-tmp/
</tmp
/home/parallel/.TMPWORKDIR
parallel -S $SERVER1 --sshdelay 0.2 echo ::: 1 2 3
9
@ -787,6 +796,7 @@ BASH_FUNC_run_test%%
_
mysqlrootpass
oracle_password
testsuitedir
withpassword
# The function is only copied if using Bash
my_func2() {
@ -1315,7 +1325,7 @@ This helps funding further development; AND IT WON'T COST YOU A CENT.
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
More about funding GNU Parallel and the citation notice:
https://lists.gnu.org/archive/html/parallel/2013-11/msg00006.html
https://www.gnu.org/software/parallel/parallel_design.html#citation-notice
https://www.gnu.org/software/tempfileallel_design.html#citation-notice
https:BASE64-notice-faq.txt
If you send a copy of your published article to tange@gnu.org, it will be
mentioned in the release notes of next version of GNU Parallel.
@ -1330,4 +1340,10 @@ mentioned in the release notes of next version of GNU Parallel.
echo A
echo B
echo C
9
### 3+3 .par files (from --files), 1 .tms-file from tmux attach
A
A
B
B
C
C

View file

@ -47,7 +47,9 @@ def 3
### Test --debug
dburl mysql://tange:tange@localhost:3306/tange
databasedriver mysql user tange password tange host localhost port 3306 database tange query
[ | ((sleep 1; rm tmpfile) & mysql --defaults-extra-file=tmpfile -C --host=localhost --user=tange --port=3306 tange)]
[ | ((sleep 1; rm '/tmp/sql01-tmp/
<tmpfile') & mysql --defaults-extra-file='/tmp/sql01-tmp/
<tmpfile' --host=localhost --user=tange --port=3306 tange)]
Test if --debug works
Yes it does
### Test --version -V

View file

@ -3,7 +3,7 @@ par_influx empty input
par_influx empty input
par_influx empty input
par_influx dbsize is not implemented for influx
par_influx Field separator not implemented for influx at /usr/local/bin/sql line 889.
par_influx Field separator not implemented for influx at /usr/local/bin/sql line 892.
par_influx name: databases
par_influx name
par_influx ----