eval $perlexpr as function. Added --plus. Forced --noctrlc if --controlmaster.

Added CITATION. --title for pod2html. Testsuite updates due to LinuxMint15/17 diffs.
This commit is contained in:
Ole Tange 2014-07-26 13:17:13 +02:00
parent 6a4bd4911b
commit 9a25177a19
25 changed files with 1766 additions and 1533 deletions

23
CITATION Normal file
View file

@ -0,0 +1,23 @@
When using programs that use GNU Parallel to process data for publication please cite:
@article{Tange2011a,
title = {GNU Parallel - The Command-Line Power Tool},
author = {O. Tange},
address = {Frederiksberg, Denmark},
journal = {;login: The USENIX Magazine},
month = {Feb},
number = {1},
volume = {36},
url = {http://www.gnu.org/s/parallel},
year = {2011},
pages = {42-47}
}
(Feel free to use \nocite{Tange2011a})
Or:
O. Tange (2011): GNU Parallel - The Command-Line Power Tool,
;login: The USENIX Magazine, February 2011:42-47.
This helps funding further development.

View file

@ -2,3 +2,5 @@ SUBDIRS = src
test:
cd testsuite; make 1
EXTRA_DIST = CITATION

View file

@ -197,6 +197,7 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
SUBDIRS = src
EXTRA_DIST = CITATION
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive

View file

@ -164,6 +164,7 @@ YYYYMMDD=`yyyymmdd`
git tag -s -m "Released as $YYYYMMDD ('$TAG')" $TAG
git tag -s -m "Released as $YYYYMMDD ('$TAG')" $YYYYMMDD
git push
== Update Savannah ==

View file

@ -38,35 +38,35 @@ niceload.1: niceload.pod
|| echo "Warning: pod2man not found. Using old niceload.1"
parallel.html: parallel.pod
pod2html $(srcdir)/parallel.pod > $(srcdir)/parallel.htmln \
pod2html --title "GNU Parallel" $(srcdir)/parallel.pod > $(srcdir)/parallel.htmln \
&& mv $(srcdir)/parallel.htmln $(srcdir)/parallel.html \
|| echo "Warning: pod2html not found. Using old parallel.html"
rm -f $(srcdir)/pod2htm*
# Depending on parallel.html to avoid stupid pod2html race condition
parallel_tutorial.html: parallel_tutorial.pod parallel.html
pod2html $(srcdir)/parallel_tutorial.pod > $(srcdir)/parallel_tutorial.htmln \
pod2html --title "GNU Parallel tutorial" $(srcdir)/parallel_tutorial.pod > $(srcdir)/parallel_tutorial.htmln \
&& mv $(srcdir)/parallel_tutorial.htmln $(srcdir)/parallel_tutorial.html \
|| echo "Warning: pod2html not found. Using old parallel_tutorial.html"
rm -f $(srcdir)/pod2htm*
# Depending on parallel_tutorial.html to avoid stupid pod2html race condition
sem.html: sem.pod parallel_tutorial.html
pod2html $(srcdir)/sem.pod > $(srcdir)/sem.htmln \
pod2html --title "sem (GNU Parallel)" $(srcdir)/sem.pod > $(srcdir)/sem.htmln \
&& mv $(srcdir)/sem.htmln $(srcdir)/sem.html \
|| echo "Warning: pod2html not found. Using old sem.html"
rm -f $(srcdir)/pod2htm*
# Depending on sem.html to avoid stupid pod2html race condition
sql.html: sql sem.html
pod2html $(srcdir)/sql > $(srcdir)/sql.htmln \
pod2html --title "GNU SQL" $(srcdir)/sql > $(srcdir)/sql.htmln \
&& mv $(srcdir)/sql.htmln $(srcdir)/sql.html \
|| echo "Warning: pod2html not found. Using old sql.html"
rm -f $(srcdir)/pod2htm*
# Depending on sql.html to avoid stupid pod2html race condition
niceload.html: niceload.pod sql.html
pod2html $(srcdir)/niceload.pod > $(srcdir)/niceload.htmln \
pod2html --title "GNU niceload" $(srcdir)/niceload.pod > $(srcdir)/niceload.htmln \
&& mv $(srcdir)/niceload.htmln $(srcdir)/niceload.html \
|| echo "Warning: pod2html not found. Using old niceload.html"
rm -f $(srcdir)/pod2htm*

View file

@ -572,6 +572,7 @@ sub options_hash {
# Replacement strings
"parens=s" => \$opt::parens,
"rpl=s" => \@opt::rpl,
"plus" => \$opt::plus,
"I=s" => \$opt::I,
"extensionreplace|er=s" => \$opt::U,
"U=s" => \$opt::retired,
@ -739,6 +740,21 @@ sub parse_options {
'{/.}' => 's:.*/::; s:\.[^/.]+$::;',
'{.}' => 's:\.[^/.]+$::',
);
%Global::plus =
(
# {} = {+/}/{/}
# = {.}.{+.} = {+/}/{/.}.{+.}
# = {..}.{+..} = {+/}/{/..}.{+..}
# = {...}.{+...} = {+/}/{/...}.{+...}
'{+/}' => 's:/[^/]*$::',
'{+.}' => 's:.*\.::',
'{+..}' => 's:.*\.([^.]*\.):$1:',
'{+...}' => 's:.*\.([^.]*\.[^.]*\.):$1:',
'{..}' => 's:\.[^/.]+$::; s:\.[^/.]+$::',
'{...}' => 's:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::',
'{/..}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::',
'{/...}' => 's:.*/::; s:\.[^/.]+$::; s:\.[^/.]+$::; s:\.[^/.]+$::',
);
# Modifiable copy of %Global::replace
%Global::rpl = %Global::replace;
$Global::parens = "{==}";
@ -784,6 +800,7 @@ sub parse_options {
my $parenslen = 0.5*length $Global::parens;
$Global::parensleft = substr($Global::parens,0,$parenslen);
$Global::parensright = substr($Global::parens,$parenslen);
if(defined $opt::plus) { %Global::rpl = (%Global::plus,%Global::rpl); }
if(defined $opt::I) { rpl('{}',$opt::I); }
if(defined $opt::U) { rpl('{.}',$opt::U); }
if(defined $opt::i and $opt::i) { rpl('{}',$opt::i); }
@ -828,6 +845,7 @@ sub parse_options {
not defined $opt::recend) { $opt::recend = "\n"; }
if(not defined $opt::blocksize) { $opt::blocksize = "1M"; }
$opt::blocksize = multiply_binary_prefix($opt::blocksize);
if(defined $opt::controlmaster) { $opt::noctrlc = 1; }
if(defined $opt::semaphore) { $Global::semaphore = 1; }
if(defined $opt::semaphoretimeout) { $Global::semaphore = 1; }
if(defined $opt::semaphorename) { $Global::semaphore = 1; }
@ -1358,8 +1376,10 @@ sub shell_quote_scalar {
# $shell_quoted = string quoted with \ as needed by the shell
my $a = $_[0];
if(defined $a) {
$a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g;
$a =~ s/[\n]/'\n'/g; # filenames with '\n' is quoted using \'
# $a =~ s/([\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\*\>\<\~\|\; \"\!\$\&\'\202-\377])/\\$1/g;
# This is 1% faster than the above
$a =~ s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\*\>\<\~\|\; \"\!\$\&\'\202-\377]/\\$&/go;
$a =~ s/[\n]/'\n'/go; # filenames with '\n' is quoted using \'
}
return $a;
}
@ -2064,7 +2084,7 @@ sub parse_sshlogin {
}
debug("start", "sshlogin: ", my_dump(%Global::host),"\n");
# debug("start", "sshlogin: ", my_dump(%Global::host),"\n");
if($opt::transfer or @opt::return or $opt::cleanup or @opt::basefile) {
if(not remote_hosts()) {
# There are no remote hosts
@ -2507,6 +2527,7 @@ sub usage {
print join
("\n",
"Usage:",
"",
"$Global::progname [options] [command [arguments]] < list_of_arguments",
"$Global::progname [options] [command [arguments]] (::: arguments|:::: argfile(s))...",
"cat ... | $Global::progname --pipe [options] [command [arguments]]",
@ -2515,8 +2536,10 @@ sub usage {
"-k Keep same order",
"-X Multiple arguments with context replace",
"--colsep regexp Split input on regexp for positional replacements",
"{} {.} {/} {/.} {#} {%} Replacement strings",
"{3} {3.} {3/} {3/.} Positional replacement strings",
"{} {.} {/} {/.} {#} {%} {= perl code =} Replacement strings",
"{3} {3.} {3/} {3/.} {=3 perl code =} Positional replacement strings",
"With --plus: {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} =",
" {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...}",
"",
"-S sshlogin Example: foo\@server.example.com",
"--slf .. Use ~/.parallel/sshloginfile as the list of sshlogins",
@ -4098,8 +4121,7 @@ sub no_of_cpus_irix {
# Returns:
# Number of physical CPUs on IRIX
# undef if not IRIX
my $no_of_cpus =
(`hinv | grep HZ | grep Processor | awk '{print \$1}'`);
my $no_of_cpus = `hinv | grep HZ | grep Processor | awk '{print \$1}'`;
return $no_of_cpus;
}
@ -4107,8 +4129,7 @@ sub no_of_cores_irix {
# Returns:
# Number of CPU cores on IRIX
# undef if not IRIX
my $no_of_cores =
(`hinv | grep HZ | grep Processor | awk '{print \$1}'`);
my $no_of_cores = `hinv | grep HZ | grep Processor | awk '{print \$1}'`;
return $no_of_cores;
}
@ -4116,8 +4137,7 @@ sub no_of_cpus_tru64 {
# Returns:
# Number of physical CPUs on Tru64
# undef if not Tru64
my $no_of_cpus =
(`sizer -pr`);
my $no_of_cpus = `sizer -pr`;
return $no_of_cpus;
}
@ -4125,8 +4145,7 @@ sub no_of_cores_tru64 {
# Returns:
# Number of CPU cores on Tru64
# undef if not Tru64
my $no_of_cores =
(`sizer -pr`);
my $no_of_cores = `sizer -pr`;
return $no_of_cores;
}
@ -5800,18 +5819,18 @@ sub push {
my $self = shift;
my $record = shift;
push @{$self->{'arg_list'}}, $record;
my $arg_no = ($self->number_of_args()-1) * ($#$record+1);
my $quote_arg = $Global::noquote ? 0 : not $Global::quoting;
my $rep;
for my $arg (@$record) {
$arg_no++;
if(defined $arg) {
for my $perlexpr (keys %{$self->{'replacecount'}}) {
$rep = $arg->replace($perlexpr,$quote_arg,$self);
$self->{'len'}{$perlexpr} += length $rep;
::debug("length", "Length: ", length $rep,
"(", $perlexpr, "=>", $rep, ")\n");
# 50% faster than below
$self->{'len'}{$perlexpr} += length $arg->replace($perlexpr,$quote_arg,$self);
# $rep = $arg->replace($perlexpr,$quote_arg,$self);
# $self->{'len'}{$perlexpr} += length $rep;
# ::debug("length", "Length: ", length $rep,
# "(", $perlexpr, "=>", $rep, ")\n");
}
}
}
@ -6207,7 +6226,7 @@ sub replace_placeholders {
@target = ::shell_quote(@target);
}
::debug("replace", "%replace=".(::my_dump(%replace))."\n");
# ::debug("replace", "%replace=",::my_dump(%replace),"\n");
if(%replace) {
# Substitute the replace strings with the replacement values
# Must be sorted by length if a short word is a substring of a long word
@ -6795,22 +6814,22 @@ sub read_arg_from_fh {
my $prepend = undef;
my $arg;
do {{
if(eof($fh)) {
# This makes 10% faster
if(not ($arg = <$fh>)) {
if(defined $prepend) {
return Arg->new($prepend);
} else {
return undef;
}
}
$arg = <$fh>;
::debug("run", "read $arg\n");
# ::debug("run", "read $arg\n");
# Remove delimiter
$arg =~ s:$/$::;
if($Global::end_of_file_string and
$arg eq $Global::end_of_file_string) {
# Ignore the rest of input file
while (<$fh>) {}
::debug("run", "EOF-string $arg\n");
# ::debug("run", "EOF-string $arg\n");
if(defined $prepend) {
return Arg->new($prepend);
} else {
@ -6878,7 +6897,7 @@ sub new {
sub replace {
# Calculates the corresponding value for a given perl expression
# Returns:
# The calculated string unquoted
# The calculated string (quoted if asked for)
my $self = shift;
my $perlexpr = shift; # E.g. $_=$_ or s/.gz//
my $quote = (shift) ? 1 : 0; # should the string be quoted?
@ -6887,15 +6906,26 @@ sub replace {
my $job = shift;
$perlexpr =~ s/^-?\d+ //; # Positional replace treated as normal replace
if(not defined $self->{"rpl",0,$perlexpr}) {
my $s;
local $_;
if($Global::trim eq "n") {
$s = $self->{'orig'};
$_ = $self->{'orig'};
} else {
$s = trim_of($self->{'orig'});
$_ = trim_of($self->{'orig'});
}
local $_ = $s;
::debug("replace", "eval ", $perlexpr, " ", $_, "\n");
eval $perlexpr;
if(not $Global::perleval{$perlexpr}) {
# Make an anonymous function of the $perlexpr
# And more importantly: Compile it only once
if($Global::perleval{$perlexpr} = eval('sub { my $job = shift; '.$perlexpr.' }')) {
# All is good
} else {
# The eval failed. Maybe $perlexpr is invalid perl?
::error("Cannot use $perlexpr\n");
::wait_and_exit(255);
}
}
# Execute the function
$Global::perleval{$perlexpr}->($job);
$self->{"rpl",0,$perlexpr} = $_;
}
if(not defined $self->{"rpl",$quote,$perlexpr}) {

View file

@ -1,5 +1,7 @@
#!/usr/bin/perl -w
=encoding utf8
=head1 NAME
parallel - build and execute shell command lines from standard input in parallel

View file

@ -172,7 +172,7 @@ If it is a zsh function you will need to use this helper function
SHELL=/bin/bash parallel "my_func {}" ::: 1 2
@end verbatim
The command cannot contain the character \257 (¯).
The command cannot contain the character \257 (¯).
@item @strong{@{@}} (alpha testing)
@anchor{@strong{@{@}} (alpha testing)}

View file

@ -1,4 +1,4 @@
.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
.\"
.\" Standard preamble:
.\" ========================================================================
@ -38,6 +38,8 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
@ -48,17 +50,24 @@
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{
. if \nF \{
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{
. nr % 0
. rr F
.\}
.el \{\
. de IX
..
. nr F 2
. \}
. \}
.\}
.rr rF
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
@ -124,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "PARALLEL_TUTORIAL 1"
.TH PARALLEL_TUTORIAL 1 "2014-07-20" "20140711" "parallel"
.TH PARALLEL_TUTORIAL 1 "2014-07-26" "20140722" "parallel"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@ -257,7 +266,7 @@ The input source can be a file:
.PP
Output: Same as above.
.PP
\&\s-1STDIN\s0 (standard input) can be the input source:
\&\s-1STDIN \s0(standard input) can be the input source:
.PP
.Vb 1
\& cat abc\-file | parallel echo
@ -296,7 +305,7 @@ The input sources can be files:
.PP
Output: Same as above.
.PP
\&\s-1STDIN\s0 (standard input) can be one of the input sources using '\-':
\&\s-1STDIN \s0(standard input) can be one of the input sources using '\-':
.PP
.Vb 1
\& cat abc\-file | parallel \-a \- \-a def\-file echo
@ -721,7 +730,7 @@ replacement string, too:
.PP
Output: Same as above.
.PP
\&\s-1GNU\s0 \fBparallel\fR's 7 replacement strings are implemented as:
\&\s-1GNU \s0\fBparallel\fR's 7 replacement strings are implemented as:
.PP
.Vb 7
\& \-\-rpl \*(Aq{} \*(Aq
@ -814,7 +823,7 @@ Output: Same as above.
.IX Subsection "Input from columns"
.PP
The columns in a file can be bound to positional replacement strings
using \-\-colsep. Here the columns are separated with \s-1TAB\s0 (\et):
using \-\-colsep. Here the columns are separated with \s-1TAB \s0(\et):
.PP
.Vb 1
\& parallel \-\-colsep \*(Aq\et\*(Aq echo 1={1} 2={2} :::: tsv\-file.tsv
@ -2127,7 +2136,7 @@ where command_B is slow, and you want to speed up command_B.
.SS "Chunk size"
.IX Subsection "Chunk size"
By default \s-1GNU\s0 Parallel will start an instance of command_B, read a
chunk of 1 \s-1MB\s0, and pass that to the instance. Then start another
chunk of 1 \s-1MB,\s0 and pass that to the instance. Then start another
instance, read another chunk, and pass that to the second instance.
.PP
.Vb 1
@ -2148,7 +2157,7 @@ Output (the order may be different):
.PP
The size of the chunk is not exactly 1 \s-1MB\s0 because \s-1GNU\s0 Parallel only
passes full lines \- never half a line, thus the blocksize is only
average 1 \s-1MB\s0. You can change the block size to 2 \s-1MB\s0 with \-\-block:
average 1 \s-1MB.\s0 You can change the block size to 2 \s-1MB\s0 with \-\-block:
.PP
.Vb 1
\& cat num1000000 | parallel \-\-pipe \-\-block 2M wc

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -58,7 +58,7 @@ installparallel: ../src/parallel
startdb:
#echo shutdown abort | sudo su - oracle -c "sqlplus / as sysdba"
sudo parallel /etc/init.d/{} restart ::: postgresql mysql # oracle-xe
sudo parallel /etc/init.d/{} status '||' /etc/init.d/{} restart ::: postgresql mysql # oracle-xe
VBoxManage startvm OracleXE || true
clean:

View file

@ -5,12 +5,15 @@ echo '### Test installation missing pod2*'
parallel which ::: pod2html pod2man pod2texi pod2pdf | sudo parallel mv {} {}.hidden
cd ~/privat/parallel
# Make a .tar.gz file
stdout make dist | perl -pe 's/make\[\d\]/make[0]/g;s/\d{8}/00000000/g'
LAST=$(ls *tar.gz | tail -n1)
cd /tmp
rm -rf parallel-20??????/
tar xf ~/privat/parallel/$LAST
cd parallel-20??????/
# Make sure files depending on *.pod have to be rebuilt
touch src/*pod src/sql
./configure && sudo stdout make install | perl -pe 's/make\[\d\]/make[0]/g;s/\d{8}/00000000/g'

View file

@ -58,6 +58,7 @@ echo '### bug #42055: --pipe -a bigfile should not require sequential reading of
parallel --pipepart -a /etc/passwd -l 1 should not be run
echo '### --tmux test - check termination'
perl -e 'map {printf "$_%o%c\n",$_,$_}1..255' | parallel --tmux echo {} :::: - ::: a b
perl -e 'map {printf "$_%o%c\n",$_,$_}1..255' | stdout parallel --tmux echo {} :::: - ::: a b | perl -pe 's/\d/0/g'
EOF

View file

@ -12,7 +12,7 @@ echo '### Test --keeporder'
(seq 0 2) | parallel --keeporder -j100% -S 1/:,2/parallel@parallel-server2 -q perl -e 'sleep 1;print "job{}\n";exit({})'
echo '### Test SIGTERM'
parallel -k -j9 sleep 3';' echo ::: {1..99} >/tmp/$$ 2>&1 &
parallel -k -j20 sleep 3';' echo ::: {1..99} >/tmp/$$ 2>&1 &
A=$!
sleep 5; kill -TERM $A
wait

View file

@ -43,7 +43,7 @@ echo "#2/ssh -l tange nothing" >>/tmp/parallel-sshlogin
seq 1 10 | parallel -k --sshloginfile /tmp/parallel-sshlogin echo
echo '### Check forced number of CPUs being respected'
stdout seq 1 20 | parallel -k -j+0 -S 1/:,7/$SSHLOGIN1 "hostname; echo {} >/dev/null"
seq 1 20 | stdout parallel -k -j+0 -S 1/:,7/$SSHLOGIN1 "hostname; echo {} >/dev/null" | sort
echo '### Check more than 9 simultaneous sshlogins'
seq 1 11 | parallel -k -j0 -S "ssh $SSHLOGIN1" echo

View file

@ -5,20 +5,20 @@ SERVER2=parallel-server2
echo '### Test $PARALLEL - single line'
echo | PARALLEL=--number-of-cpus parallel
seq 1 2 | PARALLEL="-Sparallel\@$SERVER1 -Sssh\ -l\ parallel\ $SERVER2 -j1" parallel -kvv echo
(echo 1; echo 1) | PARALLEL="-Sparallel\@$SERVER1 -Sssh\ -l\ parallel\ $SERVER2 -j1" parallel -kv hostname\; echo | sort
echo '### Test $PARALLEL - multi line'
seq 1 2 | PARALLEL="-Sparallel\@$SERVER1
(echo 1; echo 1) | PARALLEL="-Sparallel\@$SERVER1
-Sssh\ -l\ parallel\ $SERVER2
-j1" parallel -kvv echo
-j1" parallel -kv hostname\; echo | sort
echo '### Test ~/.parallel/config - single line'
echo "-Sparallel\@$SERVER1 -Sssh\ -l\ parallel\ $SERVER2 -j1" > ~/.parallel/config
seq 1 2 | parallel -kvv echo
(echo 1; echo 1) | parallel -kv hostname\; echo | sort
echo '### Test ~/.parallel/config - multi line'
echo "-Sparallel\@$SERVER1
-Sssh\ -l\ parallel\ $SERVER2
-j1" > ~/.parallel/config
seq 1 2 | parallel -kvv echo
(echo 1; echo 1) | parallel -kv hostname\; echo | sort
rm ~/.parallel/config

View file

@ -5,26 +5,6 @@ test -d "parallel-00000000" || mkdir "parallel-00000000"
(cd src && make top_distdir=../parallel-00000000 distdir=../parallel-00000000/src \
am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)
make[0]: Entering directory `/home/tange/privat/parallel/src'
pod2man --release='00000000' --center='parallel' \
--section=1 ./parallel.pod > ./parallel.1n \
&& mv ./parallel.1n ./parallel.1 \
|| echo "Warning: pod2man not found. Using old parallel.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel.1
pod2html ./parallel.pod > ./parallel.htmln \
&& mv ./parallel.htmln ./parallel.html \
|| echo "Warning: pod2html not found. Using old parallel.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel.html
rm -f ./pod2htm*
pod2texi --output=./parallel.texi ./parallel.pod \
|| echo "Warning: pod2texi not found. Using old parallel.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel.texi
pod2pdf --output-file ./parallel.pdf ./parallel.pod --title "GNU Parallel" \
|| echo "Warning: pod2pdf not found. Using old parallel.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel.pdf
make[0]: Leaving directory `/home/tange/privat/parallel/src'
test -n "" \
|| find "parallel-00000000" -type d ! -perm -755 \

View file

@ -75,5 +75,5 @@ parallel: Error: --pipepart is incompatible with --max-replace-args, --max-lines
parallel: Error: --pipepart is incompatible with --max-replace-args, --max-lines, and -L.
echo '### --tmux test - check termination'
### --tmux test - check termination
perl -e 'map {printf "$_%o%c\n",$_,$_}1..255' | parallel --tmux echo {} :::: - ::: a b
See output with: tmux attach -t p6522
perl -e 'map {printf "$_%o%c\n",$_,$_}1..255' | stdout parallel --tmux echo {} :::: - ::: a b | perl -pe 's/\d/0/g'
See output with: tmux attach -t p00000

View file

@ -180,6 +180,7 @@ echo "# --recend '' --files --halt-on-error"
echo '### Test of -j filename - non-existent file'; nice stdout parallel -j no_such_file echo ::: 1
### Test of -j filename - non-existent file
Usage:
parallel [options] [command [arguments]] < list_of_arguments
parallel [options] [command [arguments]] (::: arguments|:::: argfile(s))...
cat ... | parallel --pipe [options] [command [arguments]]
@ -188,8 +189,10 @@ cat ... | parallel --pipe [options] [command [arguments]]
-k Keep same order
-X Multiple arguments with context replace
--colsep regexp Split input on regexp for positional replacements
{} {.} {/} {/.} {#} {%} Replacement strings
{3} {3.} {3/} {3/.} Positional replacement strings
{} {.} {/} {/.} {#} {%} {= perl code =} Replacement strings
{3} {3.} {3/} {3/.} {=3 perl code =} Positional replacement strings
With --plus: {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} =
{+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...}
-S sshlogin Example: foo@server.example.com
--slf .. Use ~/.parallel/sshloginfile as the list of sshlogins

View file

@ -1,5 +1,5 @@
### Test -k
parallel: Warning: Only enough file handles to run 8 jobs in parallel.
parallel: Warning: Only enough file handles to run 9 jobs in parallel.
Raising ulimit -n or /etc/security/limits.conf may help.
begin
1
@ -9,8 +9,8 @@ begin
5
6
7
parallel: Warning: No more file handles. Raising ulimit -n or /etc/security/limits.conf may help.
8
parallel: Warning: No more file handles. Raising ulimit -n or /etc/security/limits.conf may help.
9
10
11
@ -51,6 +51,8 @@ job2
14
15
16
17
18
2
3
4
@ -61,8 +63,8 @@ job2
9
Raising ulimit -n or /etc/security/limits.conf may help.
parallel: SIGTERM received. No new jobs will be started.
parallel: Waiting for these 8 jobs to finish. Send SIGTERM again to stop now.
parallel: Warning: Only enough file handles to run 8 jobs in parallel.
parallel: Waiting for these 9 jobs to finish. Send SIGTERM again to stop now.
parallel: Warning: Only enough file handles to run 9 jobs in parallel.
parallel: sleep 3; echo 10
parallel: sleep 3; echo 11
parallel: sleep 3; echo 12
@ -70,7 +72,8 @@ parallel: sleep 3; echo 13
parallel: sleep 3; echo 14
parallel: sleep 3; echo 15
parallel: sleep 3; echo 16
parallel: sleep 3; echo 9
parallel: sleep 3; echo 17
parallel: sleep 3; echo 18
### Test bug: empty line for | sh with -k
a
b

View file

@ -383,8 +383,8 @@ line 2
### Test --no-run-if-empty and -r: This should give no output
### Test --help and -h: Help output (just check we get the same amount of lines)
Output from -h and --help
28
28
31
31
### Test --version: Version output (just check we get the same amount of lines)
12
### Test --verbose and -t

View file

@ -79,6 +79,18 @@ parallel: Warning: --cleanup ignored as there are no remote --sshlogin.
10
### Check forced number of CPUs being respected
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
redhat9.tange.dk
redhat9.tange.dk
redhat9.tange.dk
@ -86,18 +98,6 @@ redhat9.tange.dk
redhat9.tange.dk
redhat9.tange.dk
redhat9.tange.dk
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
aspire
### Check more than 9 simultaneous sshlogins
1
2

View file

@ -76,15 +76,15 @@ ls: tmp/parallel.file*: No such file or directory
OK
Input for ssh
parallel@parallel-server1 mkdir -p ./.
-l parallel parallel-server1 rsync --server -lDrRze.iLsf . ./.
-l parallel parallel-server1 rsync --server -lDrRze.iLs . ./.
-tt -oLogLevel=quiet parallel@parallel-server1 eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ 2\; setenv PARALLEL_PID 00000 || echo PARALLEL_SEQ=2\;export PARALLEL_SEQ\; PARALLEL_PID=00000\;export PARALLEL_PID` ; tty >/dev/null && stty isig -onlcr -echo;cat tmp/parallel.file.'
'newline2 > tmp/parallel.file.'
'newline2.out;cat tmp/parallel.file.'
'newline2 > tmp/parallel.file.'
'newline2.out2
-l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLsf . ./parallel.file.'
-l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline2.out
-l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLsf . ./parallel.file.'
-l parallel parallel-server1 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline2.out2
parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline2; rmdir ./tmp/ ./ 2>/dev/null;)
@ -93,15 +93,15 @@ parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
parallel@parallel-server1 (rm -f ./tmp/parallel.file.'
'newline2.out2; rmdir ./tmp/ ./ 2>/dev/null;)
parallel@parallel-server2 mkdir -p ./.
-l parallel parallel-server2 rsync --server -lDrRze.iLsf . ./.
-l parallel parallel-server2 rsync --server -lDrRze.iLs . ./.
-tt -oLogLevel=quiet parallel@parallel-server2 eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ 1\; setenv PARALLEL_PID 00000 || echo PARALLEL_SEQ=1\;export PARALLEL_SEQ\; PARALLEL_PID=00000\;export PARALLEL_PID` ; tty >/dev/null && stty isig -onlcr -echo;cat tmp/parallel.file.'
'newline1 > tmp/parallel.file.'
'newline1.out;cat tmp/parallel.file.'
'newline1 > tmp/parallel.file.'
'newline1.out2
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLsf . ./parallel.file.'
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline1.out
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLsf . ./parallel.file.'
-l parallel parallel-server2 cd ././tmp; rsync --server --sender -lDrRze.iLs . ./parallel.file.'
'newline1.out2
parallel@parallel-server2 (rm -f ./tmp/parallel.file.'
'newline1; rmdir ./tmp/ ./ 2>/dev/null;)

View file

@ -1,21 +1,29 @@
### Test $PARALLEL - single line
1
ssh -l parallel -tt -oLogLevel=quiet parallel-server2 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 1;
1
ssh -tt -oLogLevel=quiet parallel\@parallel-server3 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 2;
2
1
centos3.tange.dk
hostname; echo 1
hostname; echo 1
nlv
### Test $PARALLEL - multi line
ssh -l parallel -tt -oLogLevel=quiet parallel-server2 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 1;
1
ssh -tt -oLogLevel=quiet parallel\@parallel-server3 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 2;
2
1
centos3.tange.dk
hostname; echo 1
hostname; echo 1
nlv
### Test ~/.parallel/config - single line
ssh -l parallel -tt -oLogLevel=quiet parallel-server2 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 1;
1
ssh -tt -oLogLevel=quiet parallel\@parallel-server3 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 2;
2
1
centos3.tange.dk
hostname; echo 1
hostname; echo 1
nlv
### Test ~/.parallel/config - multi line
ssh -l parallel -tt -oLogLevel=quiet parallel-server2 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 1;
1
ssh -tt -oLogLevel=quiet parallel\@parallel-server3 'eval `echo $SHELL | grep "/t\{0,1\}csh" > /dev/null && echo setenv PARALLEL_SEQ '$PARALLEL_SEQ'\; setenv PARALLEL_PID '$PARALLEL_PID' || echo PARALLEL_SEQ='$PARALLEL_SEQ'\;export PARALLEL_SEQ\; PARALLEL_PID='$PARALLEL_PID'\;export PARALLEL_PID` ;' tty\ \>/dev/null\ \&\&\ stty\ isig\ -onlcr\ -echo\;echo\ 2;
2
1
centos3.tange.dk
hostname; echo 1
hostname; echo 1
nlv