Merge branch 'master' of ssh://git.sv.gnu.org/srv/git/parallel

This commit is contained in:
Ole Tange 2018-11-30 07:15:46 +01:00
commit 1501d93eea
125 changed files with 5107 additions and 4051 deletions

View file

@ -1,7 +1,6 @@
#!/bin/bash #!/bin/bash
# Copyright (C) 2013,2014,2015,2017 Ole Tange and Free Software # Copyright (C) 2013-2018 Ole Tange and Free Software Foundation, Inc.
# Foundation, Inc.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -15,7 +14,7 @@
# If that fails, it does a personal installation. # If that fails, it does a personal installation.
# If that fails, it copies to $HOME/bin # If that fails, it copies to $HOME/bin
# #
# Download and run the script directly by: # You can download and run the script directly by:
# (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash # (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
run() { run() {
@ -52,13 +51,40 @@ run() {
$GET http://ftpmirror.gnu.org/parallel/$LATEST.tar.bz2.sig > $LATEST.tar.bz2.sig $GET http://ftpmirror.gnu.org/parallel/$LATEST.tar.bz2.sig > $LATEST.tar.bz2.sig
fi fi
fetch_keys() {
if gpg -h 2>/dev/null >/dev/null ; then
# GnuPG installed
# Setup .gnupg/gpg.conf if not already done
echo | gpg 2>/dev/null >/dev/null
keyserver1=keys.gnupg.net
keyserver2=pool.sks-keyservers.net
if gpg --keyserver $keyserver1 --recv-key 0xFFFFFFF1 ||
gpg --keyserver $keyserver2 --recv-key 0xFFFFFFF1 ; then
if gpg --keyserver $keyserver1 --recv-key 0x88888888 ||
gpg --keyserver $keyserver2 --recv-key 0x88888888; then
# OK
return 0
else
echo
echo "Cannot fetch keyID 0x88888888, so the signature cannot be checked."
return 1
fi
else
echo
echo "Cannot fetch keyID 0xFFFFFFF1, so the signature cannot be checked."
return 1
fi
else
# GnuPG not installed
echo
echo "GnuPG (gpg) is not installed so the signature cannot be checked."
return 1
fi
}
# Check signature - in case ftpmirror.gnu.org is compromised # Check signature - in case ftpmirror.gnu.org is compromised
if gpg -h 2>/dev/null >/dev/null; then if fetch_keys; then
# GnuPG installed
# Setup .gnupg/gpg.conf if not already done
echo | gpg 2>/dev/null >/dev/null
gpg --keyserver keys.gnupg.net --recv-key FFFFFFF1
gpg --keyserver keys.gnupg.net --recv-key 88888888
if gpg --with-fingerprint $LATEST.tar.bz2.sig 2>&1 | if gpg --with-fingerprint $LATEST.tar.bz2.sig 2>&1 |
$GREP -E '^Primary key fingerprint: BE9C B493 81DE 3166 A3BC 66C1 2C62 29E2 FFFF FFF1|^Primary key fingerprint: CDA0 1A42 08C4 F745 0610 7E7B D1AB 4516 8888 8888' ; then $GREP -E '^Primary key fingerprint: BE9C B493 81DE 3166 A3BC 66C1 2C62 29E2 FFFF FFF1|^Primary key fingerprint: CDA0 1A42 08C4 F745 0610 7E7B D1AB 4516 8888 8888' ; then
# Source code signed by Ole Tange <ole@tange.dk> # Source code signed by Ole Tange <ole@tange.dk>
@ -74,8 +100,7 @@ run() {
exit 1 exit 1
fi fi
else else
# GnuPG not installed # GnuPG not installed or public keys not downloaded
echo "GnuPG (gpg) is not installed so the signature cannot be checked."
echo "This means that if the code has been changed by criminals, you will not discover that!" echo "This means that if the code has been changed by criminals, you will not discover that!"
echo echo
echo "Continue anyway? (y/n)" echo "Continue anyway? (y/n)"

View file

@ -1,5 +1,7 @@
People who have helped GNU Parallel different ways. People who have helped GNU Parallel different ways.
Jakub Kulík: Maintaining GNU Parallel for Solaris-userland.
Rich Burridge: Maintaining GNU Parallel for Solaris-userland.
Jonathan Kamens: Bug patch for chomp. Jonathan Kamens: Bug patch for chomp.
John Rusnak: Feedback on all documentation. John Rusnak: Feedback on all documentation.
FrithMartin: Bug patch for orphan blocks. FrithMartin: Bug patch for orphan blocks.

View file

@ -120,6 +120,7 @@ monitorman:
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f . | parallel -uj1 'echo {=/\.pod$$/ or skip()=};make -j && sudo make install; pdfman {/.} &' inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f . | parallel -uj1 'echo {=/\.pod$$/ or skip()=};make -j && sudo make install; pdfman {/.} &'
testurls: testurls:
grep -h -Po 'https?://[^ $$<>")}]+' src/* | perl -pe 's/(&gt|\{).*//;s/\\//g;s/&amp;/&/g;s/&#.*//;'"s/'.*//" | sort -u | parallel -j0 --tag 'wget -qm -l1 -Q1 {}; echo $$?' mkdir -p urls
cd urls && grep -v '(dead)' ../src/* | grep -h -Po 'https?://[^ $$<>")}]+' | perl -pe 's/(&gt|\{).*//;s/\\-/-/g;s/\\n//g;s/&amp;/&/g;s/&#.*//;'"s/'.*//" | sort -u | egrep -v 'example.com|##|\*\(' | parallel -j0 --timeout 33 --bar --tag --retries 3 neno wget -m -l1 -Q1 '{=$$_=Q($$_)=}'
EXTRA_DIST = CITATION CREDITS cc-by-sa.txt fdl.txt EXTRA_DIST = CITATION CREDITS cc-by-sa.txt fdl.txt

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.15 from Makefile.am. # Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2014 Free Software Foundation, Inc. # Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation # This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -500,7 +500,7 @@ distdir: $(DISTFILES)
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r "$(distdir)" || chmod -R a+r "$(distdir)"
dist-gzip: distdir dist-gzip: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
$(am__post_remove_distdir) $(am__post_remove_distdir)
dist-bzip2: distdir dist-bzip2: distdir
@ -526,7 +526,7 @@ dist-shar: distdir
@echo WARNING: "Support for shar distribution archives is" \ @echo WARNING: "Support for shar distribution archives is" \
"deprecated." >&2 "deprecated." >&2
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
$(am__post_remove_distdir) $(am__post_remove_distdir)
dist-zip: distdir dist-zip: distdir
@ -544,7 +544,7 @@ dist dist-all:
distcheck: dist distcheck: dist
case '$(DIST_ARCHIVES)' in \ case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \ *.tar.gz*) \
GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \ *.tar.bz2*) \
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lz*) \ *.tar.lz*) \
@ -554,7 +554,7 @@ distcheck: dist
*.tar.Z*) \ *.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \ *.shar.gz*) \
GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
*.zip*) \ *.zip*) \
unzip $(distdir).zip ;;\ unzip $(distdir).zip ;;\
esac esac
@ -868,7 +868,8 @@ monitorman:
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f . | parallel -uj1 'echo {=/\.pod$$/ or skip()=};make -j && sudo make install; pdfman {/.} &' inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f . | parallel -uj1 'echo {=/\.pod$$/ or skip()=};make -j && sudo make install; pdfman {/.} &'
testurls: testurls:
grep -h -Po 'https?://[^ $$<>")}]+' src/* | perl -pe 's/(&gt|\{).*//;s/\\//g;s/&amp;/&/g;s/&#.*//;'"s/'.*//" | sort -u | parallel -j0 --tag 'wget -qm -l1 -Q1 {}; echo $$?' mkdir -p urls
cd urls && grep -v '(dead)' ../src/* | grep -h -Po 'https?://[^ $$<>")}]+' | perl -pe 's/(&gt|\{).*//;s/\\-/-/g;s/\\n//g;s/&amp;/&/g;s/&#.*//;'"s/'.*//" | sort -u | egrep -v 'example.com|##|\*\(' | parallel -j0 --timeout 33 --bar --tag --retries 3 neno wget -m -l1 -Q1 '{=$$_=Q($$_)=}'
# Tell versions [3.59,3.63) of GNU make to not export all variables. # Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded. # Otherwise a system limit (for SysV at least) may be exceeded.

63
NEWS
View file

@ -1,3 +1,61 @@
<<<<<<< HEAD
=======
20181122
* Experimental simpler job flow control.
* 時間がかかるコマンドを GNU parallel で 並列実行する
https://qiita.com//grohiro/items/4db3fa951a4778c5c479
* Bug fixes and man page updates.
20181022
* env_parallel.fish: --session support (alpha quality)
* GNU Parallel was cited in: High-throughput sequencing of murine
immunoglobulin heavy chain repertoires using single side unique
molecular identifiers on an Ion Torrent PGM
https://doi.org/10.18632/oncotarget.25493
* GNU parallel in Japanese Wikipedia
https://ja.wikipedia.org/wiki/GNU_parallel
* Outils de paramétrisation des tâches: lots de tâches, GNU Parallel
https://www.eventbrite.ca/e/inscription-outils-de-parametrisation-des-taches-lots-de-taches-gnu-parallel-et-bqtools-midi-conference-de-50271076142
* Bug fixes and man page updates.
20180922
* Minix is supported again.
* Updated graph showing GNU Parallel's overhead per job for each
version. https://www.gnu.org/software/parallel/process-time-j2-1700MHz-3000-1000.pdf
* Intro to Computing at CARC includes introduction to GNU Parallel
http://carc.unm.edu/education--training/workshops-and-seminars.html
* Fast-GBS uses GNU Parallel https://bitbucket.org/jerlar73/fast-gbs/wiki/Home
* Belgium at 10 m resolution in July 2018 http://www.cesbio.ups-tlse.fr/multitemp/?p=14116
* Bug fixes and man page updates.
20180822
* parset sets exit code.
* How to install GNU Parallel
https://www.techrepublic.com/videos/how-to-install-gnu-parallel/
* Bug fixes and man page updates.
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
20180722 20180722
* The quoting engine has been changed. Instead of using \-quoting GNU * The quoting engine has been changed. Instead of using \-quoting GNU
@ -24,6 +82,11 @@
* Parallel download genomic data with GNU-Parallel * Parallel download genomic data with GNU-Parallel
https://digibio.blogspot.com/search/label/GNU-Parallel https://digibio.blogspot.com/search/label/GNU-Parallel
<<<<<<< HEAD
=======
* Bug fixes and man page updates.
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
20180622 20180622

12
README
View file

@ -44,9 +44,9 @@ document.
Full installation of GNU Parallel is as simple as: Full installation of GNU Parallel is as simple as:
wget https://ftpmirror.gnu.org/parallel/parallel-20180722.tar.bz2 wget https://ftpmirror.gnu.org/parallel/parallel-20181122.tar.bz2
bzip2 -dc parallel-20180722.tar.bz2 | tar xvf - bzip2 -dc parallel-20181122.tar.bz2 | tar xvf -
cd parallel-20180722 cd parallel-20181122
./configure && make && sudo make install ./configure && make && sudo make install
@ -55,9 +55,9 @@ Full installation of GNU Parallel is as simple as:
If you are not root you can add ~/bin to your path and install in If you are not root you can add ~/bin to your path and install in
~/bin and ~/share: ~/bin and ~/share:
wget https://ftpmirror.gnu.org/parallel/parallel-20180722.tar.bz2 wget https://ftpmirror.gnu.org/parallel/parallel-20181122.tar.bz2
bzip2 -dc parallel-20180722.tar.bz2 | tar xvf - bzip2 -dc parallel-20181122.tar.bz2 | tar xvf -
cd parallel-20180722 cd parallel-20181122
./configure --prefix=$HOME && make && make install ./configure --prefix=$HOME && make && make install
Or if your system lacks 'make' you can simply copy src/parallel Or if your system lacks 'make' you can simply copy src/parallel

34
aclocal.m4 vendored
View file

@ -1,6 +1,6 @@
# generated automatically by aclocal 1.15 -*- Autoconf -*- # generated automatically by aclocal 1.15.1 -*- Autoconf -*-
# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Copyright (C) 1996-2017 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -20,7 +20,7 @@ You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely. If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])]) To do so, use the procedure documented by the package, typically 'autoreconf'.])])
# Copyright (C) 2002-2014 Free Software Foundation, Inc. # Copyright (C) 2002-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.15' [am__api_version='1.15'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro. dnl require some minimum version. Point them to the right macro.
m4_if([$1], [1.15], [], m4_if([$1], [1.15.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
]) ])
@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.15])dnl [AM_AUTOMAKE_VERSION([1.15.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION], m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
# AM_AUX_DIR_EXPAND -*- Autoconf -*- # AM_AUX_DIR_EXPAND -*- Autoconf -*-
# Copyright (C) 2001-2014 Free Software Foundation, Inc. # Copyright (C) 2001-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -110,7 +110,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
# AM_CONDITIONAL -*- Autoconf -*- # AM_CONDITIONAL -*- Autoconf -*-
# Copyright (C) 1997-2014 Free Software Foundation, Inc. # Copyright (C) 1997-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -143,7 +143,7 @@ fi])])
# Do all the work for Automake. -*- Autoconf -*- # Do all the work for Automake. -*- Autoconf -*-
# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Copyright (C) 1996-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -340,7 +340,7 @@ for _am_header in $config_headers :; do
done done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
# Copyright (C) 2001-2014 Free Software Foundation, Inc. # Copyright (C) 2001-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -361,7 +361,7 @@ if test x"${install_sh+set}" != xset; then
fi fi
AC_SUBST([install_sh])]) AC_SUBST([install_sh])])
# Copyright (C) 2003-2014 Free Software Foundation, Inc. # Copyright (C) 2003-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -382,7 +382,7 @@ AC_SUBST([am__leading_dot])])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
# Copyright (C) 1997-2014 Free Software Foundation, Inc. # Copyright (C) 1997-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -421,7 +421,7 @@ fi
# Helper functions for option handling. -*- Autoconf -*- # Helper functions for option handling. -*- Autoconf -*-
# Copyright (C) 2001-2014 Free Software Foundation, Inc. # Copyright (C) 2001-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -452,7 +452,7 @@ AC_DEFUN([_AM_IF_OPTION],
# Check to make sure that the build environment is sane. -*- Autoconf -*- # Check to make sure that the build environment is sane. -*- Autoconf -*-
# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Copyright (C) 1996-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -533,7 +533,7 @@ AC_CONFIG_COMMANDS_PRE(
rm -f conftest.file rm -f conftest.file
]) ])
# Copyright (C) 2009-2014 Free Software Foundation, Inc. # Copyright (C) 2009-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -593,7 +593,7 @@ AC_SUBST([AM_BACKSLASH])dnl
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
]) ])
# Copyright (C) 2001-2014 Free Software Foundation, Inc. # Copyright (C) 2001-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -621,7 +621,7 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_SUBST([INSTALL_STRIP_PROGRAM])])
# Copyright (C) 2006-2014 Free Software Foundation, Inc. # Copyright (C) 2006-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -640,7 +640,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*- # Check how to create a tarball. -*- Autoconf -*-
# Copyright (C) 2004-2014 Free Software Foundation, Inc. # Copyright (C) 2004-2017 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,

20
configure vendored
View file

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for parallel 20180722. # Generated by GNU Autoconf 2.69 for parallel 20181122.
# #
# Report bugs to <bug-parallel@gnu.org>. # Report bugs to <bug-parallel@gnu.org>.
# #
@ -579,8 +579,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='parallel' PACKAGE_NAME='parallel'
PACKAGE_TARNAME='parallel' PACKAGE_TARNAME='parallel'
PACKAGE_VERSION='20180722' PACKAGE_VERSION='20181122'
PACKAGE_STRING='parallel 20180722' PACKAGE_STRING='parallel 20181122'
PACKAGE_BUGREPORT='bug-parallel@gnu.org' PACKAGE_BUGREPORT='bug-parallel@gnu.org'
PACKAGE_URL='' PACKAGE_URL=''
@ -1214,7 +1214,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures parallel 20180722 to adapt to many kinds of systems. \`configure' configures parallel 20181122 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1281,7 +1281,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of parallel 20180722:";; short | recursive ) echo "Configuration of parallel 20181122:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1357,7 +1357,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
parallel configure 20180722 parallel configure 20181122
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -1374,7 +1374,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by parallel $as_me 20180722, which was It was created by parallel $as_me 20181122, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -2237,7 +2237,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='parallel' PACKAGE='parallel'
VERSION='20180722' VERSION='20181122'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -2880,7 +2880,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by parallel $as_me 20180722, which was This file was extended by parallel $as_me 20181122, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -2942,7 +2942,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
parallel config.status 20180722 parallel config.status 20181122
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View file

@ -1,4 +1,4 @@
AC_INIT([parallel], [20180722], [bug-parallel@gnu.org]) AC_INIT([parallel], [20181122], [bug-parallel@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign]) AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([ AC_CONFIG_FILES([

View file

@ -39,7 +39,8 @@ measure() {
PATH=/tmp/bin:$PATH PATH=/tmp/bin:$PATH
cd /tmp/bin cd /tmp/bin
ls parallel-* | parallel --shuf -j$CORES --joblog ~/tmp/joblog$CORES-$INNER-$OUTER.csv 'seq '$INNER' | {2} true' :::: <(seq $OUTER) - ls parallel-* |
parallel --shuf -j$CORES --joblog ~/tmp/joblog$CORES-$INNER-$OUTER.csv 'seq '$INNER' | {2} true' :::: <(seq $OUTER) -
killall forever killall forever
@ -49,7 +50,7 @@ measure() {
pdf("/tmp/boxplot.pdf"); pdf("/tmp/boxplot.pdf");
par(cex.axis=0.5); par(cex.axis=0.5);
boxplot(JobRuntime/$INNER*1000~Command,data=jl,las=2,outline=F, boxplot(JobRuntime/$INNER*1000~Command,data=jl,las=2,outline=F,
ylab="milliseconds/job",main="GNU Parallel performance of different versions\n$OUTER trials each running $INNER jobs"); ylab="milliseconds/job",main="GNU Parallel overhead for different versions\n$OUTER trials each running $INNER jobs");
_ _
cp /tmp/boxplot.pdf $HOME/tmp/boxplot-j$CORES-${MHZ}MHz-$OUTER-${INNER}v$VERSION.pdf cp /tmp/boxplot.pdf $HOME/tmp/boxplot-j$CORES-${MHZ}MHz-$OUTER-${INNER}v$VERSION.pdf
evince /tmp/boxplot.pdf evince /tmp/boxplot.pdf

View file

@ -16,6 +16,7 @@ configure.ac: AC_INIT([parallel], [20100422], [bug-parallel@gnu.org])
src/parallel: $Global::version = 20100422; src/parallel: $Global::version = 20100422;
README: parallel-20130222 README: parallel-20130222
YYYYMMDD=$(echo `yyyymmdd`-1 | bc)
YYYYMMDD=$(echo `yyyymmdd`+1 | bc) YYYYMMDD=$(echo `yyyymmdd`+1 | bc)
YYYYMMDD=`yyyymmdd` YYYYMMDD=`yyyymmdd`
echo $YYYYMMDD echo $YYYYMMDD
@ -205,87 +206,22 @@ from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm> stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20181222 ('Kilogram/brexitdeal/Stan Lee/Cesar Sayoc/Tree of Life/Iran') released <<[stable]>>
Subject: GNU Parallel 20180722 ('Crimson Hexagon') released [alpha] <<[stable]>> GNU Parallel 20181222 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
GNU Parallel 20180722 ('Crimson Hexagon') [alpha] <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
This release has signficant changes and is considered alpha quality.
<<No new functionality was introduced so this is a good candidate for a stable release.>> <<No new functionality was introduced so this is a good candidate for a stable release.>>
Quote of the month: Quote of the month:
I've been using GNU Parallel very much and effectively lately.
Such an easy way to get huge speed-ups with my simple bash/Perl/Python
programs -- parallelize them!
-- Ken Youens-Clark @kycl4rk@twitter
New in this release: New in this release:
* The quoting engine has been changed. Instead of using \-quoting GNU Parallel now uses '-quoting in bash/ash/dash/ksh. This should improve compatibility with different locales. This is a big change causing this release to be alpha quality. * https://qiita.com/hana_shin/items/53c3c78525c9c758ae7c
* The CPU calculation has changed. By default GNU Parallel uses the number of CPU threads as the number of CPUs. This can be change to the number of CPU cores or number of CPU sockets with --use-cores-instead-of-threads or --use-sockets-instead-of-threads.
* The detected number of sockets, cores, and threads can be shown with --number-of-sockets, --number-of-cores, and --number-of-threads.
* env_parallel now support mksh using env_parallel.mksh.
* GNU Parallel is distributed as part of Snippy https://github.com/tseemann/snippy
* GNU Parallel: Ejecutar comandos simultáneamente en Linux https://esgeeks.com/gnu-parallel-ejecutar-comandos-simultaneo-linux/
* Parallel download genomic data with GNU-Parallel https://digibio.blogspot.com/search/label/GNU-Parallel
<<Citation not OK: BAMClipper: removing primers from alignments to minimize false-negative mutations in amplicon next-generation sequencing https://www.nature.com/articles/s41598-017-01703-6>>
<<Wrong citation https://iris.sissa.it/retrieve/handle/20.500.11767/36149/10823/And%C3%B2_tesi.pdf>>
<<Wrong citation http://www.cell.com/cms/attachment/2095201602/2077415979/mmc1.pdf>>
<<Down http://www.nature.com/nprot/journal/v12/n5/full/nprot.2017.022.html?WT.feed_name=subjects_biotechnology>>
<<Citation not ok: https://arxiv.org/pdf/1704.08997.pdf>>
<<Citation needed: https://sdstrowes.co.uk/publications/sdstrowes-rdns-aaaa.pdf>>
<<Citation not ok: https://www.nature.com/articles/s41598-017-01703-6>>
<<Probably http://www.sciencedirect.com/science/article/pii/S0044848616312194>>
<<Possibly http://link.springer.com/chapter/10.1007%2F978-3-319-22053-6_46>>
<<Possibly http://link.springer.com/article/10.1007/s12021-015-9290-5>>
<<Possibly http://link.springer.com/protocol/10.1007/978-1-4939-3578-9_14>>
<<kontakt GNU Parallel was used (unfortunately without citation) in: Instrumentation and Trace Analysis for Ad-hoc Python Workflows in Cloud Environments http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=7214035>>
<<Har angiveligt submittet ny version - afventer opdatering>> GNU Parallel was used (unfortunately without citation) in: MUGBAS: a species free gene-based programme suite for post-GWAS analysis http://www.ncbi.nlm.nih.gov/pubmed/25765345
<<Afventer updateret publisering>> GNU Parallel was used in: Large Scale Author Name Disambiguation in Digital Libraries http://ieeexplore.ieee.org/xpl/abstractReferences.jsp?tp=&arnumber=7004487&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D7004487
<<kontaktet 2015-06-22 Afventer svar fra journal>> GNU Parallel was used (unfortunately with wrong citation) in: TADSim: Discrete Event-Based Performance Prediction for Temperature-Accelerated Dynamics http://vruehle.de/publications/2015c.pdf
http://www.researchgate.net/profile/Christoph_Junghans/publication/276178326_TADSim_Discrete_Event-Based_Performance_Prediction_for_Temperature-Accelerated_Dynamics/links/55562b6708ae980ca60c8369.pdf
<< Update forventet juni Rachel har lige svaret >> GNU Parallel was used in: SISRS: Site Identification from Short Read Sequences https://github.com/rachelss/SISRS/
<<Citation needed: A Cache- and Memory-Aware Mapping Algorithm
for Big Data Applications https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7323015>>
<<Citation needed: Introspecting for RSA Key Material to Assist Intrusion Detection http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=7331177&url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D7331177>>
<<Citation needed: 3D-GNOME: an integrated web service for structural modeling of the 3D genome http://nar.oxfordjournals.org/content/early/2016/05/16/nar.gkw437.full.pdf+html>>
<<link No citation: Next-generation TCP for ns-3 simulator http://www.sciencedirect.com/science/article/pii/S1569190X15300939>>
<<link No citation: Scalable metagenomics alignment research tool (SMART): a scalable, rapid, and complete search heuristic for the classification of metagenomic sequences from complex sequence populations http://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-016-1159-6#Bib1>>
<<No citation: Argumentation Models for Cyber Attribution http://arxiv.org/pdf/1607.02171.pdf>>
<<Possible: http://link.springer.com/article/10.1007/s12021-015-9290-5 http://link.springer.com/protocol/10.1007/978-1-4939-3578-9_14>>
* Bug fixes and man page updates. * Bug fixes and man page updates.
Get the book: GNU Parallel 2018 http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html
GNU Parallel - For people who live life in the parallel lane. GNU Parallel - For people who live life in the parallel lane.
@ -307,7 +243,7 @@ Walk through the tutorial (man parallel_tutorial). Your commandline will love yo
When using programs that use GNU Parallel to process data for publication please cite: When using programs that use GNU Parallel to process data for publication please cite:
O. Tange (2018): GNU Parallel 2018, April 2018, https://doi.org/10.5281/zenodo.1146014. O. Tange (2018): GNU Parallel 2018, March 2018, https://doi.org/10.5281/zenodo.1146014.
If you like GNU Parallel: If you like GNU Parallel:

View file

@ -1,6 +1,6 @@
<directory name="parallel" rev="222" srcmd5="5d82d3c6f8314f4e507448d39c7517ea" vrev="1"> <directory name="parallel" rev="227" srcmd5="21d1e9e6d757ee09c239531d094bac7b" vrev="1">
<entry md5="b3ece6dabdc099c2520a3a400d340988" mtime="1529532492" name="parallel-20180622.tar.bz2" size="1758047" /> <entry md5="7f377215f4bfec95ae667a756cdda905" mtime="1542929947" name="parallel-20181122.tar.bz2" size="1797510" />
<entry md5="8aef7a2f3175b86cc8b081c02a46db50" mtime="1529532493" name="parallel.spec" size="4666" /> <entry md5="21c2c593abc38419b337648cd12518ae" mtime="1542929947" name="parallel.spec" size="4667" />
<entry md5="6270b8a39a08eea1967eca0b39b5f547" mtime="1529532493" name="parallel_20180622.dsc" size="556" /> <entry md5="30d6a27fae9852f24b415b6e00feb43f" mtime="1542929947" name="parallel_20181122.dsc" size="556" />
<entry md5="fb3de72aa9dca6c51df8a80dcd9c1abb" mtime="1529532495" name="parallel_20180622.tar.gz" size="1966457" /> <entry md5="4e0cdca7d064c5174b0858b8e2acb1f5" mtime="1542929947" name="parallel_20181122.tar.gz" size="1991811" />
</directory> </directory>

View file

@ -1,6 +1,7 @@
Summary: Shell tool for executing jobs in parallel Summary: Shell tool for executing jobs in parallel
Name: parallel Name: parallel
Version: 20180622 Version: 20181122
Release: 1.2 Release: 1.2
License: GPL License: GPL
Group: Productivity/File utilities Group: Productivity/File utilities

View file

@ -1,6 +1,7 @@
Summary: Shell tool for executing jobs in parallel Summary: Shell tool for executing jobs in parallel
Name: parallel Name: parallel
Version: 20180622 Version: 20181122
Release: 1.2 Release: 1.2
License: GPL License: GPL
Group: Productivity/File utilities Group: Productivity/File utilities

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.15 from Makefile.am. # Makefile.in generated by automake 1.15.1 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2014 Free Software Foundation, Inc. # Copyright (C) 1994-2017 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation # This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,

View file

@ -300,12 +300,12 @@ env_parallel() {
} }
parset() { parset() {
_parset_parallel_prg=parallel _parset_PARALLEL_PRG=parallel
_parset_main "$@" _parset_main "$@"
} }
env_parset() { env_parset() {
_parset_parallel_prg=env_parallel _parset_PARALLEL_PRG=env_parallel
_parset_main "$@" _parset_main "$@"
} }
@ -328,15 +328,22 @@ _parset_main() {
# parset "var_a4 var_b4 var_c4" echo ::: {1..3} # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
# echo $var_c4 # echo $var_c4
_parset_name="$1" _make_TEMP() {
if [ "$_parset_name" = "" ] ; then # mktemp does not exist on some OS
perl -e 'use File::Temp qw(tempfile);
$ENV{"TMPDIR"} ||= "/tmp";
print((tempfile(DIR=>$ENV{"TMPDIR"}, TEMPLATE => "parXXXXX"))[1])'
}
_parset_NAME="$1"
if [ "$_parset_NAME" = "" ] ; then
echo parset: Error: No destination variable given. >&2 echo parset: Error: No destination variable given. >&2
echo parset: Error: Try: >&2 echo parset: Error: Try: >&2
echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
return 255 return 255
fi fi
shift shift
echo "$_parset_name" | echo "$_parset_NAME" |
perl -ne 'chomp;for (split /[, ]/) { perl -ne 'chomp;for (split /[, ]/) {
# Allow: var_32 var[3] # Allow: var_32 var[3]
if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
@ -347,25 +354,30 @@ _parset_main() {
} }
exit $exitval; exit $exitval;
' || return 255 ' || return 255
if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then _exit_FILE=`_make_TEMP`
# $_parset_name contains , or space if perl -e 'exit not grep /,| /, @ARGV' "$_parset_NAME" ; then
# $_parset_NAME contains , or space
# Split on , or space to get the names # Split on , or space to get the names
eval "` eval "`
# Compute results into files # Compute results into files
$_parset_parallel_prg --files -k "$@" | ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
# var1= cat tmpfile1; rm tmpfile1 # var1= cat tmpfile1; rm tmpfile1
# var2= cat tmpfile2; rm tmpfile2 # var2= cat tmpfile2; rm tmpfile2
parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \` parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \`
echo "$_parset_name" | echo "$_parset_NAME" |
perl -pe 's/,/ /g' perl -pe 's/,/ /g'
\` \`
`" `"
else else
# $_parset_name does not contain , or space # $_parset_NAME does not contain , or space
# => $_parset_name is the name of the array to put data into # => $_parset_NAME is the name of the array to put data into
# Supported in: bash zsh ksh # Supported in: bash zsh ksh mksh
# Arrays do not work in: ash dash # Arrays do not work in: sh ash dash
eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" | eval "$_parset_NAME=( $(
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" # Compute results into files. Save exit value
($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "'
) )"
fi fi
return `cat "$_exit_FILE"; rm "$_exit_FILE"`
} }

View file

@ -7,7 +7,7 @@
# after which 'env_parallel' works # after which 'env_parallel' works
# #
# #
# Copyright (C) 2016,2017,2018 # Copyright (C) 2016-2018
# Ole Tange and Free Software Foundation, Inc. # Ole Tange and Free Software Foundation, Inc.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -300,12 +300,12 @@ env_parallel() {
} }
parset() { parset() {
_parset_parallel_prg=parallel _parset_PARALLEL_PRG=parallel
_parset_main "$@" _parset_main "$@"
} }
env_parset() { env_parset() {
_parset_parallel_prg=env_parallel _parset_PARALLEL_PRG=env_parallel
_parset_main "$@" _parset_main "$@"
} }
@ -328,15 +328,22 @@ _parset_main() {
# parset "var_a4 var_b4 var_c4" echo ::: {1..3} # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
# echo $var_c4 # echo $var_c4
_parset_name="$1" _make_TEMP() {
if [ "$_parset_name" = "" ] ; then # mktemp does not exist on some OS
perl -e 'use File::Temp qw(tempfile);
$ENV{"TMPDIR"} ||= "/tmp";
print((tempfile(DIR=>$ENV{"TMPDIR"}, TEMPLATE => "parXXXXX"))[1])'
}
_parset_NAME="$1"
if [ "$_parset_NAME" = "" ] ; then
echo parset: Error: No destination variable given. >&2 echo parset: Error: No destination variable given. >&2
echo parset: Error: Try: >&2 echo parset: Error: Try: >&2
echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
return 255 return 255
fi fi
shift shift
echo "$_parset_name" | echo "$_parset_NAME" |
perl -ne 'chomp;for (split /[, ]/) { perl -ne 'chomp;for (split /[, ]/) {
# Allow: var_32 var[3] # Allow: var_32 var[3]
if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
@ -347,25 +354,30 @@ _parset_main() {
} }
exit $exitval; exit $exitval;
' || return 255 ' || return 255
if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then _exit_FILE=`_make_TEMP`
# $_parset_name contains , or space if perl -e 'exit not grep /,| /, @ARGV' "$_parset_NAME" ; then
# $_parset_NAME contains , or space
# Split on , or space to get the names # Split on , or space to get the names
eval "$( eval "$(
# Compute results into files # Compute results into files
$_parset_parallel_prg --files -k "$@" | ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
# var1=`cat tmpfile1; rm tmpfile1` # var1=`cat tmpfile1; rm tmpfile1`
# var2=`cat tmpfile2; rm tmpfile2` # var2=`cat tmpfile2; rm tmpfile2`
parallel -q echo {2}='`cat {1}; rm {1}`' :::: - :::+ $( parallel --plain -q echo {2}='`cat {1}; rm {1}`' :::: - :::+ $(
echo "$_parset_name" | echo "$_parset_NAME" | perl -pe 's/,/ /g'
perl -pe 's/,/ /g'
) )
)" );
"
else else
# $_parset_name does not contain , or space # $_parset_NAME does not contain , or space
# => $_parset_name is the name of the array to put data into # => $_parset_NAME is the name of the array to put data into
# Supported in: bash zsh ksh # Supported in: bash zsh ksh mksh
# Arrays do not work in: ash dash # Arrays do not work in: sh ash dash
eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" | eval "$_parset_NAME=( $(
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" # Compute results into files. Save exit value
($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "'
) )"
fi fi
return `cat "$_exit_FILE"; rm "$_exit_FILE"`
} }

View file

@ -7,7 +7,7 @@
# after which 'env_parallel' works # after which 'env_parallel' works
# #
# #
# Copyright (C) 2016,2017,2018 # Copyright (C) 2016-2018
# Ole Tange and Free Software Foundation, Inc. # Ole Tange and Free Software Foundation, Inc.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -83,6 +83,7 @@ else
# Make a tmpfile for the variable definitions + alias # Make a tmpfile for the variable definitions + alias
set _tMpaLLfILe=`_tempfile` set _tMpaLLfILe=`_tempfile`
foreach _vARnAmE ($_vARnAmES); foreach _vARnAmE ($_vARnAmES);
# These 3 lines break in csh version 20110502-3
# if not defined: next # if not defined: next
eval if'(! $?'$_vARnAmE') continue' eval if'(! $?'$_vARnAmE') continue'
# if $#myvar <= 1 echo scalar_myvar=$var # if $#myvar <= 1 echo scalar_myvar=$var

View file

@ -300,12 +300,12 @@ env_parallel() {
} }
parset() { parset() {
_parset_parallel_prg=parallel _parset_PARALLEL_PRG=parallel
_parset_main "$@" _parset_main "$@"
} }
env_parset() { env_parset() {
_parset_parallel_prg=env_parallel _parset_PARALLEL_PRG=env_parallel
_parset_main "$@" _parset_main "$@"
} }
@ -328,15 +328,22 @@ _parset_main() {
# parset "var_a4 var_b4 var_c4" echo ::: {1..3} # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
# echo $var_c4 # echo $var_c4
_parset_name="$1" _make_TEMP() {
if [ "$_parset_name" = "" ] ; then # mktemp does not exist on some OS
perl -e 'use File::Temp qw(tempfile);
$ENV{"TMPDIR"} ||= "/tmp";
print((tempfile(DIR=>$ENV{"TMPDIR"}, TEMPLATE => "parXXXXX"))[1])'
}
_parset_NAME="$1"
if [ "$_parset_NAME" = "" ] ; then
echo parset: Error: No destination variable given. >&2 echo parset: Error: No destination variable given. >&2
echo parset: Error: Try: >&2 echo parset: Error: Try: >&2
echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
return 255 return 255
fi fi
shift shift
echo "$_parset_name" | echo "$_parset_NAME" |
perl -ne 'chomp;for (split /[, ]/) { perl -ne 'chomp;for (split /[, ]/) {
# Allow: var_32 var[3] # Allow: var_32 var[3]
if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
@ -347,25 +354,30 @@ _parset_main() {
} }
exit $exitval; exit $exitval;
' || return 255 ' || return 255
if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then _exit_FILE=`_make_TEMP`
# $_parset_name contains , or space if perl -e 'exit not grep /,| /, @ARGV' "$_parset_NAME" ; then
# $_parset_NAME contains , or space
# Split on , or space to get the names # Split on , or space to get the names
eval "` eval "`
# Compute results into files # Compute results into files
$_parset_parallel_prg --files -k "$@" | ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
# var1= cat tmpfile1; rm tmpfile1 # var1= cat tmpfile1; rm tmpfile1
# var2= cat tmpfile2; rm tmpfile2 # var2= cat tmpfile2; rm tmpfile2
parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \` parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \`
echo "$_parset_name" | echo "$_parset_NAME" |
perl -pe 's/,/ /g' perl -pe 's/,/ /g'
\` \`
`" `"
else else
# $_parset_name does not contain , or space # $_parset_NAME does not contain , or space
# => $_parset_name is the name of the array to put data into # => $_parset_NAME is the name of the array to put data into
# Supported in: bash zsh ksh # Supported in: bash zsh ksh mksh
# Arrays do not work in: ash dash # Arrays do not work in: sh ash dash
eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" | eval "$_parset_NAME=( $(
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" # Compute results into files. Save exit value
($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "'
) )"
fi fi
return `cat "$_exit_FILE"; rm "$_exit_FILE"`
} }

View file

@ -42,6 +42,17 @@
function env_parallel function env_parallel
# env_parallel.fish # env_parallel.fish
# --session
perl -e 'exit grep { /^--session/ } @ARGV' -- $argv; or begin;
setenv PARALLEL_IGNORED_NAMES (
begin;
functions -n
set -n;
end | perl -pe 's/\n/,/g';
)
return 0
end;
setenv PARALLEL_ENV ( setenv PARALLEL_ENV (
begin; begin;
set _grep_REGEXP ( set _grep_REGEXP (
@ -71,10 +82,14 @@ function env_parallel
"Run \"parallel --record-env\" in a clean environment first.\n"; "Run \"parallel --record-env\" in a clean environment first.\n";
} else { } else {
chomp(@ignored_vars = <IN>); chomp(@ignored_vars = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
} }
} }
if($ENV{PARALLEL_IGNORED_NAMES}) {
push @ignored_vars, split/,/, $ENV{PARALLEL_IGNORED_NAMES};
chomp @ignored_vars;
}
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
' -- $argv; ' -- $argv;
end; end;
) )

View file

@ -48,7 +48,6 @@ env_parallel() {
typeset +p -f | perl -pe 's/\(\).*//' typeset +p -f | perl -pe 's/\(\).*//'
} }
_bodies_of_FUNCTIONS() { _bodies_of_FUNCTIONS() {
# typeset -f "$@"
functions "$@" functions "$@"
} }
_names_of_VARIABLES() { _names_of_VARIABLES() {
@ -284,12 +283,12 @@ env_parallel() {
} }
parset() { parset() {
_parset_parallel_prg=parallel _parset_PARALLEL_PRG=parallel
_parset_main "$@" _parset_main "$@"
} }
env_parset() { env_parset() {
_parset_parallel_prg=env_parallel _parset_PARALLEL_PRG=env_parallel
_parset_main "$@" _parset_main "$@"
} }
@ -312,15 +311,22 @@ _parset_main() {
# parset "var_a4 var_b4 var_c4" echo ::: {1..3} # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
# echo $var_c4 # echo $var_c4
_parset_name="$1" _make_TEMP() {
if [ "$_parset_name" = "" ] ; then # mktemp does not exist on some OS
perl -e 'use File::Temp qw(tempfile);
$ENV{"TMPDIR"} ||= "/tmp";
print((tempfile(DIR=>$ENV{"TMPDIR"}, TEMPLATE => "parXXXXX"))[1])'
}
_parset_NAME="$1"
if [ "$_parset_NAME" = "" ] ; then
echo parset: Error: No destination variable given. >&2 echo parset: Error: No destination variable given. >&2
echo parset: Error: Try: >&2 echo parset: Error: Try: >&2
echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
return 255 return 255
fi fi
shift shift
echo "$_parset_name" | echo "$_parset_NAME" |
perl -ne 'chomp;for (split /[, ]/) { perl -ne 'chomp;for (split /[, ]/) {
# Allow: var_32 var[3] # Allow: var_32 var[3]
if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
@ -331,25 +337,30 @@ _parset_main() {
} }
exit $exitval; exit $exitval;
' || return 255 ' || return 255
if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then _exit_FILE=`_make_TEMP`
# $_parset_name contains , or space if perl -e 'exit not grep /,| /, @ARGV' "$_parset_NAME" ; then
# $_parset_NAME contains , or space
# Split on , or space to get the names # Split on , or space to get the names
eval "` eval "$(
# Compute results into files # Compute results into files
$_parset_parallel_prg --files -k "$@" | ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
# var1= cat tmpfile1; rm tmpfile1 # var1=`cat tmpfile1; rm tmpfile1`
# var2= cat tmpfile2; rm tmpfile2 # var2=`cat tmpfile2; rm tmpfile2`
parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \` parallel -q echo {2}='`cat {1}; rm {1}`' :::: - :::+ $(
echo "$_parset_name" | echo "$_parset_NAME" | perl -pe 's/,/ /g'
perl -pe 's/,/ /g' )
\` );
`" "
else else
# $_parset_name does not contain , or space # $_parset_NAME does not contain , or space
# => $_parset_name is the name of the array to put data into # => $_parset_NAME is the name of the array to put data into
# Supported in: bash zsh ksh # Supported in: bash zsh ksh mksh
# Arrays do not work in: ash dash # Arrays do not work in: sh ash dash
eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" | eval "$_parset_NAME=( $(
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" # Compute results into files. Save exit value
($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "'
) )"
fi fi
return `cat "$_exit_FILE"; rm "$_exit_FILE"`
} }

View file

@ -286,12 +286,12 @@ env_parallel() {
} }
parset() { parset() {
_parset_parallel_prg=parallel _parset_PARALLEL_PRG=parallel
_parset_main "$@" _parset_main "$@"
} }
env_parset() { env_parset() {
_parset_parallel_prg=env_parallel _parset_PARALLEL_PRG=env_parallel
_parset_main "$@" _parset_main "$@"
} }
@ -314,15 +314,22 @@ _parset_main() {
# parset "var_a4 var_b4 var_c4" echo ::: {1..3} # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
# echo $var_c4 # echo $var_c4
_parset_name="$1" _make_TEMP() {
if [ "$_parset_name" = "" ] ; then # mktemp does not exist on some OS
perl -e 'use File::Temp qw(tempfile);
$ENV{"TMPDIR"} ||= "/tmp";
print((tempfile(DIR=>$ENV{"TMPDIR"}, TEMPLATE => "parXXXXX"))[1])'
}
_parset_NAME="$1"
if [ "$_parset_NAME" = "" ] ; then
echo parset: Error: No destination variable given. >&2 echo parset: Error: No destination variable given. >&2
echo parset: Error: Try: >&2 echo parset: Error: Try: >&2
echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
return 255 return 255
fi fi
shift shift
echo "$_parset_name" | echo "$_parset_NAME" |
perl -ne 'chomp;for (split /[, ]/) { perl -ne 'chomp;for (split /[, ]/) {
# Allow: var_32 var[3] # Allow: var_32 var[3]
if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
@ -333,25 +340,30 @@ _parset_main() {
} }
exit $exitval; exit $exitval;
' || return 255 ' || return 255
if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then _exit_FILE=`_make_TEMP`
# $_parset_name contains , or space if perl -e 'exit not grep /,| /, @ARGV' "$_parset_NAME" ; then
# $_parset_NAME contains , or space
# Split on , or space to get the names # Split on , or space to get the names
eval "` eval "$(
# Compute results into files # Compute results into files
$_parset_parallel_prg --files -k "$@" | ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
# var1= cat tmpfile1; rm tmpfile1 # var1=`cat tmpfile1; rm tmpfile1`
# var2= cat tmpfile2; rm tmpfile2 # var2=`cat tmpfile2; rm tmpfile2`
parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \` parallel -q echo {2}='`cat {1}; rm {1}`' :::: - :::+ $(
echo "$_parset_name" | echo "$_parset_NAME" | perl -pe 's/,/ /g'
perl -pe 's/,/ /g' )
\` );
`" "
else else
# $_parset_name does not contain , or space # $_parset_NAME does not contain , or space
# => $_parset_name is the name of the array to put data into # => $_parset_NAME is the name of the array to put data into
# Supported in: bash zsh ksh mksh # Supported in: bash zsh ksh mksh
# Arrays do not work in: sh ash dash # Arrays do not work in: sh ash dash
eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" | eval "$_parset_NAME=( $(
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" # Compute results into files. Save exit value
($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "'
) )"
fi fi
return `cat "$_exit_FILE"; rm "$_exit_FILE"`
} }

View file

@ -20,9 +20,6 @@ environment to GNU B<parallel>.
If the shell function is not loaded, a dummy script will be run If the shell function is not loaded, a dummy script will be run
instead that explains how to install the function. instead that explains how to install the function.
B<env_parallel> is beta quality and not production ready, but please
use it for everyday use and report bugs.
B<env_parallel> is 100 ms slower at startup than pure GNU B<env_parallel> is 100 ms slower at startup than pure GNU
B<parallel>, and takes up to 30% longer to start a job (typically 15 ms). B<parallel>, and takes up to 30% longer to start a job (typically 15 ms).
@ -448,7 +445,7 @@ array with the given name. Multiple B<--env>s can be given.
=back =back
=head2 mksh (alpha testing) =head2 mksh
=head3 Installation =head3 Installation
@ -744,10 +741,10 @@ If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
Copyright (C) 2008,2009,2010 Ole Tange, http://ole.tange.dk Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange, Copyright (C) 2010-2018 Ole Tange, http://ole.tange.dk and Free
http://ole.tange.dk and Free Software Foundation, Inc. Software Foundation, Inc.
=head1 LICENSE =head1 LICENSE

View file

@ -7,7 +7,7 @@
# after which 'env_parallel' works # after which 'env_parallel' works
# #
# #
# Copyright (C) 2016,2017,2018 # Copyright (C) 2016-2018
# Ole Tange and Free Software Foundation, Inc. # Ole Tange and Free Software Foundation, Inc.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -181,12 +181,12 @@ env_parallel() {
# type returns: # type returns:
# ll is an alias for ls -l (in ash) # ll is an alias for ls -l (in ash)
# bash is a tracked alias for /bin/bash # bash is a tracked alias for /bin/bash
# true is a shell builtin # true is a shell builtin (in bash)
# myfunc is a function (in bash) # myfunc is a function (in bash)
# myfunc is a shell function (in zsh) # myfunc is a shell function (in zsh)
# which is /usr/bin/which # which is /usr/bin/which (in sh, bash)
# which is hashed (/usr/bin/which) # which is hashed (/usr/bin/which)
# aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' # gi is aliased to `grep -i' (in bash)
# Return 0 if found, 1 otherwise # Return 0 if found, 1 otherwise
LANG=C type "$@" | LANG=C type "$@" |
perl -pe '$exit += (s/ is an alias for .*// || perl -pe '$exit += (s/ is an alias for .*// ||
@ -300,12 +300,12 @@ env_parallel() {
} }
parset() { parset() {
_parset_parallel_prg=parallel _parset_PARALLEL_PRG=parallel
_parset_main "$@" _parset_main "$@"
} }
env_parset() { env_parset() {
_parset_parallel_prg=env_parallel _parset_PARALLEL_PRG=env_parallel
_parset_main "$@" _parset_main "$@"
} }
@ -328,15 +328,22 @@ _parset_main() {
# parset "var_a4 var_b4 var_c4" echo ::: {1..3} # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
# echo $var_c4 # echo $var_c4
_parset_name="$1" _make_TEMP() {
if [ "$_parset_name" = "" ] ; then # mktemp does not exist on some OS
perl -e 'use File::Temp qw(tempfile);
$ENV{"TMPDIR"} ||= "/tmp";
print((tempfile(DIR=>$ENV{"TMPDIR"}, TEMPLATE => "parXXXXX"))[1])'
}
_parset_NAME="$1"
if [ "$_parset_NAME" = "" ] ; then
echo parset: Error: No destination variable given. >&2 echo parset: Error: No destination variable given. >&2
echo parset: Error: Try: >&2 echo parset: Error: Try: >&2
echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
return 255 return 255
fi fi
shift shift
echo "$_parset_name" | echo "$_parset_NAME" |
perl -ne 'chomp;for (split /[, ]/) { perl -ne 'chomp;for (split /[, ]/) {
# Allow: var_32 var[3] # Allow: var_32 var[3]
if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
@ -347,25 +354,30 @@ _parset_main() {
} }
exit $exitval; exit $exitval;
' || return 255 ' || return 255
if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then _exit_FILE=`_make_TEMP`
# $_parset_name contains , or space if perl -e 'exit not grep /,| /, @ARGV' "$_parset_NAME" ; then
# $_parset_NAME contains , or space
# Split on , or space to get the names # Split on , or space to get the names
eval "` eval "`
# Compute results into files # Compute results into files
$_parset_parallel_prg --files -k "$@" | ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
# var1= cat tmpfile1; rm tmpfile1 # var1= cat tmpfile1; rm tmpfile1
# var2= cat tmpfile2; rm tmpfile2 # var2= cat tmpfile2; rm tmpfile2
parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \` parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \`
echo "$_parset_name" | echo "$_parset_NAME" |
perl -pe 's/,/ /g' perl -pe 's/,/ /g'
\` \`
`" `"
else else
# $_parset_name does not contain , or space # $_parset_NAME does not contain , or space
# => $_parset_name is the name of the array to put data into # => $_parset_NAME is the name of the array to put data into
# Supported in: bash zsh ksh # Supported in: bash zsh ksh mksh
# Arrays do not work in: ash dash # Arrays do not work in: sh ash dash
eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" | eval "$_parset_NAME=( $(
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" # Compute results into files. Save exit value
($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "'
) )"
fi fi
return `cat "$_exit_FILE"; rm "$_exit_FILE"`
} }

View file

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

View file

@ -51,7 +51,7 @@ env_parallel() {
} }
_ignore_HARDCODED() { _ignore_HARDCODED() {
# These names cannot be detected # These names cannot be detected
echo '([-\?\#\!\$\*\@\_0]|zsh_eval_context|ZSH_EVAL_CONTEXT|LINENO|IFS|commands|functions|options|aliases|EUID|EGID|UID|GID|dis_patchars|patchars|terminfo|galiases|keymaps|parameters|jobdirs|dirstack|functrace|funcsourcetrace|zsh_scheduled_events|dis_aliases|dis_reswords|dis_saliases|modules|reswords|saliases|widgets|userdirs|historywords|nameddirs|termcap|dis_builtins|dis_functions|jobtexts|funcfiletrace|dis_galiases|builtins|history|jobstates|funcstack)' echo '([-\?\#\!\$\*\@\_0]|zsh_eval_context|ZSH_EVAL_CONTEXT|LINENO|IFS|commands|functions|options|aliases|EUID|EGID|UID|GID|dis_patchars|patchars|terminfo|galiases|keymaps|parameters|jobdirs|dirstack|functrace|funcsourcetrace|zsh_scheduled_events|dis_aliases|dis_reswords|dis_saliases|modules|reswords|saliases|widgets|userdirs|historywords|nameddirs|termcap|dis_builtins|dis_functions|jobtexts|funcfiletrace|dis_galiases|builtins|history|jobstates|funcstack|run-help)'
} }
_ignore_READONLY() { _ignore_READONLY() {
typeset -pr | perl -e '@r = map { typeset -pr | perl -e '@r = map {
@ -277,12 +277,12 @@ env_parallel() {
} }
parset() { parset() {
_parset_parallel_prg=parallel _parset_PARALLEL_PRG=parallel
_parset_main "$@" _parset_main "$@"
} }
env_parset() { env_parset() {
_parset_parallel_prg=env_parallel _parset_PARALLEL_PRG=env_parallel
_parset_main "$@" _parset_main "$@"
} }
@ -305,15 +305,22 @@ _parset_main() {
# parset "var_a4 var_b4 var_c4" echo ::: {1..3} # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
# echo $var_c4 # echo $var_c4
_parset_name="$1" _make_TEMP() {
if [ "$_parset_name" = "" ] ; then # mktemp does not exist on some OS
perl -e 'use File::Temp qw(tempfile);
$ENV{"TMPDIR"} ||= "/tmp";
print((tempfile(DIR=>$ENV{"TMPDIR"}, TEMPLATE => "parXXXXX"))[1])'
}
_parset_NAME="$1"
if [ "$_parset_NAME" = "" ] ; then
echo parset: Error: No destination variable given. >&2 echo parset: Error: No destination variable given. >&2
echo parset: Error: Try: >&2 echo parset: Error: Try: >&2
echo parset: Error: ' ' parset myarray echo ::: foo bar >&2 echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
return 255 return 255
fi fi
shift shift
echo "$_parset_name" | echo "$_parset_NAME" |
perl -ne 'chomp;for (split /[, ]/) { perl -ne 'chomp;for (split /[, ]/) {
# Allow: var_32 var[3] # Allow: var_32 var[3]
if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) { if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
@ -324,25 +331,30 @@ _parset_main() {
} }
exit $exitval; exit $exitval;
' || return 255 ' || return 255
if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then _exit_FILE=`_make_TEMP`
# $_parset_name contains , or space if perl -e 'exit not grep /,| /, @ARGV' "$_parset_NAME" ; then
# $_parset_NAME contains , or space
# Split on , or space to get the names # Split on , or space to get the names
eval "` eval "$(
# Compute results into files # Compute results into files
$_parset_parallel_prg --files -k "$@" | ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
# var1= cat tmpfile1; rm tmpfile1 # var1=`cat tmpfile1; rm tmpfile1`
# var2= cat tmpfile2; rm tmpfile2 # var2=`cat tmpfile2; rm tmpfile2`
parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \` parallel -q echo {2}='`cat {1}; rm {1}`' :::: - :::+ $(
echo "$_parset_name" | echo "$_parset_NAME" | perl -pe 's/,/ /g'
perl -pe 's/,/ /g' )
\` );
`" "
else else
# $_parset_name does not contain , or space # $_parset_NAME does not contain , or space
# => $_parset_name is the name of the array to put data into # => $_parset_NAME is the name of the array to put data into
# Supported in: bash zsh ksh mksh # Supported in: bash zsh ksh mksh
# Arrays do not work in: sh ash dash # Arrays do not work in: sh ash dash
eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" | eval "$_parset_NAME=( $(
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" # Compute results into files. Save exit value
($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") |
perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "'
) )"
fi fi
return `cat "$_exit_FILE"; rm "$_exit_FILE"`
} }

View file

@ -24,7 +24,11 @@
use strict; use strict;
use Getopt::Long; use Getopt::Long;
$Global::progname="niceload"; $Global::progname="niceload";
<<<<<<< HEAD
$Global::version = 20180723; $Global::version = 20180723;
=======
$Global::version = 20181124;
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
Getopt::Long::Configure("bundling","require_order"); Getopt::Long::Configure("bundling","require_order");
get_options_from_array(\@ARGV) || die_usage(); get_options_from_array(\@ARGV) || die_usage();
if($opt::version) { if($opt::version) {
@ -1147,7 +1151,7 @@ sub io_status_linux {
# throw away all execpt the last Device:-section # throw away all execpt the last Device:-section
my @iostat; my @iostat;
for(reverse @iostat_out) { for(reverse @iostat_out) {
/Device:/ and last; /Device/ and last;
push @iostat, (split(/\s+/,$_))[13]; push @iostat, (split(/\s+/,$_))[13];
} }
my $io = ::max(@iostat); my $io = ::max(@iostat);

View file

@ -36,7 +36,10 @@ run 1 second, suspend (3.00-1.00) seconds, run 1 second, suspend
=item B<--battery> =item B<--battery>
Suspend if the system is running on battery. Shorthand for: -l -1 --sensor 'cat /sys/class/power_supply/BAT0/status /proc/acpi/battery/BAT0/state 2>/dev/null |grep -i -q discharging; echo $?' Suspend if the system is running on battery. Shorthand for:
-l -1 --sensor 'cat /sys/class/power_supply/BAT0/status
/proc/acpi/battery/BAT0/state 2>/dev/null | grep -i -q discharging;
echo $?'
=item B<-f> I<FACTOR> =item B<-f> I<FACTOR>
@ -62,7 +65,7 @@ under the limits. The default is B<--soft>.
Limit for I/O. The amount of disk I/O will be computed as a value 0 - Limit for I/O. The amount of disk I/O will be computed as a value 0 -
10, where 0 is no I/O and 10 is at least one disk is 100% saturated. 10, where 0 is no I/O and 10 is at least one disk is 100% saturated.
B<--io> will set both B<--start-io> and B<run-io>. B<--io> will set both B<--start-io> and B<--run-io>.
=item B<--load> I<loadlimit> =item B<--load> I<loadlimit>
@ -71,7 +74,7 @@ B<--io> will set both B<--start-io> and B<run-io>.
Limit for load average. Limit for load average.
B<--load> will set both B<--start-load> and B<run-load>. B<--load> will set both B<--start-load> and B<--run-load>.
=item B<--mem> I<memlimit> =item B<--mem> I<memlimit>
@ -87,7 +90,7 @@ I<memlimit> can be postfixed with K, M, G, T, or P which would
multiply the size with 1024, 1048576, 1073741824, or 1099511627776 multiply the size with 1024, 1048576, 1073741824, or 1099511627776
respectively. respectively.
B<--mem> will set both B<--start-mem> and B<run-mem>. B<--mem> will set both B<--start-mem> and B<--run-mem>.
=item B<--noswap> =item B<--noswap>
@ -99,7 +102,7 @@ indication that the system is memory stressed.
B<--noswap> is over limit if the system is swapping both in and out. B<--noswap> is over limit if the system is swapping both in and out.
B<--noswap> will set both B<--start-noswap> and B<run-noswap>. B<--noswap> will set both B<--start-noswap> and B<--run-noswap>.
=item B<--net> =item B<--net>
@ -251,18 +254,19 @@ CPU. When the load rises to 1.0 the process is suspended.
=head1 EXAMPLE: Run updatedb =head1 EXAMPLE: Run updatedb
Running updatedb can often starve the system for disk I/O and thus result in a high load. Running B<updatedb> can often starve the system for disk I/O and thus result in a high load.
Run updatedb but suspend updatedb if the load is above 2.00: Run B<updatedb> but suspend B<updatedb> if the load is above 2.00:
B<niceload -L 2 updatedb> B<niceload -L 2 updatedb>
=head1 EXAMPLE: Run rsync =head1 EXAMPLE: Run rsync
rsync can just like updatedb starve the system for disk I/O and thus result in a high load. B<rsync> can, just like B<updatedb>, starve the system for disk I/O
and thus result in a high load.
Run rsync but keep load below 3.4. If load reaches 7 sleep for Run B<rsync> but keep load below 3.4. If load reaches 7 sleep for
(7-3.4)*12 seconds: (7-3.4)*12 seconds:
B<niceload -L 3.4 -f 12 rsync -Ha /home/ /backup/home/> B<niceload -L 3.4 -f 12 rsync -Ha /home/ /backup/home/>
@ -299,15 +303,14 @@ Report bugs to <bug-parallel@gnu.org>.
Copyright (C) 2004-11-19 Ole Tange, http://ole.tange.dk Copyright (C) 2004-11-19 Ole Tange, http://ole.tange.dk
Copyright (C) 2005,2006,2007,2008,2009,2010 Ole Tange, http://ole.tange.dk Copyright (C) 2005-2010 Ole Tange, http://ole.tange.dk
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange, Copyright (C) 2010-2018 Ole Tange, http://ole.tange.dk and Free
http://ole.tange.dk and Free Software Foundation, Inc. Software Foundation, Inc.
=head1 LICENSE =head1 LICENSE
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Free Copyright (C) 2010-2018 Free Software Foundation, Inc.
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

File diff suppressed because it is too large Load diff

View file

@ -4,21 +4,23 @@
=head1 NAME =head1 NAME
parallel - build and execute shell command lines from standard input in parallel parallel - build and execute shell command lines from standard input
in parallel
=head1 SYNOPSIS =head1 SYNOPSIS
B<parallel> [options] [I<command> [arguments]] < list_of_arguments B<parallel> [options] [I<command> [arguments]] < list_of_arguments
B<parallel> [options] [I<command> [arguments]] ( B<:::> arguments | B<:::+> arguments | B<parallel> [options] [I<command> [arguments]] ( B<:::> arguments |
B<::::> argfile(s) | B<::::+> argfile(s) ) ... B<:::+> arguments | B<::::> argfile(s) | B<::::+> argfile(s) ) ...
B<parallel> --semaphore [options] I<command> B<parallel> --semaphore [options] I<command>
B<#!/usr/bin/parallel> --shebang [options] [I<command> [arguments]] B<#!/usr/bin/parallel> --shebang [options] [I<command> [arguments]]
B<#!/usr/bin/parallel> --shebang-wrap [options] [I<command> [arguments]] B<#!/usr/bin/parallel> --shebang-wrap [options] [I<command>
[arguments]]
=head1 DESCRIPTION =head1 DESCRIPTION
@ -118,7 +120,7 @@ replacement string; then the string is not quoted.
Input line without extension. This replacement string will be replaced Input line without extension. This replacement string will be replaced
by the input with the extension removed. If the input line contains by the input with the extension removed. If the input line contains
B<.> after the last B</> the last B<.> till the end of the string will B<.> after the last B</>, the last B<.> until the end of the string will
be removed and B<{.}> will be replaced with the be removed and B<{.}> will be replaced with the
remaining. E.g. I<foo.jpg> becomes I<foo>, I<subdir/foo.jpg> becomes remaining. E.g. I<foo.jpg> becomes I<foo>, I<subdir/foo.jpg> becomes
I<subdir/foo>, I<sub.dir/foo.jpg> becomes I<sub.dir/foo>, I<subdir/foo>, I<sub.dir/foo.jpg> becomes I<sub.dir/foo>,
@ -659,7 +661,7 @@ equivalent: B<--delay 100000> and B<--delay 1d3.5h16.6m4s>.
Print the job to run on stdout (standard output), but do not run the Print the job to run on stdout (standard output), but do not run the
job. Use B<-v -v> to include the wrapping that GNU Parallel generates job. Use B<-v -v> to include the wrapping that GNU Parallel generates
(for remote jobs, B<--tmux>, B<--nice>, B<--pipe>, B<--pipepart>, (for remote jobs, B<--tmux>, B<--nice>, B<--pipe>, B<--pipepart>,
B<--fifo> and B<--cat>). Do not count on this literaly, though, as the B<--fifo> and B<--cat>). Do not count on this literally, though, as the
job may be scheduled on another computer or the local computer if : is job may be scheduled on another computer or the local computer if : is
in the list. in the list.
@ -773,7 +775,7 @@ may not be used. B<--gnu> is kept for compatibility.
=item B<--group> =item B<--group>
Group output. Output from each job is grouped together and is only Group output. Output from each job is grouped together and is only
printed when the command is finished. stdout (standard output) first printed when the command is finished. Stdout (standard output) first
followed by stderr (standard error). followed by stderr (standard error).
This takes in the order of 0.5ms per job and depends on the speed of This takes in the order of 0.5ms per job and depends on the speed of
@ -855,7 +857,7 @@ exit when 3% of the jobs have finished. Kill running jobs.
=back =back
For backwards compability these also work: For backwards compatibility these also work:
=over 12 =over 12
@ -1458,20 +1460,32 @@ on remote computers).
Print the number of physical CPU cores and exit. Print the number of physical CPU cores and exit.
<<<<<<< HEAD
=item B<--number-of-cores> (beta testing) =item B<--number-of-cores> (beta testing)
=======
=item B<--number-of-cores>
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
Print the number of physical CPU cores and exit (used by GNU B<parallel> itself Print the number of physical CPU cores and exit (used by GNU B<parallel> itself
to determine the number of physical CPU cores on remote computers). to determine the number of physical CPU cores on remote computers).
<<<<<<< HEAD
=item B<--number-of-sockets> (beta testing) =item B<--number-of-sockets> (beta testing)
=======
=item B<--number-of-sockets>
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
Print the number of filled CPU sockets and exit (used by GNU Print the number of filled CPU sockets and exit (used by GNU
B<parallel> itself to determine the number of filled CPU sockets on B<parallel> itself to determine the number of filled CPU sockets on
remote computers). remote computers).
<<<<<<< HEAD
=item B<--number-of-threads> (beta testing) =item B<--number-of-threads> (beta testing)
=======
=item B<--number-of-threads>
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
Print the number of hyperthreaded CPU cores and exit (used by GNU Print the number of hyperthreaded CPU cores and exit (used by GNU
B<parallel> itself to determine the number of hyperthreaded CPU cores B<parallel> itself to determine the number of hyperthreaded CPU cores
@ -2363,6 +2377,11 @@ open a tty for the job.
You can of course override B<-j1> and B<-u>. You can of course override B<-j1> and B<-u>.
Using B<--tty> unfortunately means that GNU B<parallel> cannot kill
the jobs (with B<--timeout>, B<--memfree>, or B<--halt>). This is due
to GNU B<parallel> giving each child its own process group, which is
then killed. Process groups are dependant on the tty.
=item B<--tag> =item B<--tag>
@ -2571,9 +2590,15 @@ Use the replacement string I<replace-str> instead of B<{.}> for input
line without extension. line without extension.
<<<<<<< HEAD
=item B<--use-sockets-instead-of-threads> (beta testing) =item B<--use-sockets-instead-of-threads> (beta testing)
=item B<--use-cores-instead-of-threads> (beta testing) =item B<--use-cores-instead-of-threads> (beta testing)
=======
=item B<--use-sockets-instead-of-threads>
=item B<--use-cores-instead-of-threads>
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
=item B<--use-cpus-instead-of-cores> (obsolete) =item B<--use-cpus-instead-of-cores> (obsolete)
@ -3053,12 +3078,20 @@ downloads 10 videos in parallel.
B<{=> and B<=}> mark a perl expression. B<pQ> perl-quotes the B<{=> and B<=}> mark a perl expression. B<pQ> perl-quotes the
string. B<date +%FT%T> is the date in ISO8601 with time. string. B<date +%FT%T> is the date in ISO8601 with time.
=head1 EXAMPLE: Save output in ISO8601 dirs
=head1 EXAMPLE: Digtal clock with "blinking" : Save output from B<ps aux> every second into dirs named
yyyy-mm-ddThh:mm:ss+zz:zz.
seq 1000 | parallel -N0 -j1 --delay 1 \
--results '{= $_=`date -Isec`; chomp=}/' ps aux
=head1 EXAMPLE: Digital clock with "blinking" :
The : in a digital clock blinks. To make every other line have a ':' The : in a digital clock blinks. To make every other line have a ':'
and the rest a ' ' a perl expression is used to look at the 3rd input and the rest a ' ' a perl expression is used to look at the 3rd input
source. If the value modudo 2 is 1: Use ":" otherwise use " ": source. If the value modulo 2 is 1: Use ":" otherwise use " ":
parallel -k echo {1}'{=3 $_=$_%2?":":" "=}'{2}{3} \ parallel -k echo {1}'{=3 $_=$_%2?":":" "=}'{2}{3} \
::: {0..12} ::: {0..5} ::: {0..9} ::: {0..12} ::: {0..5} ::: {0..9}
@ -4862,9 +4895,9 @@ If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
Copyright (C) 2008,2009,2010 Ole Tange, http://ole.tange.dk Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange, Copyright (C) 2010-2018 Ole Tange,
http://ole.tange.dk and Free Software Foundation, Inc. http://ole.tange.dk and Free Software Foundation, Inc.
Parts of the manual concerning B<xargs> compatibility is inspired by Parts of the manual concerning B<xargs> compatibility is inspired by
@ -4873,9 +4906,7 @@ the manual of B<xargs> from GNU findutils 4.4.2.
=head1 LICENSE =head1 LICENSE
Copyright (C) Copyright (C) 2007-2018 Free Software Foundation, Inc.
2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View file

@ -13,6 +13,16 @@ There are a lot programs with some of the functionality of GNU
B<parallel>. GNU B<parallel> strives to include the best of the B<parallel>. GNU B<parallel> strives to include the best of the
functionality without sacrificing ease of use. functionality without sacrificing ease of use.
B<parallel> has existed since 2002 and as GNU B<parallel> since
2010. A lot of the alternatives have not had the vitality to survive
that long, but have come and gone during that time.
GNU B<parallel> is actively maintained with a new release every month
since 2010. Most other alternatives are fleeting interests of the
developers with irregular releases and only maintained for a few
years.
=head2 SUMMARY TABLE =head2 SUMMARY TABLE
The following features are in some of the comparable tools: The following features are in some of the comparable tools:
@ -205,7 +215,7 @@ composed commands and redirection require using B<bash -c>.
ls | parallel "wc {} >{}.wc" ls | parallel "wc {} >{}.wc"
ls | parallel "echo {}; ls {}|wc" ls | parallel "echo {}; ls {}|wc"
becomes (assuming you have 8 cores and that none of the file names becomes (assuming you have 8 cores and that none of the filenames
contain space, " or '). contain space, " or ').
ls | xargs -d "\n" -P8 -I {} bash -c "wc {} >{}.wc" ls | xargs -d "\n" -P8 -I {} bash -c "wc {} >{}.wc"
@ -216,9 +226,9 @@ https://www.gnu.org/software/findutils/
=head2 DIFFERENCES BETWEEN find -exec AND GNU Parallel =head2 DIFFERENCES BETWEEN find -exec AND GNU Parallel
B<find -exec> offer some of the same possibilities as GNU B<parallel>. B<find -exec> offers some of the same possibilities as GNU B<parallel>.
B<find -exec> only works on files. So processing other input (such as B<find -exec> only works on files. Processing other input (such as
hosts or URLs) will require creating these inputs as files. B<find hosts or URLs) will require creating these inputs as files. B<find
-exec> has no support for running commands in parallel. -exec> has no support for running commands in parallel.
@ -228,13 +238,13 @@ https://www.gnu.org/software/findutils/
=head2 DIFFERENCES BETWEEN make -j AND GNU Parallel =head2 DIFFERENCES BETWEEN make -j AND GNU Parallel
B<make -j> can run jobs in parallel, but requires a crafted Makefile B<make -j> can run jobs in parallel, but requires a crafted Makefile
to do this. That results in extra quoting to get filename containing to do this. That results in extra quoting to get filenames containing
newline to work correctly. newlines to work correctly.
B<make -j> computes a dependency graph before running jobs. Jobs run B<make -j> computes a dependency graph before running jobs. Jobs run
by GNU B<parallel> does not depend on eachother. by GNU B<parallel> does not depend on each other.
(Very early versions of GNU B<parallel> were coincidently implemented (Very early versions of GNU B<parallel> were coincidentally implemented
using B<make -j>). using B<make -j>).
https://www.gnu.org/software/make/ https://www.gnu.org/software/make/
@ -250,10 +260,10 @@ into files.
The argument replace string ($ITEM) cannot be changed. Arguments must The argument replace string ($ITEM) cannot be changed. Arguments must
be quoted - thus arguments containing special characters (space '"&!*) be quoted - thus arguments containing special characters (space '"&!*)
may cause problems. More than one argument is not supported. File may cause problems. More than one argument is not supported. Filenames
names containing newlines are not processed correctly. When reading containing newlines are not processed correctly. When reading input
input from a file null cannot be used as a terminator. B<ppss> needs from a file null cannot be used as a terminator. B<ppss> needs to read
to read the whole input file before starting any jobs. the whole input file before starting any jobs.
Output and status information is stored in ppss_dir and thus requires Output and status information is stored in ppss_dir and thus requires
cleanup when completed. If the dir is not removed before running cleanup when completed. If the dir is not removed before running
@ -452,15 +462,16 @@ B<dxargs> does not deal well with more simultaneous jobs than SSHD's
MaxStartups. B<dxargs> is only built for remote run jobs, but does not MaxStartups. B<dxargs> is only built for remote run jobs, but does not
support transferring of files. support transferring of files.
http://www.semicomplete.com/blog/geekery/distributed-xargs.html https://web.archive.org/web/20120518070250/http://www.semicomplete.com/blog/geekery/distributed-xargs.html
=head2 DIFFERENCES BETWEEN mdm/middleman AND GNU Parallel =head2 DIFFERENCES BETWEEN mdm/middleman AND GNU Parallel
middleman(mdm) is also a tool for running jobs in parallel. middleman(mdm) is also a tool for running jobs in parallel.
Here are the shellscripts of http://mdm.berlios.de/usage.html ported Here are the shellscripts of
to GNU B<parallel>: https://web.archive.org/web/20110728064735/http://mdm.berlios.de/usage.html
ported to GNU B<parallel>:
seq 19 | parallel buffon -o - | sort -n > result seq 19 | parallel buffon -o - | sort -n > result
cat files | parallel cmd cat files | parallel cmd
@ -615,7 +626,7 @@ https://github.com/cheusov/paexec
B<map> sees it as a feature to have less features and in doing so it B<map> sees it as a feature to have less features and in doing so it
also handles corner cases incorrectly. A lot of GNU B<parallel>'s code also handles corner cases incorrectly. A lot of GNU B<parallel>'s code
is to handle corner cases correctly on every platform, so you will not is to handle corner cases correctly on every platform, so you will not
get a nasty surprise if a user for example saves a file called: I<My get a nasty surprise if a user, for example, saves a file called: I<My
brother's 12" records.txt> brother's 12" records.txt>
B<map>'s example showing how to deal with special characters fails on B<map>'s example showing how to deal with special characters fails on
@ -624,17 +635,20 @@ special characters:
echo "The Cure" > My\ brother\'s\ 12\"\ records echo "The Cure" > My\ brother\'s\ 12\"\ records
ls | \ ls | \
map 'echo -n `gzip < "%" | wc -c`; echo -n '*100/'; wc -c < "%"' | bc map 'echo -n `gzip < "%" | wc -c`; echo -n '*100/'; wc -c < "%"' |
bc
It works with GNU B<parallel>: It works with GNU B<parallel>:
ls | \ ls | \
parallel 'echo -n `gzip < {} | wc -c`; echo -n '*100/'; wc -c < {}' | bc parallel \
'echo -n `gzip < {} | wc -c`; echo -n '*100/'; wc -c < {}' | bc
And you can even get the file name prepended: And you can even get the file name prepended:
ls | \ ls | \
parallel --tag '(echo -n `gzip < {} | wc -c`'*100/'; wc -c < {}) | bc' parallel --tag \
'(echo -n `gzip < {} | wc -c`'*100/'; wc -c < {}) | bc'
B<map> has no support for grouping. So this gives the wrong results B<map> has no support for grouping. So this gives the wrong results
without any warnings: without any warnings:
@ -655,23 +669,22 @@ completely for certain jobs (and may even be considered less readable):
parallel echo -n {} ::: 1 2 3 parallel echo -n {} ::: 1 2 3
map -p 4 'echo -n % 2>&1 | sed -e "s/^/$$:/"' 1 2 3 | sort | cut -f2- -d: map -p 4 'echo -n % 2>&1 | sed -e "s/^/$$:/"' 1 2 3 | \
sort | cut -f2- -d:
B<map>s replacement strings (% %D %B %E) can be simulated in GNU B<map>s replacement strings (% %D %B %E) can be simulated in GNU
B<parallel> by putting this in B<~/.parallel/config>: B<parallel> by putting this in B<~/.parallel/config>:
--rpl '%' --rpl '%'
--rpl '%D $_=::shell_quote(::dirname($_));' --rpl '%D $_=Q(::dirname($_));'
--rpl '%B s:.*/::;s:\.[^/.]+$::;' --rpl '%B s:.*/::;s:\.[^/.]+$::;'
--rpl '%E s:.*\.::' --rpl '%E s:.*\.::'
B<map> cannot handle bundled options: B<map -vp 0 echo this fails>
B<map> does not have an argument separator on the command line, but B<map> does not have an argument separator on the command line, but
uses the first argument as command. This makes quoting harder which again uses the first argument as command. This makes quoting harder which again
may affect readability. Compare: may affect readability. Compare:
map -p 2 perl\\\ -ne\\\ \\\'/^\\\\S+\\\\s+\\\\S+\\\$/\\\ and\\\ print\\\ \\\$ARGV,\\\"\\\\n\\\"\\\' * map -p 2 'perl -ne '"'"'/^\S+\s+\S+$/ and print $ARGV,"\n"'"'" *
parallel -q perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' ::: * parallel -q perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' ::: *
@ -680,16 +693,11 @@ context replace:
parallel --xargs echo 'BEGIN{'{}'}END' ::: 1 2 3 parallel --xargs echo 'BEGIN{'{}'}END' ::: 1 2 3
B<map> does not set exit value according to whether one of the jobs map "echo 'BEGIN{'%'}END'" 1 2 3
failed:
parallel false ::: 1 || echo Job failed
map false 1 || echo Never run
B<map> requires Perl v5.10.0 making it harder to use on old systems. B<map> requires Perl v5.10.0 making it harder to use on old systems.
B<map> has no way of using % in the command (GNU Parallel has -I to B<map> has no way of using % in the command (GNU B<parallel> has -I to
specify another replacement string than B<{}>). specify another replacement string than B<{}>).
By design B<map> is option incompatible with B<xargs>, it does not By design B<map> is option incompatible with B<xargs>, it does not
@ -710,18 +718,23 @@ B<ladon> only works on files and the only way to specify files is
using a quoted glob string (such as \*.jpg). It is not possible to using a quoted glob string (such as \*.jpg). It is not possible to
list the files manually. list the files manually.
As replacement strings it uses FULLPATH DIRNAME BASENAME EXT RELDIR RELPATH As replacement strings it uses FULLPATH DIRNAME BASENAME EXT RELDIR
RELPATH
These can be simulated using GNU B<parallel> by putting this in B<~/.parallel/config>: These can be simulated using GNU B<parallel> by putting this in
B<~/.parallel/config>:
--rpl 'FULLPATH $_=::shell_quote($_);chomp($_=qx{readlink -f $_});' --rpl 'FULLPATH $_=Q($_);chomp($_=qx{readlink -f $_});'
--rpl 'DIRNAME $_=::shell_quote(::dirname($_));chomp($_=qx{readlink -f $_});' --rpl 'DIRNAME $_=Q(::dirname($_));chomp($_=qx{readlink -f $_});'
--rpl 'BASENAME s:.*/::;s:\.[^/.]+$::;' --rpl 'BASENAME s:.*/::;s:\.[^/.]+$::;'
--rpl 'EXT s:.*\.::' --rpl 'EXT s:.*\.::'
--rpl 'RELDIR $_=::shell_quote($_);chomp(($_,$c)=qx{readlink -f $_;pwd});s:\Q$c/\E::;$_=::dirname($_);' --rpl 'RELDIR $_=Q($_);chomp(($_,$c)=qx{readlink -f $_;pwd});
--rpl 'RELPATH $_=::shell_quote($_);chomp(($_,$c)=qx{readlink -f $_;pwd});s:\Q$c/\E::;' s:\Q$c/\E::;$_=::dirname($_);'
--rpl 'RELPATH $_=Q($_);chomp(($_,$c)=qx{readlink -f $_;pwd});
s:\Q$c/\E::;'
B<ladon> deals badly with filenames containing " and newline, and it fails for output larger than 200k: B<ladon> deals badly with filenames containing " and newline, and it
fails for output larger than 200k:
ladon '*' -- seq 36000 | wc ladon '*' -- seq 36000 | wc
@ -755,17 +768,23 @@ B<jobflow> can run multiple jobs in parallel.
Just like B<xargs> output from B<jobflow> jobs running in parallel mix Just like B<xargs> output from B<jobflow> jobs running in parallel mix
together by default. B<jobflow> can buffer into files (placed in together by default. B<jobflow> can buffer into files (placed in
/run/shm), but these are not cleaned up - not even if B<jobflow> dies /run/shm), but these are not cleaned up if B<jobflow> dies
unexpectently. If the total output is big (in the order of RAM+swap) unexpectedly (e.g. by Ctrl-C). If the total output is big (in the
it can cause the system to run out of memory. order of RAM+swap) it can cause the system to slow to a crawl and
eventually run out of memory.
B<jobflow> gives no error if the command is unknown, and like B<xargs> B<jobflow> gives no error if the command is unknown, and like B<xargs>
redirection requires wrapping with B<bash -c>. redirection and composed commands require wrapping with B<bash -c>.
Input lines can at most be 4096 bytes. You can at most have 16 {}'s in
the command template. More than that either crashes the program or
simple does not execute the command.
B<jobflow> has no equivalent for B<--pipe>, or B<--sshlogin>.
B<jobflow> makes it possible to set resource limits on the running B<jobflow> makes it possible to set resource limits on the running
jobs. This can be emulated by GNU B<parallel> using B<bash>'s B<ulimit>: jobs. This can be emulated by GNU B<parallel> using B<bash>'s B<ulimit>:
jobflow -limits=mem=100M,cpu=3,fsize=20M,nofiles=300 myjob jobflow -limits=mem=100M,cpu=3,fsize=20M,nofiles=300 myjob
parallel 'ulimit -v 102400 -t 3 -f 204800 -n 300 myjob' parallel 'ulimit -v 102400 -t 3 -f 204800 -n 300 myjob'
@ -832,7 +851,7 @@ setting SSHPASS and by using B<--ssh "sshpass ssh">.
To make the emulation easier, make a simple alias: To make the emulation easier, make a simple alias:
alias par_emul="parallel -j0 --ssh 'sshpass ssh' --nonall --tag --linebuffer" alias par_emul="parallel -j0 --ssh 'sshpass ssh' --nonall --tag --lb"
If you want to supply a password run: If you want to supply a password run:
@ -850,8 +869,10 @@ If the above is set up you can then do:
orgalorg -o frontend1 -o frontend2 -p -C top -bid 1 orgalorg -o frontend1 -o frontend2 -p -C top -bid 1
par_emul -S frontend1 -S frontend2 top -bid 1 par_emul -S frontend1 -S frontend2 top -bid 1
orgalorg -o frontend1 -o frontend2 -p -er /tmp -n 'md5sum /tmp/bigfile' -S bigfile orgalorg -o frontend1 -o frontend2 -p -er /tmp -n \
par_emul -S frontend1 -S frontend2 --basefile bigfile --workdir /tmp md5sum /tmp/bigfile 'md5sum /tmp/bigfile' -S bigfile
par_emul -S frontend1 -S frontend2 --basefile bigfile --workdir /tmp \
md5sum /tmp/bigfile
B<orgalorg> has a progress indicator for the transferring of a B<orgalorg> has a progress indicator for the transferring of a
file. GNU B<parallel> does not. file. GNU B<parallel> does not.
@ -865,8 +886,6 @@ Rust parallel focuses on speed. It is almost as fast as B<xargs>. It
implements a few features from GNU B<parallel>, but lacks many implements a few features from GNU B<parallel>, but lacks many
functions. All these fail: functions. All these fail:
# Show what would be executed
parallel --dry-run echo ::: a
# Read arguments from file # Read arguments from file
parallel -a file echo parallel -a file echo
# Changing the delimiter # Changing the delimiter
@ -874,8 +893,6 @@ functions. All these fail:
These do something different from GNU B<parallel> These do something different from GNU B<parallel>
# Read more arguments at a time -n
parallel -n 2 echo ::: 1 a 2 b
# -q to protect quoted $ and space # -q to protect quoted $ and space
parallel -q perl -e '$a=shift; print "$a"x10000000' ::: a b c parallel -q perl -e '$a=shift; print "$a"x10000000' ::: a b c
# Generation of combination of inputs # Generation of combination of inputs
@ -885,7 +902,7 @@ These do something different from GNU B<parallel>
# --pipe # --pipe
seq 100000 | parallel --pipe wc seq 100000 | parallel --pipe wc
# linked arguments # linked arguments
parallel echo ::: S M L :::+ small medium large ::: R G B :::+ red green blue parallel echo ::: S M L :::+ sml med lrg ::: R G B :::+ red grn blu
# Run different shell dialects # Run different shell dialects
zsh -c 'parallel echo \={} ::: zsh && true' zsh -c 'parallel echo \={} ::: zsh && true'
csh -c 'parallel echo \$\{\} ::: shell && true' csh -c 'parallel echo \$\{\} ::: shell && true'
@ -894,15 +911,26 @@ These do something different from GNU B<parallel>
(seq 10; sleep 5; echo 2) | time parallel -j2 'sleep 2; echo' (seq 10; sleep 5; echo 2) | time parallel -j2 'sleep 2; echo'
tail -f /var/log/syslog | parallel echo tail -f /var/log/syslog | parallel echo
Most of the examples from the book GNU Parallel 2018 do not work, thus
Rust parallel is not close to being a compatible replacement.
Rust parallel has no remote facilities. Rust parallel has no remote facilities.
It uses /tmp/parallel for tmp files and does not clean up if It uses /tmp/parallel for tmp files and does not clean up if
terminated abrubtly. If another user on the system uses Rust parallel, terminated abruptly. If another user on the system uses Rust parallel,
then /tmp/parallel will have the wrong permissions and Rust parallel then /tmp/parallel will have the wrong permissions and Rust parallel
will fail. A malicious user can setup the right permissions and will fail. A malicious user can setup the right permissions and
symlink the output file to one of the user's files and next time the symlink the output file to one of the user's files and next time the
user uses Rust parallel it will overwrite this file. user uses Rust parallel it will overwrite this file.
attacker$ mkdir /tmp/parallel
attacker$ chmod a+rwX /tmp/parallel
# Symlink to the file the attacker wants to zero out
attacker$ ln -s ~victim/.important-file /tmp/parallel/stderr_1
victim$ seq 1000 | parallel echo
# This file is now overwritten with stderr from 'echo'
victim$ cat ~victim/.important-file
If /tmp/parallel runs full during the run, Rust parallel does not If /tmp/parallel runs full during the run, Rust parallel does not
report this, but finishes with success - thereby risking data loss. report this, but finishes with success - thereby risking data loss.
@ -1112,7 +1140,7 @@ B<15. Interrupt jobs by `Ctrl-C`, rush will stop unfinished commands and exit.>
^C ^C
B<16. Continue/resume jobs (`-c`). When some jobs failed (by B<16. Continue/resume jobs (`-c`). When some jobs failed (by
execution failure, timeout, or cancelling by user with `Ctrl + C`), execution failure, timeout, or canceling by user with `Ctrl + C`),
please switch flag `-c/--continue` on and run again, so that `rush` please switch flag `-c/--continue` on and run again, so that `rush`
can save successful commands and ignore them in I<NEXT> run.> can save successful commands and ignore them in I<NEXT> run.>
@ -1144,7 +1172,7 @@ Multi-line jobs:
B<17. A comprehensive example: downloading 1K+ pages given by B<17. A comprehensive example: downloading 1K+ pages given by
three URL list files using `phantomjs save_page.js` (some page three URL list files using `phantomjs save_page.js` (some page
contents are dynamicly generated by Javascript, so `wget` does not contents are dynamically generated by Javascript, so `wget` does not
work). Here I set max jobs number (`-j`) as `20`, each job has a max work). Here I set max jobs number (`-j`) as `20`, each job has a max
running time (`-t`) of `60` seconds and `3` retry changes running time (`-t`) of `60` seconds and `3` retry changes
(`-r`). Continue flag `-c` is also switched on, so we can continue (`-r`). Continue flag `-c` is also switched on, so we can continue
@ -1286,7 +1314,8 @@ E.g.
With GNU B<parallel> this can be emulated by: With GNU B<parallel> this can be emulated by:
echo foosuffix | parallel --plus 'p={%suffix}; echo ${p}_new_suffix' echo foosuffix |
parallel --plus 'p={%suffix}; echo ${p}_new_suffix'
Opposite B<rush> GNU B<parallel> works fine if the input contains Opposite B<rush> GNU B<parallel> works fine if the input contains
double space, ' and ": double space, ' and ":
@ -1298,7 +1327,7 @@ double space, ' and ":
=item * Commands of multi-lines =item * Commands of multi-lines
While you I<can> use multi-lined commands in GNU B<parallel>, to While you I<can> use multi-lined commands in GNU B<parallel>, to
improve readibilty GNU B<parallel> discourages the use of multi-line improve readability GNU B<parallel> discourages the use of multi-line
commands. In most cases it can be written as a function: commands. In most cases it can be written as a function:
seq 1 3 | seq 1 3 |
@ -1376,7 +1405,7 @@ It can be emulated with GNU B<parallel> using this Bash function:
parallel $(_cmds "$@")'|| echo exit status $?' ::: */ parallel $(_cmds "$@")'|| echo exit status $?' ::: */
} }
This works execpt for the B<--exclude> option. This works except for the B<--exclude> option.
=head2 DIFFERENCES BETWEEN pyargs AND GNU Parallel =head2 DIFFERENCES BETWEEN pyargs AND GNU Parallel
@ -1432,7 +1461,7 @@ The output is prepended with the job number, and may be incomplete:
7165 7165
When pretty printing it caches output in memory. Output mixes by using When pretty printing it caches output in memory. Output mixes by using
test MIX below wether or not output is cached. test MIX below whether or not output is cached.
There seems to be no way of making a template command and have There seems to be no way of making a template command and have
B<concurrently> fill that with different args. The full commands must B<concurrently> fill that with different args. The full commands must
@ -1457,7 +1486,7 @@ B<map> itself, the output also mixes:
seq 10 | map i 'echo start-$i && sleep 0.$i && echo end-$i &' seq 10 | map i 'echo start-$i && sleep 0.$i && echo end-$i &'
The major difference is that GNU B<parallel> is build for parallelization The major difference is that GNU B<parallel> is built for parallelization
and map is not. So GNU B<parallel> has lots of ways of dealing with the and map is not. So GNU B<parallel> has lots of ways of dealing with the
issues that parallelization raises: issues that parallelization raises:
@ -1490,7 +1519,7 @@ Here are the 5 examples converted to GNU Parallel:
4$ printf "1\n1\n1\n" | map t 'sleep $t && say done' 4$ printf "1\n1\n1\n" | map t 'sleep $t && say done'
4$ printf "1\n1\n1\n" | parallel 'sleep {} && say done' 4$ printf "1\n1\n1\n" | parallel 'sleep {} && say done'
4$ paralllel 'sleep {} && say done' ::: 1 1 1 4$ parallel 'sleep {} && say done' ::: 1 1 1
5$ printf "1\n1\n1\n" | map t 'sleep $t && say done &' 5$ printf "1\n1\n1\n" | map t 'sleep $t && say done &'
5$ printf "1\n1\n1\n" | parallel -j0 'sleep {} && say done' 5$ printf "1\n1\n1\n" | parallel -j0 'sleep {} && say done'
@ -1499,11 +1528,211 @@ Here are the 5 examples converted to GNU Parallel:
https://github.com/soveran/map https://github.com/soveran/map
=head2 DIFFERENCES BETWEEN loop AND GNU Parallel
B<loop> mixes stdout and stderr:
loop 'ls /no-such-file' >/dev/null
B<loop>'s replacement string B<$ITEM> does not quote strings:
echo 'two spaces' | loop 'echo $ITEM'
B<loop> cannot run functions:
myfunc() { echo joe; }
export -f myfunc
loop 'myfunc this fails'
Some of the examples from https://github.com/Miserlou/Loop/ can be
emulated with GNU B<parallel>:
# A couple of functions will make the code easier to read
$ loopy() {
yes | parallel -uN0 -j1 "$@"
}
$ export -f loopy
$ time_out() {
parallel -uN0 -q --timeout "$@" ::: 1
}
$ match() {
perl -0777 -ne 'grep /'"$1"'/,$_ and print or exit 1'
}
$ export -f match
$ loop 'ls' --every 10s
$ loopy --delay 10s ls
$ loop 'touch $COUNT.txt' --count-by 5
$ loopy touch '{= $_=seq()*5 =}'.txt
$ loop --until-contains 200 -- ./get_response_code.sh --site mysite.biz`
$ loopy --halt now,success=1 './get_response_code.sh --site mysite.biz |
match 200'
$ loop './poke_server' --for-duration 8h
$ time_out 8h loopy ./poke_server
$ loop './poke_server' --until-success
$ loopy --halt now,success=1 ./poke_server
$ cat files_to_create.txt | loop 'touch $ITEM'
$ cat files_to_create.txt | parallel touch {}
$ loop 'ls' --for-duration 10min --summary
# --joblog is somewhat more verbose than --summary
$ time_out 10m loopy --joblog my.log ./poke_server; cat my.log
$ loop 'echo hello'
$ loopy echo hello
$ loop 'echo $COUNT'
# GNU Parallel counts from 1
$ loopy echo {#}
# Counting from 0 can be forced
$ loopy echo '{= $_=seq()-1 =}'
$ loop 'echo $COUNT' --count-by 2
$ loopy echo '{= $_=2*(seq()-1) =}'
$ loop 'echo $COUNT' --count-by 2 --offset 10
$ loopy echo '{= $_=10+2*(seq()-1) =}'
$ loop 'echo $COUNT' --count-by 1.1
# GNU Parallel rounds 3.3000000000000003 to 3.3
$ loopy echo '{= $_=1.1*(seq()-1) =}'
$ loop 'echo $COUNT $ACTUALCOUNT' --count-by 2
$ loopy echo '{= $_=2*(seq()-1) =} {#}'
$ loop 'echo $COUNT' --num 3 --summary
# --joblog is somewhat more verbose than --summary
$ seq 3 | parallel --joblog my.log echo; cat my.log
$ loop 'ls -foobarbatz' --num 3 --summary
# --joblog is somewhat more verbose than --summary
$ seq 3 | parallel --joblog my.log -N0 ls -foobarbatz; cat my.log
$ loop 'echo $COUNT' --count-by 2 --num 50 --only-last
# Can be emulated by running 2 jobs
$ seq 49 | parallel echo '{= $_=2*(seq()-1) =}' >/dev/null
$ echo 50| parallel echo '{= $_=2*(seq()-1) =}'
$ loop 'date' --every 5s
$ loopy --delay 5s date
$ loop 'date' --for-duration 8s --every 2s
$ time_out 8s loopy --delay 2s date
$ loop 'date -u' --until-time '2018-05-25 20:50:00' --every 5s
$ seconds=$((`date -d 2019-05-25T20:50:00 +%s` - `date +%s`))s
$ time_out $seconds loopy --delay 5s date -u
$ loop 'echo $RANDOM' --until-contains "666"
$ loopy --halt now,success=1 'echo $RANDOM | match 666'
$ loop 'if (( RANDOM % 2 )); then
(echo "TRUE"; true);
else
(echo "FALSE"; false);
fi' --until-success
$ loopy --halt now,success=1 'if (( $RANDOM % 2 )); then
(echo "TRUE"; true);
else
(echo "FALSE"; false);
fi'
$ loop 'if (( RANDOM % 2 )); then
(echo "TRUE"; true);
else
(echo "FALSE"; false);
fi' --until-error
$ loopy --halt now,fail=1 'if (( $RANDOM % 2 )); then
(echo "TRUE"; true);
else
(echo "FALSE"; false);
fi'
$ loop 'date' --until-match "(\d{4})"
$ loopy --halt now,success=1 'date | match [0-9][0-9][0-9][0-9]'
$ loop 'echo $ITEM' --for red,green,blue
$ parallel echo ::: red green blue
$ cat /tmp/my-list-of-files-to-create.txt | loop 'touch $ITEM'
$ cat /tmp/my-list-of-files-to-create.txt | parallel touch
$ ls | loop 'cp $ITEM $ITEM.bak'; ls
$ ls | parallel cp {} {}.bak; ls
$ loop 'echo $ITEM | tr a-z A-Z' -i
$ parallel 'echo {} | tr a-z A-Z'
# Or more efficiently:
$ parallel --pipe tr a-z A-Z
$ loop 'echo $ITEM' --for "`ls`"
$ parallel echo {} ::: "`ls`"
$ ls | loop './my_program $ITEM' --until-success;
$ ls | parallel --halt now,success=1 ./my_program {}
$ ls | loop './my_program $ITEM' --until-fail;
$ ls | parallel --halt now,fail=1 ./my_program {}
$ ./deploy.sh;
loop 'curl -sw "%{http_code}" http://coolwebsite.biz' \
--every 5s --until-contains 200;
./announce_to_slack.sh
$ ./deploy.sh;
loopy --delay 5s --halt now,success=1 \
'curl -sw "%{http_code}" http://coolwebsite.biz | match 200';
./announce_to_slack.sh
$ loop "ping -c 1 mysite.com" --until-success; ./do_next_thing
$ loopy --halt now,success=1 ping -c 1 mysite.com; ./do_next_thing
$ ./create_big_file -o my_big_file.bin;
loop 'ls' --until-contains 'my_big_file.bin';
./upload_big_file my_big_file.bin
# inotifywait is a better tool to detect file system changes.
# It can even make sure the file is complete
# so you are not uploading an incomplete file
$ inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f . |
grep my_big_file.bin
$ ls | loop 'cp $ITEM $ITEM.bak'
$ ls | parallel cp {} {}.bak
$ loop './do_thing.sh' --every 15s --until-success --num 5
$ parallel --retries 5 --delay 15s ::: ./do_thing.sh
https://github.com/Miserlou/Loop/ (Last checked: 2018-10)
=head2 DIFFERENCES BETWEEN lorikeet AND GNU Parallel
B<lorikeet> can run jobs in parallel. It does this based on a
dependency graph described in a file, so this is similar to B<make>.
https://github.com/cetra3/lorikeet (Last checked: 2018-10)
=head2 DIFFERENCES BETWEEN spp AND GNU Parallel
B<spp> can run jobs in parallel. B<spp> does not use a command
template to generate the jobs, but requires jobs to be in a
file. Output from the jobs mix.
https://github.com/john01dav/spp
=head2 Todo =head2 Todo
Url for map, spread Url for spread
machma. Requires Go >= 1.7.
https://github.com/amritb/with-this.git
https://github.com/fd0/machma Requires Go >= 1.7.
https://github.com/k-bx/par requires Haskell to work. This limits the https://github.com/k-bx/par requires Haskell to work. This limits the
number of platforms this can work on. number of platforms this can work on.
@ -1518,6 +1747,8 @@ https://github.com/Julian/Verge
https://github.com/amattn/paral https://github.com/amattn/paral
https://github.com/mmstick/concurr
pyargs pyargs
@ -1559,7 +1790,8 @@ This test stresses whether output mixes.
chmod +x mycommand chmod +x mycommand
# Run 30 jobs in parallel # Run 30 jobs in parallel
seq 30 | $paralleltool ./mycommand > >(tr -s abcdef) 2> >(tr -s abcdef >&2) seq 30 |
$paralleltool ./mycommand > >(tr -s abcdef) 2> >(tr -s abcdef >&2)
# 'a c e' and 'b d f' should always stay together # 'a c e' and 'b d f' should always stay together
# and there should only be a single line per job # and there should only be a single line per job
@ -1673,6 +1905,18 @@ Some tools can only insert the argument once.
echo bar | $paralleltool echo {} foo {} echo bar | $paralleltool echo {} foo {}
=head2 INPUTSIZE: Length of input should not be limited
Some tools limit the length of the input lines artificially with no good
reason. GNU B<parallel> does not:
perl -e 'print "foo."."x"x100_000_000' | parallel echo {.}
GNU B<parallel> limits the command to run to 128 KB due to execve(1):
perl -e 'print "x"x131_000' | parallel echo {} | wc
=head2 NUMWORDS: Speed depends on number of words =head2 NUMWORDS: Speed depends on number of words
Some tools become very slow if output lines have many words. Some tools become very slow if output lines have many words.
@ -1705,10 +1949,10 @@ If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
Copyright (C) 2008,2009,2010 Ole Tange, http://ole.tange.dk Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange, Copyright (C) 2010-2018 Ole Tange, http://ole.tange.dk and Free
http://ole.tange.dk and Free Software Foundation, Inc. Software Foundation, Inc.
Parts of the manual concerning B<xargs> compatibility is inspired by Parts of the manual concerning B<xargs> compatibility is inspired by
the manual of B<xargs> from GNU findutils 4.4.2. the manual of B<xargs> from GNU findutils 4.4.2.
@ -1716,8 +1960,7 @@ the manual of B<xargs> from GNU findutils 4.4.2.
=head1 LICENSE =head1 LICENSE
Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018 Copyright (C) 2007-2018 Free Software Foundation, Inc.
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View file

@ -15,7 +15,7 @@ situations, and to avoid overloading you with information, the most
used features are presented first. used features are presented first.
All the examples are tested in Bash, and most will work in other All the examples are tested in Bash, and most will work in other
shells, too, but there are a few exceptions. So you are recommened to shells, too, but there are a few exceptions. So you are recommended to
use Bash while testing out the examples. use Bash while testing out the examples.
@ -209,8 +209,8 @@ If the input is B<mydir/mysubdir/myfile.myext> then:
{#} = the sequence number of the job {#} = the sequence number of the job
{%} = the job slot number {%} = the job slot number
When a job is started it gets sequence number that starts at 1 and When a job is started it gets a sequence number that starts at 1 and
increases with 1 for each new job. The job also gets assigned a slot increases by 1 for each new job. The job also gets assigned a slot
number. This number is from 1 to the number of jobs running in number. This number is from 1 to the number of jobs running in
parallel. It is unique between the running jobs, but is re-used as parallel. It is unique between the running jobs, but is re-used as
soon as a job finishes. soon as a job finishes.
@ -349,7 +349,7 @@ A shorthand for B<--transfer --return {} --cleanup> is B<--trc {}>.
=head1 Advanced usage =head1 Advanced usage
parset fifo, cmd substtition, arrayelements, array with var names and cmds, env_parset parset fifo, cmd substitution, arrayelements, array with var names and cmds, env_parset
env_parallel env_parallel
@ -384,7 +384,7 @@ Interfacing with HTML/?
seq 10 | parallel --sshlogin 'ssh -i "key.pem" a@b.com' echo seq 10 | parallel --sshlogin 'ssh -i "key.pem" a@b.com' echo
seq 10 | PARALLLEL_SSH='ssh -i "key.pem"' parallel --sshlogin a@b.com echo seq 10 | PARALLEL_SSH='ssh -i "key.pem"' parallel --sshlogin a@b.com echo
seq 10 | parallel --ssh 'ssh -i "key.pem"' --sshlogin a@b.com echo seq 10 | parallel --ssh 'ssh -i "key.pem"' --sshlogin a@b.com echo

View file

@ -213,10 +213,10 @@ error (stderr).
GNU B<parallel> pipes output from the command run into the compression GNU B<parallel> pipes output from the command run into the compression
program which saves to a tmpfile. GNU B<parallel> records the pid of program which saves to a tmpfile. GNU B<parallel> records the pid of
the compress program. At the same time a small perl script (called the compress program. At the same time a small Perl script (called
B<cattail> above) is started: It basically does B<cat> followed by B<cattail> above) is started: It basically does B<cat> followed by
B<tail -f>, but it also removes the tmpfile as soon as the first byte B<tail -f>, but it also removes the tmpfile as soon as the first byte
is read, and it continously checks if the pid of the compression is read, and it continuously checks if the pid of the compression
program is dead. If the compress program is dead, B<cattail> reads the program is dead. If the compress program is dead, B<cattail> reads the
rest of tmpfile and exits. rest of tmpfile and exits.
@ -539,7 +539,7 @@ needs to know how to read the function.
From version 20150122 GNU B<parallel> tries both the ()-version and From version 20150122 GNU B<parallel> tries both the ()-version and
the %%-version, and the function definition works on both pre- and the %%-version, and the function definition works on both pre- and
post-shellshock versions of B<bash>. post-shell shock versions of B<bash>.
=head2 The remote system wrapper =head2 The remote system wrapper
@ -1183,7 +1183,7 @@ software, username, password, host, port, database, and table in a
single string. single string.
The DBURL must point to a table name. The table will be dropped and The DBURL must point to a table name. The table will be dropped and
created. The reason for not reusing an exising table is that the user created. The reason for not reusing an existing table is that the user
may have added more input sources which would require more columns in may have added more input sources which would require more columns in
the table. By prepending '+' to the DBURL the table will not be the table. By prepending '+' to the DBURL the table will not be
dropped. dropped.
@ -1229,9 +1229,11 @@ cost work and which have not been tested are, however, unlikely to be
prioritized. prioritized.
Running B<parallel --citation> one single time takes less than 10 Running B<parallel --citation> one single time takes less than 10
seconds, and will silence the citation notice for future runs. If that seconds, and will silence the citation notice for future runs. This is
is too much trouble for you, why not use one of the alternatives comparable to graphical tools where you have to click a checkbox
instead? See a list in: B<man parallel_alternatives>. saying "Do not show this again". But if that is too much trouble for
you, why not use one of the alternatives instead? See a list in:
B<man parallel_alternatives>.
=head1 Ideas for new design =head1 Ideas for new design
@ -1239,7 +1241,7 @@ instead? See a list in: B<man parallel_alternatives>.
=head2 Multiple processes working together =head2 Multiple processes working together
Open3 is slow. Printing is slow. It would be good if they did not tie Open3 is slow. Printing is slow. It would be good if they did not tie
up ressources, but were run in separate threads. up resources, but were run in separate threads.
=head2 --rrs on remote using a perl wrapper =head2 --rrs on remote using a perl wrapper

View file

@ -2906,7 +2906,7 @@ Output:
=head2 Timeout =head2 Timeout
With B<--semaphoretimeout> you can force running the command anyway after With B<--semaphoretimeout> you can force running the command anyway after
a period (postive number) or give up (negative number): a period (positive number) or give up (negative number):
sem --id foo -u 'echo Slow started; sleep 5; echo Slow ended' && sem --id foo -u 'echo Slow started; sleep 5; echo Slow ended' &&
sem --id foo --semaphoretimeout 1 'echo Forced running after 1 sec' && sem --id foo --semaphoretimeout 1 'echo Forced running after 1 sec' &&
@ -2978,7 +2978,7 @@ When asking for help, always report the full output of this:
Output: Output:
GNU parallel 20180122 GNU parallel 20180122
Copyright (C) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018 Copyright (C) 2007-2018
Ole Tange and Free Software Foundation, Inc. Ole Tange and Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it. This is free software: you are free to change and redistribute it.
@ -3139,7 +3139,7 @@ https://my.fsf.org/donate/
=back =back
(C) 2013,2014,2015,2016,2017,2018 Ole Tange, GPLv3 (C) 2013-2018 Ole Tange, GPLv3
=cut =cut

View file

@ -28,7 +28,9 @@ If I<variablename> is a single variable name, this will be treated as
the destination variable and made into an array. the destination variable and made into an array.
If I<variablename> contains multiple names separated by ',' or space, If I<variablename> contains multiple names separated by ',' or space,
the names will be the destination variables. the names will be the destination variables. The number of names must
be at least the number of jobs - otherwise some tmp files will not be
cleaned up.
=head1 OPTIONS =head1 OPTIONS
@ -39,7 +41,7 @@ variable.
=head1 SUPPORTED SHELLS =head1 SUPPORTED SHELLS
=head2 Bash/Zsh/Ksh/(Mksh alpha testing) =head2 Bash/Zsh/Ksh/Mksh
=head3 Examples =head3 Examples
@ -178,16 +180,15 @@ If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
Copyright (C) 2008,2009,2010 Ole Tange, http://ole.tange.dk Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange, Copyright (C) 2010-2018 Ole Tange,
http://ole.tange.dk and Free Software Foundation, Inc. http://ole.tange.dk and Free Software Foundation, Inc.
=head1 LICENSE =head1 LICENSE
Copyright (C) 2016 Copyright (C) 2016 Ole Tange and Free Software Foundation, Inc.
Ole Tange and Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View file

@ -244,7 +244,7 @@ Report bugs to <bug-parallel@gnu.org>.
=head1 AUTHOR =head1 AUTHOR
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange, Copyright (C) 2010-2018 Ole Tange,
http://ole.tange.dk and Free Software Foundation, Inc. http://ole.tange.dk and Free Software Foundation, Inc.

View file

@ -576,7 +576,11 @@ $Global::Initfile && unlink $Global::Initfile;
exit ($err); exit ($err);
sub parse_options { sub parse_options {
<<<<<<< HEAD
$Global::version = 20180723; $Global::version = 20180723;
=======
$Global::version = 20181124;
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
$Global::progname = 'sql'; $Global::progname = 'sql';
# This must be done first as this may exec myself # This must be done first as this may exec myself

View file

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

View file

@ -100,8 +100,9 @@ parallel -j3 --timeout 3 --retries 10 --tag ssh_a_to_b ::: $shellsplus :::
# Remove env_parallel from .profile # Remove env_parallel from .profile
ssh nopathbash@lo 'perl -i.bak -pe s/.*env_parallel.*// .profile .bashrc' ssh nopathbash@lo 'perl -i.bak -pe s/.*env_parallel.*// .profile .bashrc'
ssh nopathcsh@lo 'echo >> .cshrc setenv PATH /bin:/usr/bin' ssh nopathcsh@lo 'echo >> .cshrc setenv PATH /bin:/usr/bin'
ssh nopathbash@lo 'echo $PATH' ssh nopathbash@lo 'echo $PATH; echo 1 | parallel echo' || echo Should FAIL
ssh nopathcsh@lo 'echo $PATH' ssh nopathcsh@lo 'echo $PATH; echo 1 | parallel echo' || echo Should FAIL
) )
ssh-copy-id localhost ssh-copy-id localhost
@ -132,3 +133,9 @@ echo
echo Add to /etc/ssh/sshd_config echo Add to /etc/ssh/sshd_config
echo Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes256-cbc,aes192-cbc,aes128-cbc,3des-cbc echo Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes256-cbc,aes192-cbc,aes128-cbc,3des-cbc
echo KexAlgorithms diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,curve25519-sha256@libssh.org,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1 echo KexAlgorithms diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,curve25519-sha256@libssh.org,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1
echo
echo If you get:
echo Unable to negotiate with server port 22: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se
echo add this to .ssh/config
echo Ciphers +aes256-cbc

View file

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

View file

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

View file

@ -9,6 +9,9 @@ ping -c 1 freebsd7.tange.dk >/dev/null 2>&1
ssh freebsd7.tange.dk touch .parallel/will-cite ssh freebsd7.tange.dk touch .parallel/will-cite
scp -q .*/src/{parallel,sem,sql,niceload,env_parallel*} freebsd7.tange.dk:bin/ scp -q .*/src/{parallel,sem,sql,niceload,env_parallel*} freebsd7.tange.dk:bin/
. `which env_parallel.bash`
env_parallel --session
par_no_more_procs() { par_no_more_procs() {
echo 'bug #40136: FreeBSD: No more processes' echo 'bug #40136: FreeBSD: No more processes'
sem --jobs 3 --id my_id -u 'echo First started; sleep 10; echo The first finished;echo' && sem --jobs 3 --id my_id -u 'echo First started; sleep 10; echo The first finished;echo' &&
@ -59,24 +62,24 @@ par_shebang() {
} }
par_shellshock_bug() { par_shellshock_bug() {
bash -c 'echo bug \#43358: shellshock breaks exporting functions using --env _; bash -c 'echo bug \#43358: shellshock breaks exporting functions using --env name;
echo Non-shellshock-hardened to non-shellshock-hardened; echo Non-shellshock-hardened to non-shellshock-hardened;
funky() { echo Function $1; }; funky() { echo Function $1; };
export -f funky; export -f funky;
PARALLEL_SHELL=bash parallel --env funky -S localhost funky ::: non-shellshock-hardened' PARALLEL_SHELL=bash parallel --env funky -S localhost funky ::: non-shellshock-hardened'
bash -c 'echo bug \#43358: shellshock breaks exporting functions using --env _; bash -c 'echo bug \#43358: shellshock breaks exporting functions using --env name;
echo Non-shellshock-hardened to shellshock-hardened; echo Non-shellshock-hardened to shellshock-hardened;
funky() { echo Function $1; }; funky() { echo Function $1; };
export -f funky; export -f funky;
parallel --env funky -S parallel@192.168.1.72 funky ::: shellshock-hardened' PARALLEL_SHELL=bash parallel --env funky -S parallel@192.168.1.72 funky ::: shellshock-hardened'
} }
par_load() { par_load() {
echo '### Test --load (must give 1=true)' echo '### Test --load (must give 1=true)'
parallel -j0 -N0 --timeout 5 --nice 10 'bzip2 < /dev/zero >/dev/null' ::: 1 2 3 4 5 6 & parallel -j0 -N0 --timeout 5 --nice 10 'bzip2 < /dev/zero >/dev/null' ::: 1 2 3 4 5 6 &
parallel --argsep ,, --joblog - -N0 parallel --load 100% echo ::: 1 ,, 1 | parallel --argsep ,, --joblog - -N0 parallel --load 100% echo ::: 1 ,, 1 |
parallel --colsep '\t' --header : echo '{=4 $_=$_>5=}' parallel -k --colsep '\t' --header : echo '{=4 $_=$_>5=}'
} }
par_env_parallel() { par_env_parallel() {
@ -104,7 +107,7 @@ unset TMPDIR
# we get 'shopt'-errors and 'declare'-errors. # we get 'shopt'-errors and 'declare'-errors.
# We can safely ignore those. # We can safely ignore those.
env_parallel --env _ -vj9 -k --joblog /tmp/jl-`basename $0` --retries 3 \ PARALLEL_SHELL=sh env_parallel --env _ -vj9 -k --joblog /tmp/jl-`basename $0` --retries 3 \
-S freebsd7.tange.dk --tag '{} 2>&1' \ -S freebsd7.tange.dk --tag '{} 2>&1' \
::: $(compgen -A function | grep par_ | sort) \ ::: $(compgen -A function | grep par_ | sort) \
2> >(grep -Ev 'shopt: not found|declare: not found') 2> >(grep -Ev 'shopt: not found|declare: not found')

View file

@ -20,14 +20,14 @@ export SMALLDISK
find /tmp{/*,}/*.{par,tms,tmx} 2>/dev/null -mmin -10 | parallel rm find /tmp{/*,}/*.{par,tms,tmx} 2>/dev/null -mmin -10 | parallel rm
stdsort() { stdsort() {
"$@" 2>&1 | sort; "$@" 2>&1 | LC_ALL=C sort;
} }
export -f stdsort export -f stdsort
# Test amount of parallelization # Test amount of parallelization
# parallel --shuf --jl /tmp/myjl -j1 'export JOBS={1};'bash tests-to-run/parallel-local-0.3s.sh ::: {1..16} ::: {1..5} # parallel --shuf --jl /tmp/myjl -j1 'export JOBS={1};'bash tests-to-run/parallel-local-0.3s.sh ::: {1..16} ::: {1..5}
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj13 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj13 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test bug #45619: "--halt" erroneous error exit code (should give 0)'; echo '### Test bug #45619: "--halt" erroneous error exit code (should give 0)';
seq 10 | parallel --halt now,fail=1 true; seq 10 | parallel --halt now,fail=1 true;
echo $? echo $?
@ -602,13 +602,13 @@ par_retries_replacement_string() {
par_tee() { par_tee() {
export PARALLEL='-k --tee --pipe --tag' export PARALLEL='-k --tee --pipe --tag'
seq 1000000 | parallel 'echo {%};LANG=C wc' ::: {1..5} ::: {a..b} seq 1000000 | parallel 'echo {%};LC_ALL=C wc' ::: {1..5} ::: {a..b}
seq 300000 | parallel 'grep {1} | LANG=C wc {2}' ::: {1..5} ::: -l -c seq 300000 | parallel 'grep {1} | LC_ALL=C wc {2}' ::: {1..5} ::: -l -c
} }
par_tagstring_pipe() { par_tagstring_pipe() {
echo 'bug #50228: --pipe --tagstring broken' echo 'bug #50228: --pipe --tagstring broken'
seq 3000 | parallel -j4 --pipe -N1000 -k --tagstring {%} LANG=C wc seq 3000 | parallel -j4 --pipe -N1000 -k --tagstring {%} LC_ALL=C wc
} }
par_link_files_as_only_arg() { par_link_files_as_only_arg() {
@ -706,12 +706,12 @@ par_halt_one_job() {
par_blocking_redir() { par_blocking_redir() {
( (
echo 'bug #52740: Bash redirection with process substitution blocks' echo 'bug #52740: Bash redirection with process substitution blocks'
echo Test stdout echo Test stdout
echo 3 | parallel seq > >(echo stdout;wc) 2> >(echo stderr >&2; wc >&2) echo 3 | parallel seq > >(echo stdout;wc) 2> >(echo stderr >&2; wc >&2)
echo Test stderr echo Test stderr
echo nOfilE | parallel ls > >(echo stdout;wc) 2> >(echo stderr >&2; wc >&2) echo nOfilE | parallel ls > >(echo stdout;wc) 2> >(echo stderr >&2; wc >&2)
) 2>&1 | sort ) 2>&1 | LC_ALL=C sort
} }
par_pipepart_recend_recstart() { par_pipepart_recend_recstart() {
@ -837,6 +837,34 @@ par_perlexpr_with_newline() {
rm *"Dad's \"famous\" 1' pizza" rm *"Dad's \"famous\" 1' pizza"
} }
par_empty_command() {
echo 'bug #54647: parset ignores empty lines'
# really due to this. Should give an empty line due to -v:
parallel -v :::: <(echo)
. `which env_parallel.bash`
parset a,b,c :::: <(echo echo A; echo; echo echo C)
echo Empty: $b
parset a,b,c :::: <(echo echo A; echo echo B; echo echo C)
echo B: $b
}
par_empty_input_on_stdin() {
echo 'https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=910470'
echo 'This should give no output'
true | stdout parallel --shuf echo
}
par_tee_too_many_args() {
echo '### Fail if there are more arguments than --jobs'
seq 11 |parallel -k --tag --pipe -j4 --tee grep {} ::: {1..4}
seq 11 |parallel -k --tag --pipe -j4 --tee grep {} ::: {1..5}
}
par_space_envvar() {
echo "### bug: --gnu was ignored if env var started with space: PARALLEL=' --gnu'"
export PARALLEL=" -v" && parallel echo ::: 'space in envvar OK'
}
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1' parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -24,6 +24,7 @@ par_exit_code() {
OK="ash bash csh dash fish mksh posh rc sash sh static-sh tcsh" OK="ash bash csh dash fish mksh posh rc sash sh static-sh tcsh"
BAD="fdsh fizsh ksh ksh93 yash zsh" BAD="fdsh fizsh ksh ksh93 yash zsh"
s=100 s=100
rm -f /tmp/mysleep
cp /bin/sleep /tmp/mysleep cp /bin/sleep /tmp/mysleep
echo '# Ideally the command should return the same' echo '# Ideally the command should return the same'
@ -34,12 +35,12 @@ par_exit_code() {
'/tmp/mysleep '$s \ '/tmp/mysleep '$s \
'parallel --halt-on-error now,fail=1 /tmp/mysleep ::: '$s \ 'parallel --halt-on-error now,fail=1 /tmp/mysleep ::: '$s \
'parallel --halt-on-error now,done=1 /tmp/mysleep ::: '$s \ 'parallel --halt-on-error now,done=1 /tmp/mysleep ::: '$s \
'parallel --halt-on-error now,done=1 true ::: '$s \ 'parallel --halt-on-error now,done=1 /bin/true ::: '$s \
'parallel --halt-on-error now,done=1 exit ::: '$s \ 'parallel --halt-on-error now,done=1 exit ::: '$s \
'true;/tmp/mysleep '$s \ 'true;/tmp/mysleep '$s \
'parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: '$s \ 'parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: '$s \
'parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: '$s \ 'parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: '$s \
'parallel --halt-on-error now,done=1 "true;true" ::: '$s \ 'parallel --halt-on-error now,done=1 "true;/bin/true" ::: '$s \
'parallel --halt-on-error now,done=1 "true;exit" ::: '$s 'parallel --halt-on-error now,done=1 "true;exit" ::: '$s
} }
export -f runit export -f runit

View file

@ -4,6 +4,28 @@
# Each should be taking 10-30s and be possible to run in parallel # Each should be taking 10-30s and be possible to run in parallel
# I.e.: No race conditions, no logins # I.e.: No race conditions, no logins
par_sem_2jobs() {
echo '### Test semaphore 2 jobs running simultaneously'
parallel --semaphore --id 2jobs -u -j2 'echo job1a 1; sleep 4; echo job1b 3'
sleep 0.5
parallel --semaphore --id 2jobs -u -j2 'echo job2a 2; sleep 4; echo job2b 5'
sleep 0.5
parallel --semaphore --id 2jobs -u -j2 'echo job3a 4; sleep 4; echo job3b 6'
parallel --semaphore --id 2jobs --wait
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() { par_line_buffer() {
echo "### --line-buffer" echo "### --line-buffer"
tmp1=$(tempfile) tmp1=$(tempfile)
@ -58,7 +80,7 @@ par__pipe_tee() {
< /dev/zero openssl enc -aes-128-ctr -K 1234 -iv 1234 2>/dev/null | < /dev/zero openssl enc -aes-128-ctr -K 1234 -iv 1234 2>/dev/null |
head -c 1G; head -c 1G;
} }
random1G | parallel --pipe --tee cat ::: {1..3} | LANG=C wc -c random1G | parallel --pipe --tee cat ::: {1..3} | LC_ALL=C wc -c
} }
par__pipepart_tee() { par__pipepart_tee() {
@ -71,7 +93,7 @@ par__pipepart_tee() {
} }
tmp=$(mktemp) tmp=$(mktemp)
random1G >$tmp random1G >$tmp
parallel --pipepart --tee -a $tmp cat ::: {1..3} | LANG=C wc -c parallel --pipepart --tee -a $tmp cat ::: {1..3} | LC_ALL=C wc -c
rm $tmp rm $tmp
} }
@ -126,7 +148,7 @@ _EOF
echo echo
) | perl -ne 's/\r//g;/\S/ and print' | ) | perl -ne 's/\r//g;/\S/ and print' |
# Race will cause the order to change # Race will cause the order to change
sort LC_ALL=C sort
} }
par_k() { par_k() {
@ -148,7 +170,7 @@ par_k_linebuffer() {
par_maxlinelen_m_I() { par_maxlinelen_m_I() {
echo "### Test max line length -m -I" echo "### Test max line length -m -I"
seq 1 60000 | parallel -I :: -km -j1 echo a::b::c | sort >/tmp/114-a$$; seq 1 60000 | parallel -I :: -km -j1 echo a::b::c | LC_ALL=C sort >/tmp/114-a$$;
md5sum </tmp/114-a$$; md5sum </tmp/114-a$$;
export CHAR=$(cat /tmp/114-a$$ | wc -c); export CHAR=$(cat /tmp/114-a$$ | wc -c);
export LINES=$(cat /tmp/114-a$$ | wc -l); export LINES=$(cat /tmp/114-a$$ | wc -l);
@ -159,7 +181,7 @@ par_maxlinelen_m_I() {
par_maxlinelen_X_I() { par_maxlinelen_X_I() {
echo "### Test max line length -X -I" echo "### Test max line length -X -I"
seq 1 60000 | parallel -I :: -kX -j1 echo a::b::c | sort >/tmp/114-b$$; seq 1 60000 | parallel -I :: -kX -j1 echo a::b::c | LC_ALL=C sort >/tmp/114-b$$;
md5sum </tmp/114-b$$; md5sum </tmp/114-b$$;
export CHAR=$(cat /tmp/114-b$$ | wc -c); export CHAR=$(cat /tmp/114-b$$ | wc -c);
export LINES=$(cat /tmp/114-b$$ | wc -l); export LINES=$(cat /tmp/114-b$$ | wc -l);
@ -191,8 +213,11 @@ par_results_csv() {
} }
par_results_compress() { par_results_compress() {
parallel --results /tmp/ged --compress echo ::: 1 | wc -l tmp=$(mktemp)
parallel --results /tmp/ged echo ::: 1 | wc -l rm "$tmp"
parallel --results $tmp --compress echo ::: 1 | wc -l
parallel --results $tmp echo ::: 1 | wc -l
rm -r "$tmp"
} }
par_kill_children_timeout() { par_kill_children_timeout() {
@ -298,15 +323,6 @@ par_plus_dyn_repl() {
parallel --plus echo '{-2,,A}' ::: "wrong" ::: "$myvar" ::: "wrong" parallel --plus echo '{-2,,A}' ::: "wrong" ::: "$myvar" ::: "wrong"
} }
par_linebuffer_tag_slow_output() {
echo "Test output tag with mixing halflines"
halfline() {
perl -e '$| = 1; map { print $ARGV[0]; sleep(2); print "$_\n" } split //, "Half\n"' $1
}
export -f halfline
parallel --delay 1 -j0 --tag --line-buffer halfline ::: a b
}
par_retries_all_fail() { par_retries_all_fail() {
echo "bug #53748: -k --retries 10 + out of filehandles = blocking" echo "bug #53748: -k --retries 10 + out of filehandles = blocking"
ulimit -n 30 ulimit -n 30
@ -338,7 +354,6 @@ par_long_line_remote() {
parallel -j1 -S lo -N 10000 echo {} |wc parallel -j1 -S lo -N 10000 echo {} |wc
} }
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel --joblog /tmp/jl-`basename $0` -j10 --tag -k '{} 2>&1' parallel --joblog /tmp/jl-`basename $0` -j10 --tag -k '{} 2>&1'

View file

@ -62,66 +62,66 @@ par_result() {
echo "### Test --results" echo "### Test --results"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII parallel -k --results /tmp/parallel_results_test/testA echo {1} {2} ::: I II ::: III IIII
ls /tmp/parallel_results_test/testA/*/*/*/*/* ls /tmp/parallel_results_test/testA/*/*/*/*/* | LC_ALL=C sort
rm -rf /tmp/parallel_results_test/testA* rm -rf /tmp/parallel_results_test/testA*
echo "### Test --res" echo "### Test --res"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII parallel -k --res /tmp/parallel_results_test/testD echo {1} {2} ::: I II ::: III IIII
ls /tmp/parallel_results_test/testD/*/*/*/*/* ls /tmp/parallel_results_test/testD/*/*/*/*/* | LC_ALL=C sort
rm -rf /tmp/parallel_results_test/testD* rm -rf /tmp/parallel_results_test/testD*
echo "### Test --result" echo "### Test --result"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII parallel -k --result /tmp/parallel_results_test/testE echo {1} {2} ::: I II ::: III IIII
ls /tmp/parallel_results_test/testE/*/*/*/*/* ls /tmp/parallel_results_test/testE/*/*/*/*/* | LC_ALL=C sort
rm -rf /tmp/parallel_results_test/testE* rm -rf /tmp/parallel_results_test/testE*
echo "### Test --results --header :" echo "### Test --results --header :"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII parallel -k --header : --results /tmp/parallel_results_test/testB echo {1} {2} ::: a I II ::: b III IIII
ls /tmp/parallel_results_test/testB/*/*/*/*/* ls /tmp/parallel_results_test/testB/*/*/*/*/* | LC_ALL=C sort
rm -rf /tmp/parallel_results_test/testB* rm -rf /tmp/parallel_results_test/testB*
echo "### Test --results --header : named - a/b swapped" echo "### Test --results --header : named - a/b swapped"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II parallel -k --header : --results /tmp/parallel_results_test/testC echo {a} {b} ::: b III IIII ::: a I II
ls /tmp/parallel_results_test/testC/*/*/*/*/* ls /tmp/parallel_results_test/testC/*/*/*/*/* | LC_ALL=C sort
rm -rf /tmp/parallel_results_test/testC* rm -rf /tmp/parallel_results_test/testC*
echo "### Test --results --header : piped" echo "### Test --results --header : piped"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
(echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true (echo Col; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | parallel --header : --result /tmp/parallel_results_test/testF true
find /tmp/parallel_results_test/testF/*/*/* | sort find /tmp/parallel_results_test/testF/*/*/* | LC_ALL=C sort
rm -rf /tmp/parallel_results_test/testF* rm -rf /tmp/parallel_results_test/testF*
echo "### Test --results --header : piped - non-existing column header" echo "### Test --results --header : piped - non-existing column header"
mkdir -p /tmp/parallel_results_test mkdir -p /tmp/parallel_results_test
(printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') | (printf "Col1\t\n"; printf "v1\tv2\tv3\n"; perl -e 'print "backslash\\tab\tslash/null\0eof\n"') |
parallel --header : --result /tmp/parallel_results_test/testG true parallel --header : --result /tmp/parallel_results_test/testG true
find /tmp/parallel_results_test/testG/ | sort find /tmp/parallel_results_test/testG/ | LC_ALL=C sort
rm -rf /tmp/parallel_results_test/testG* rm -rf /tmp/parallel_results_test/testG*
} }
par_result_replace() { par_result_replace() {
echo '### bug #49983: --results with {1}' echo '### bug #49983: --results with {1}'
parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz
find /tmp/par_*_49983 | sort find /tmp/par_*_49983 | LC_ALL=C sort
rm -rf /tmp/par_*_49983 rm -rf /tmp/par_*_49983
parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz ::: A B C parallel --results /tmp/par_{}_49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort find /tmp/par_*_49983 | LC_ALL=C sort
rm -rf /tmp/par_*_49983 rm -rf /tmp/par_*_49983
parallel --results /tmp/par_{1}-{2}_49983 -k echo ::: foo bar baz ::: A B C parallel --results /tmp/par_{1}-{2}_49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort find /tmp/par_*_49983 | LC_ALL=C sort
rm -rf /tmp/par_*_49983 rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983 -k echo ::: foo bar baz ::: A B C parallel --results /tmp/par__49983 -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort find /tmp/par_*_49983 | LC_ALL=C sort
rm -rf /tmp/par_*_49983 rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983 --header : -k echo ::: foo bar baz ::: A B C parallel --results /tmp/par__49983 --header : -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983 | sort find /tmp/par_*_49983 | LC_ALL=C sort
rm -rf /tmp/par_*_49983 rm -rf /tmp/par_*_49983
parallel --results /tmp/par__49983-{}/ --header : -k echo ::: foo bar baz ::: A B C parallel --results /tmp/par__49983-{}/ --header : -k echo ::: foo bar baz ::: A B C
find /tmp/par_*_49983-* | sort find /tmp/par_*_49983-* | LC_ALL=C sort
rm -rf /tmp/par_*_49983-* rm -rf /tmp/par_*_49983-*
} }
@ -258,7 +258,11 @@ par_pipe_compress_blocks() {
seq 3 | parallel -k -j2 --compress -N1 -L1 --pipe cat seq 3 | parallel -k -j2 --compress -N1 -L1 --pipe cat
} }
par_too_long_line_X() {
echo 'bug #54869: Long lines break'
seq 3000 | parallel -Xj1 'echo {} {} {} {} {} {} {} {} {} {} {} {} {} {} | wc'
}
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1' parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -10,7 +10,7 @@ par_sigterm() {
A=$! A=$!
sleep 29; kill -TERM $A sleep 29; kill -TERM $A
wait wait
sort /tmp/parallel$$ LC_ALL=C sort /tmp/parallel$$
rm /tmp/parallel$$ rm /tmp/parallel$$
} }
@ -151,7 +151,7 @@ par_test_detected_shell() {
tmp="/tmp/test_unknown_shell_$shell" tmp="/tmp/test_unknown_shell_$shell"
cp $(which "$shell") "$tmp" cp $(which "$shell") "$tmp"
chmod +x "$tmp" chmod +x "$tmp"
$tmp -c 'ppar -Dinit echo ::: 1; true' | $tmp -c 'parallel -Dinit echo ::: 1; true' |
grep Global::shell grep Global::shell
rm "$tmp" rm "$tmp"
} }

View file

@ -186,28 +186,6 @@ newlines"' ::: a b c d e | sort
) | perl -pe 's/\0/<null>/g;s/\d+/./g' ) | perl -pe 's/\0/<null>/g;s/\d+/./g'
} }
par_parcat_mixing() {
echo 'parcat output should mix: a b a b'
mktmpfifo() {
tmp=$(tempfile)
rm $tmp
mkfifo $tmp
echo $tmp
}
slow_output() {
string=$1
perl -e 'print "'$string'"x9000,"start\n"'
sleep 4
perl -e 'print "'$string'"x9000,"end\n"'
}
tmp1=$(mktmpfifo)
tmp2=$(mktmpfifo)
slow_output a > $tmp1 &
sleep 2
slow_output b > $tmp2 &
parcat $tmp1 $tmp2 | tr -s ab
}
par_delay_human_readable() { par_delay_human_readable() {
# Test that you can use d h m s in --delay # Test that you can use d h m s in --delay
parallel --delay 0.1s echo ::: a b c parallel --delay 0.1s echo ::: a b c
@ -269,4 +247,4 @@ par_nice() {
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | parallel -j6 --tag -k '{} 2>&1' compgen -A function | grep par_ | LC_ALL=C sort | parallel -j6 --tag -k '{} 2>&1'

View file

@ -20,7 +20,7 @@ export -f perl5.14parallel
par_2gb_records_N() { par_2gb_records_N() {
echo '### bug #44358: 2 GB records cause problems for -N' echo '### bug #44358: 2 GB records cause problems for -N'
echo '5 GB version: Eats 12.5 GB' echo '5 GB version: Eats 12.5 GB RAM + 4 GB Swap'
(gendata 5000MB; echo FOO; (gendata 5000MB; echo FOO;
gendata 3000MB; echo FOO; gendata 3000MB; echo FOO;
gendata 1000MB;) | gendata 1000MB;) |
@ -33,7 +33,7 @@ par_2gb_records_N() {
perl5.14parallel --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c perl5.14parallel --pipe --recend FOO -N2 --block 1g -k LANG=c wc -c
echo '### -L >4GB'; echo '### -L >4GB';
echo 'Eats 12.5 GB'; echo 'Eats 12.5 GB RAM + 6 GB Swap';
(head -c 5000MB /dev/zero; echo FOO; (head -c 5000MB /dev/zero; echo FOO;
head -c 3000MB /dev/zero; echo FOO; head -c 3000MB /dev/zero; echo FOO;
head -c 1000MB /dev/zero;) | head -c 1000MB /dev/zero;) |

View file

@ -29,6 +29,28 @@
echo 1=OK $?' | grep -v '\[1\]' | grep -v 'SHA256' echo 1=OK $?' | grep -v '\[1\]' | grep -v 'SHA256'
#} #}
par_parcat_mixing() {
echo 'parcat output should mix: a b a b'
mktmpfifo() {
tmp=$(tempfile)
rm $tmp
mkfifo $tmp
echo $tmp
}
slow_output() {
string=$1
perl -e 'print "'$string'"x9000,"start\n"'
sleep 2
perl -e 'print "'$string'"x9000,"end\n"'
}
tmp1=$(mktmpfifo)
tmp2=$(mktmpfifo)
slow_output a > $tmp1 &
sleep 1
slow_output b > $tmp2 &
parcat $tmp1 $tmp2 | tr -s ab
}
par_testhalt() { par_testhalt() {
testhalt_false() { testhalt_false() {
echo '### testhalt --halt '$1; echo '### testhalt --halt '$1;
@ -94,6 +116,30 @@ par_tmux_termination() {
stdout parallel --timeout 120 doit ::: 1 stdout parallel --timeout 120 doit ::: 1
} }
par_linebuffer_tag_slow_output() {
echo "Test output tag with mixing halflines"
halfline() {
perl -e '$| = 1; map { print $ARGV[0]; sleep(1); print "$_\n" } split //, "Half\n"' $1
}
export -f halfline
parallel --delay 0.5 -j0 --tag --line-buffer halfline ::: a b
}
par_continuous_output() {
# After the first batch, each jobs should output when it finishes.
# Old versions delayed output by $jobslots jobs
doit() {
echo "Test delayed output with '$1'"
echo "-u is optimal but hard to reach, due to non-mixing"
seq 10 |
parallel -j1 $1 --delay 1 -N0 echo |
parallel -j4 $1 -N0 'sleep 0.6;date' |
timestamp -dd |
perl -pe 's/(.).*/$1/'
}
export -f doit
parallel -k doit ::: '' -u
}
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | sort |

View file

@ -147,6 +147,11 @@ par_no_table() {
export -f $(compgen -A function | egrep 'p_|par_') export -f $(compgen -A function | egrep 'p_|par_')
# Tested that -j0 in parallel is fastest (up to 15 jobs) # Tested that -j0 in parallel is fastest (up to 15 jobs)
# more than 3 jobs: sqlite locks # more than 3 jobs: sqlite locks
<<<<<<< HEAD
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | sort |
stdout parallel --timeout 250 -vj40% -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \ stdout parallel --timeout 250 -vj40% -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \
=======
compgen -A function | grep par_ | LC_ALL=C sort |
stdout parallel --timeout 200 -vj3 -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
:::: - ::: \$MYSQL \$PG \$SQLITE :::: - ::: \$MYSQL \$PG \$SQLITE

View file

@ -120,8 +120,11 @@ par_empty() {
true; true;
} }
hostname=`hostname`
export -f $(compgen -A function | egrep 'p_|par_') export -f $(compgen -A function | egrep 'p_|par_')
# Tested that -j0 in parallel is fastest (up to 15 jobs) # Tested that -j0 in parallel is fastest (up to 15 jobs)
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | sort |
stdout parallel -vj5 -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \ stdout parallel -vj5 -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \
:::: - ::: \$MYSQL \$PG \$SQLITE | perl -pe 's/tbl\d+/TBL99999/gi' :::: - ::: \$MYSQL \$PG \$SQLITE | perl -pe 's/tbl\d+/TBL99999/gi;' |
perl -pe 's/(from TBL99999 order) .*/$1/g' |
perl -pe "s/$hostname/hostname/g"

View file

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

View file

@ -2,7 +2,7 @@
# SSH only allowed to localhost/lo # SSH only allowed to localhost/lo
cat <<'EOF' | parallel -vj100% --retries 3 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | parallel -vj100% --retries 3 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### trailing space in sshlogin' echo '### trailing space in sshlogin'
echo 'sshlogin trailing space' | parallel --sshlogin "ssh -l parallel localhost " echo echo 'sshlogin trailing space' | parallel --sshlogin "ssh -l parallel localhost " echo
@ -40,11 +40,6 @@ echo '### bug #45906: {= in header =}'
parallel --rpl '{G} $_=lc($_)' -S parallel@lo --return {G} --cleanup echo {G} '>' {G} ::: RETURNFILE45906; parallel --rpl '{G} $_=lc($_)' -S parallel@lo --return {G} --cleanup echo {G} '>' {G} ::: RETURNFILE45906;
ls returnfile45906 ls returnfile45906
echo '### bug #45907: --header : + --return {header}'
rm returnfile45907;
ppar --header : -S parallel@lo --return {G} --cleanup echo {G} '>' {G} ::: G returnfile45907;
ls returnfile45907
echo "### bug #47608: parallel --nonall -S lo 'echo ::: ' blocks" echo "### bug #47608: parallel --nonall -S lo 'echo ::: ' blocks"
parallel --nonall -S lo 'echo ::: ' parallel --nonall -S lo 'echo ::: '
@ -59,6 +54,13 @@ echo '### bug #49404: "Max jobs to run" does not equal the number of jobs specif
stdout parallel -S 16/lo --progress true ::: {1..10} | grep /.10 stdout parallel -S 16/lo --progress true ::: {1..10} | grep /.10
EOF EOF
par_header_in_return() {
echo '### bug #45907: --header : + --return {header}'
rm returnfile45907
parallel --header : -S parallel@lo --return {G} --cleanup echo {G} '>' {G} ::: G returnfile45907
ls returnfile45907
}
par_trc_with_space() { par_trc_with_space() {
echo '### Test --trc with space added in filename' echo '### Test --trc with space added in filename'
cd cd

View file

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

View file

@ -48,6 +48,14 @@ par_pipe_retries() {
stdout parallel --retries 2 --roundrobin echo ::: should fail stdout parallel --retries 2 --roundrobin echo ::: should fail
} }
par_env_parallel_onall() {
echo "bug #54352: env_parallel -Slo --nonall myfunc broken in 20180722"
. `which env_parallel.bash`
doit() { echo Myfunc "$@"; }
env_parallel -Slo --onall doit ::: works
env_parallel -Slo --nonall doit works
}
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort -r | compgen -A function | grep par_ | sort -r |
parallel --joblog /tmp/jl-`basename $0` -j3 --tag -k --delay 0.1 --retries 3 '{} 2>&1' parallel --joblog /tmp/jl-`basename $0` -j3 --tag -k --delay 0.1 --retries 3 '{} 2>&1'

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,8 @@ par_path_remote_bash() {
rm -rf /tmp/parallel rm -rf /tmp/parallel
cp /usr/local/bin/parallel /tmp cp /usr/local/bin/parallel /tmp
cat <<'_EOS' | stdout ssh nopathbash@lo -T | grep -Ev 'For upgrade information, please visit:|updates are security updates|packages can be updated|System restart required|Welcome to|https://|Ubuntu|http://|from 13 to 17 years|mentor:|New release|do-release-upgrade|public clouds|\s*^$' | uniq cat <<'_EOS' | stdout ssh nopathbash@lo -T | perl -ne '/logged in/..0 and print' | uniq
echo logged in
echo BASH Path before: $PATH with no parallel echo BASH Path before: $PATH with no parallel
parallel echo ::: 1 parallel echo ::: 1
# Race condition stderr/stdout # Race condition stderr/stdout
@ -28,7 +29,8 @@ par_path_remote_csh() {
rm -rf /tmp/parallel rm -rf /tmp/parallel
cp /usr/local/bin/parallel /tmp cp /usr/local/bin/parallel /tmp
cat <<'_EOS' | stdout ssh nopathcsh@lo -T | grep -Ev 'For upgrade information, please visit:|updates are security updates|packages can be updated|System restart required|Welcome to|https://|Ubuntu|http://|from 13 to 17 years|mentor:|New release|do-release-upgrade|public clouds|\s*^$' | uniq cat <<'_EOS' | stdout ssh nopathcsh@lo -T | perl -ne '/logged in/..0 and print' | uniq
echo logged in
echo CSH Path before: $PATH with no parallel echo CSH Path before: $PATH with no parallel
which parallel >& /dev/stdout which parallel >& /dev/stdout
echo '^^^^^^^^ Not found is OK' echo '^^^^^^^^ Not found is OK'
@ -155,6 +157,6 @@ par_retries_bug_from_2010() {
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
#compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1' #compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1'
compgen -A function | grep par_ | sort | compgen -A function | grep par_ | LC_ALL=C sort |
parallel --joblog /tmp/jl-`basename $0` --delay 0.1 -j10 --tag -k '{} 2>&1' | parallel --joblog /tmp/jl-`basename $0` --delay 0.1 -j10 --tag -k '{} 2>&1' |
grep -Ev 'microk8s|smart connected IoT' grep -Ev 'microk8s|smart connected IoT'

View file

@ -131,11 +131,47 @@ _EOF
ssh zsh@lo "$myscript" ssh zsh@lo "$myscript"
} }
par_propagate_env() {
echo '### bug #41805: Idea: propagate --env for parallel --number-of-cores'
echo '** test_zsh'
FOO=test_zsh parallel --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_zsh_filter'
FOO=test_zsh_filter parallel --filter-hosts --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_csh'
FOO=test_csh parallel --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** test_csh_filter'
FOO=test_csh_filter parallel --filter-hosts --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
echo '** bug #41805 done'
}
par_env_parallel_big_env() {
echo '### bug #54128: command too long when exporting big env'
. `which env_parallel.bash`
a=`rand | perl -pe 's/\0//g'| head -c 75000`
env_parallel -Slo echo should not ::: fail 2>&1
a=`rand | perl -pe 's/\0//g'| head -c 80000`
env_parallel -Slo echo should ::: fail 2>/dev/null || echo OK
}
par_no_route_to_host() {
echo '### no route to host with | and -j0 causes inf loop'
via_parallel() {
seq 11 | stdout parallel -j0 -S 192.168.1.199 echo
}
export -f via_parallel
raw() {
stdout ssh 192.168.1.199 echo
}
export -f raw
parallel -k ::: raw via_parallel
}
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)
#compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1' #compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1'
#compgen -A function | grep par_ | sort | #compgen -A function | grep par_ | sort |
compgen -A function | grep par_ | sort -r | compgen -A function | grep par_ | sort -r |
# parallel --joblog /tmp/jl-`basename $0` --delay $D -j$P --tag -k '{} 2>&1' # parallel --joblog /tmp/jl-`basename $0` --delay $D -j$P --tag -k '{} 2>&1'
parallel --joblog /tmp/jl-`basename $0` -j200% --tag -k '{} 2>&1' | parallel --joblog /tmp/jl-`basename $0` --delay 0.1 -j200% --tag -k '{} 2>&1' |
perl -pe 's/line \d\d\d+:/line XXX:/' | perl -pe 's/line \d\d\d+:/line XXX:/' |
perl -pe 's/\[\d\d\d+\]:/[XXX]:/' perl -pe 's/\[\d\d\d+\]:/[XXX]:/'

View file

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

View file

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

View file

@ -9,11 +9,11 @@ PARALLEL=-j8
export PARALLEL export PARALLEL
stdsort() { stdsort() {
"$@" 2>&1 | sort; "$@" 2>&1 | LC_ALL=C sort;
} }
export -f stdsort export -f stdsort
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj100 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj100 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### -0 -n3 echo < files0.xi' echo '### -0 -n3 echo < files0.xi'
stdout xargs -0 -n3 echo < files0.xi stdout xargs -0 -n3 echo < files0.xi
stdout parallel -k -0 -n3 echo < files0.xi stdout parallel -k -0 -n3 echo < files0.xi
@ -255,13 +255,13 @@ echo 'Because of -t these lines can be flipped around therefore sort'
stdout parallel -k -X -s30 -t echo < stairs.xi | sort stdout parallel -k -X -s30 -t echo < stairs.xi | sort
echo '### -t echo this plus that < space.xi' echo '### -t echo this plus that < space.xi'
stdout xargs -t echo this plus that < space.xi stdout xargs -t echo this plus that < space.xi
stdout parallel -k -t echo this plus that < space.xi stdout parallel -k -t echo this plus that < space.xi | sort
echo '### -n1 printf "@%s@\n" < empty.xi' echo '### -n1 printf "@%s@\n" < empty.xi'
stdout xargs -n1 printf "@%s@\n" < empty.xi stdout xargs -n1 printf "@%s@\n" < empty.xi
stdout parallel -k -n1 printf "@%s@\n" < empty.xi stdout parallel -k -n1 printf "@%s@\n" < empty.xi
echo '### -n2 -t echo < foobar.xi' echo '### -n2 -t echo < foobar.xi'
stdout xargs -n2 -t echo < foobar.xi stdout xargs -n2 -t echo < foobar.xi
stdout parallel -k -n2 -t echo < foobar.xi stdout parallel -k -n2 -t echo < foobar.xi | sort
EOF EOF

View file

@ -8,22 +8,22 @@ cd $TMP/
echo echo test of cat pipe sh | parallel -j 50 2>&1 echo echo test of cat pipe sh | parallel -j 50 2>&1
find . -name '*.jpg' | parallel -j +0 convert -geometry 120 {} {//}/thumb_{/} find . -name '*.jpg' | parallel -j +0 convert -geometry 120 {} {//}/thumb_{/}
ls | parallel ls | sort ls | parallel ls | LC_ALL=C sort
ls | parallel echo ls | sort ls | parallel echo ls | LC_ALL=C sort
ls | parallel -j 1 echo ls | sort ls | parallel -j 1 echo ls | LC_ALL=C sort
find -type f | parallel diff {} a/foo ">"{}.diff | sort find -type f | parallel diff {} a/foo ">"{}.diff | LC_ALL=C sort
ls | parallel -v --group "ls {}|wc;echo {}" | sort ls | parallel -v --group "ls {}|wc;echo {}" | LC_ALL=C sort
echo '### Check that we can have more input than max procs (-j 0) - touch' echo '### Check that we can have more input than max procs (-j 0) - touch'
perl -e 'print map {"more_than_5000-$_\n" } (4000..9999)' | parallel -vj 0 touch | sort | tail perl -e 'print map {"more_than_5000-$_\n" } (4000..9999)' | parallel -vj 0 touch | LC_ALL=C sort | tail
echo '### rm' echo '### rm'
perl -e 'print map {"more_than_5000-$_\n" } (4000..9900)' | parallel -j 0 rm | sort perl -e 'print map {"more_than_5000-$_\n" } (4000..9900)' | parallel -j 0 rm | LC_ALL=C sort
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 | egrep -v 'parallel: Warning: Starting|parallel: Warning: Consider' cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 | egrep -v 'parallel: Warning: Starting|parallel: Warning: Consider'
ls | parallel -j500 'sleep 1; find {} -type f | perl -ne "END{print $..\" "{=$_=pQ($_)=}"\n\"}"' | sort ls | parallel -j500 'sleep 1; find {} -type f | perl -ne "END{print $..\" "{=$_=pQ($_)=}"\n\"}"' | LC_ALL=C sort
ls | parallel --group -j500 'sleep 1; find {} -type f | perl -ne "END{print $..\" "{=$_=pQ($_)=}"\n\"}"' | sort ls | parallel --group -j500 'sleep 1; find {} -type f | perl -ne "END{print $..\" "{=$_=pQ($_)=}"\n\"}"' | LC_ALL=C sort
find . -type f | parallel --group "perl -ne '/^\\S+\\s+\\S+$/ and print \$ARGV,\"\\n\"'" | sort find . -type f | parallel --group "perl -ne '/^\\S+\\s+\\S+$/ and print \$ARGV,\"\\n\"'" | LC_ALL=C sort
find . -type f | parallel -v --group "perl -ne '/^\\S+\\s+\\S+$/ and print \$ARGV,\"\\n\"'" | sort find . -type f | parallel -v --group "perl -ne '/^\\S+\\s+\\S+$/ and print \$ARGV,\"\\n\"'" | LC_ALL=C sort
find . -type f | parallel -q --group perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' | sort find . -type f | parallel -q --group perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' | LC_ALL=C sort
find . -type f | parallel -qv --group perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' | sort find . -type f | parallel -qv --group perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' | LC_ALL=C sort
EOF EOF
cd - >/dev/null cd - >/dev/null

View file

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

View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# -L1 will join lines ending in ' ' # -L1 will join lines ending in ' '
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### bug #38354: -J profile_name should read from `pwd`/profile_name before ~/.parallel/profile_name' echo '### bug #38354: -J profile_name should read from `pwd`/profile_name before ~/.parallel/profile_name'
echo "echo echo from ./local_test_profile" > local_test_profile; echo "echo echo from ./local_test_profile" > local_test_profile;
parallel --profile local_test_profile echo ::: 1; parallel --profile local_test_profile echo ::: 1;
@ -50,7 +50,7 @@ echo "bug #37956: --colsep does not default to '\t' as specified in the man page
printf "A\tB\n1\tone" | parallel --header : echo {B} {A} printf "A\tB\n1\tone" | parallel --header : echo {B} {A}
echo '### Test --tollef' echo '### Test --tollef'
stdout parallel -k --tollef echo -- 1 2 3 ::: a b c | sort stdout parallel -k --tollef echo -- 1 2 3 ::: a b c | LC_ALL=C sort
echo '### Test --tollef --gnu' echo '### Test --tollef --gnu'
stdout parallel -k --tollef --gnu echo ::: 1 2 3 -- a b c stdout parallel -k --tollef --gnu echo ::: 1 2 3 -- a b c
@ -133,7 +133,4 @@ echo 'bug #34241: --pipe should not spawn unneeded processes - part 2'
echo No .par should exist; echo No .par should exist;
stdout ls *.par stdout ls *.par
echo "bug: --gnu was ignored if env var started with space: PARALLEL=' --gnu'"
export PARALLEL=" -v" && parallel echo ::: 'space in envvar OK'
EOF EOF

View file

@ -52,9 +52,9 @@ test_chr_on_sshlogin() {
stdout parallel -j4 -k -I // --arg-sep _ -0 V=// V2=V2=// LANG=C parallel -k -j1 $onall -S $sshlogin --env V,V2,LANG echo \''"{}$V$V2"'\' ::: {#} {#} {#} {#} | stdout parallel -j4 -k -I // --arg-sep _ -0 V=// V2=V2=// LANG=C parallel -k -j1 $onall -S $sshlogin --env V,V2,LANG echo \''"{}$V$V2"'\' ::: {#} {#} {#} {#} |
sort | sort |
uniq -c | uniq -c |
grep -v ' 4 '| grep -av ' 4 '|
grep -v xauth | grep -av xauth |
grep -v X11 grep -av X11
} }
export -f test_chr_on_sshlogin export -f test_chr_on_sshlogin
@ -87,7 +87,7 @@ par_env_160() {
par_env_160_onall() { par_env_160_onall() {
echo '### Test --env for \160 - which kills csh - single and double --onall - no output is good' echo '### Test --env for \160 - which kills csh - single and double --onall - no output is good'
test_chr_on_sshlogin 160 :,1/lo,1/tcsh@lo --onall | test_chr_on_sshlogin 160 :,1/lo,1/tcsh@lo --onall |
grep -v ' 3 ' grep -a -v ' 3 '
} }
export -f $(compgen -A function | grep par_) export -f $(compgen -A function | grep par_)

View file

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

View file

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

View file

@ -290,4 +290,4 @@ export -f $(compgen -A function | grep par_)
# Tested with -j1..8 # Tested with -j1..8
# -j6 was fastest # -j6 was fastest
#compgen -A function | grep par_ | sort | parallel -j$P --tag -k '{} 2>&1' #compgen -A function | grep par_ | sort | parallel -j$P --tag -k '{} 2>&1'
compgen -A function | grep par_ | sort | parallel -j6 --tag -k '{} 2>&1' compgen -A function | grep par_ | LC_ALL=C sort | parallel -j6 --tag -k '{} 2>&1'

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test of xargs -m command lines > 130k'; echo '### Test of xargs -m command lines > 130k';
seq 1 60000 | parallel -m -j1 echo a{}b{}c | tee >(wc >/tmp/awc$$) >(sort | md5sum) >/tmp/a$$; seq 1 60000 | parallel -m -j1 echo a{}b{}c | tee >(wc >/tmp/awc$$) >(sort | md5sum) >/tmp/a$$;
wait; wait;
@ -28,7 +28,7 @@ echo '### This causes problems if we kill child processes';
echo '### This causes problems if we kill child processes (II)'; echo '### This causes problems if we kill child processes (II)';
# 2>/dev/null to avoid parallel: Warning: Starting 45 processes took > 2 sec. # 2>/dev/null to avoid parallel: Warning: Starting 45 processes took > 2 sec.
seq 1 40 | parallel -j 0 seq 1 10 '| parallel -j 3 echo' 2>/dev/null | sort | md5sum seq 1 40 | parallel -j 0 seq 1 10 '| parallel -j 3 echo' 2>/dev/null | LC_ALL=C sort | md5sum
echo '### Test -m'; echo '### Test -m';
(echo foo;echo bar) | parallel -j1 -m echo 1{}2{}3 A{}B{}C (echo foo;echo bar) | parallel -j1 -m echo 1{}2{}3 A{}B{}C

View file

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

View file

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

View file

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

View file

@ -1,5 +1,23 @@
#!/bin/bash #!/bin/bash
get_tmux() {
# To install tmux in different version run this
cd /tmp
doit() {
wget https://github.com/tmux/tmux/archive/$1.tar.gz
tar xvf $1.tar.gz
cd tmux-$1
./autogen.sh
./configure --prefix /tmp/tmux/$1
make
make install
sudo cp /tmp/tmux/$1/bin/tmux /usr/local/bin/tmux-$1
}
. `which env_parallel.bash`
seq 1.8 0.1 2.9 | env_parallel --tag --lb doit
}
par_tmux_filter() { par_tmux_filter() {
# /tmp/parallel-local7/tmsOU2Ig # /tmp/parallel-local7/tmsOU2Ig
perl -pe 's:(/tmp\S+/tms).....:$1XXXXX:;s/ p\d+/pID/;' perl -pe 's:(/tmp\S+/tms).....:$1XXXXX:;s/ p\d+/pID/;'
@ -24,7 +42,7 @@ export -f par_tmux
# echo '### bug #48841: --tmux(pane) --fg should start tmux in foreground' # echo '### bug #48841: --tmux(pane) --fg should start tmux in foreground'
# stdout /usr/bin/time -f %e script -q -f -c /tmp/parallel-local7-script /dev/null | perl -ne '$_ >= 26 and $_ <= 45 and print "OK\n"' # stdout /usr/bin/time -f %e script -q -f -c /tmp/parallel-local7-script /dev/null | perl -ne '$_ >= 26 and $_ <= 45 and print "OK\n"'
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj8 --delay 1 --timeout 100 --retries 1 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj8 --delay 1 --timeout 100 --retries 1 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### tmux-1.9' echo '### tmux-1.9'
seq 0000 10 1000 | PARALLEL_TMUX=tmux-1.9 par_tmux seq 0000 10 1000 | PARALLEL_TMUX=tmux-1.9 par_tmux

View file

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

View file

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

View file

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

View file

@ -48,8 +48,8 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/
s/,[a-z]*,\d+.\d+,\d+.\d+/,:,000000000.000,0.000/g; s/,[a-z]*,\d+.\d+,\d+.\d+/,:,000000000.000,0.000/g;
# /usr/bin/time -f %e # /usr/bin/time -f %e
s/^(\d+)\.\d+$/$1/; s/^(\d+)\.\d+$/$1/;
# Base 64 string # Base 64 string with quotes
s:[\\+/a-z0-9=]{50,}:BASE64:ig; s:['"'"'"\\+/a-z0-9=]{50,}:BASE64:ig;
# --workdir ... # --workdir ...
s:parallel/tmp/aspire-\d+-1:TMPWORKDIR:g; s:parallel/tmp/aspire-\d+-1:TMPWORKDIR:g;
# + cat ... | (Bash outputs these in random order) # + cat ... | (Bash outputs these in random order)
@ -80,7 +80,11 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/
s/cat: input_file: No such file or directory\n//; s/cat: input_file: No such file or directory\n//;
s{rsync: link_stat ".*/home/parallel/input_file.out" .*\n}{}; s{rsync: link_stat ".*/home/parallel/input_file.out" .*\n}{};
s{rsync error: some files/attrs were not transferred .*\n}{}; s{rsync error: some files/attrs were not transferred .*\n}{};
s{.* GtkDialog .*\n}{};
' | ' |
perl -ne '/GTK2_RC_FILES/ and next;
/GTK_RC_FILES/ and next;
print' |
uniq uniq
# 3+3 .par files (from --files), 1 .tms-file from tmux attach # 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 | wc -l

View file

@ -1,31 +1,13 @@
#!/bin/bash #!/bin/bash
# -L1 will join lines ending in ' ' # -L1 will join lines ending in ' '
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 -r
echo '### Test mutex. This should not mix output'; echo '### Test mutex. This should not mix output';
parallel --semaphore --id mutex -u seq 1 10 '|' pv -qL 20; parallel --semaphore --id mutex -u seq 1 10 '|' pv -qL 20;
parallel --semaphore --id mutex -u seq 11 20 '|' pv -qL 100; parallel --semaphore --id mutex -u seq 11 20 '|' pv -qL 100;
parallel --semaphore --id mutex --wait; parallel --semaphore --id mutex --wait;
echo done echo done
echo '### Test semaphore 2 jobs running simultaneously'
parallel --semaphore --id 2jobs -u -j2 'echo job1a 1; sleep 1; echo job1b 3';
sleep 0.2;
parallel --semaphore --id 2jobs -u -j2 'echo job2a 2; sleep 1; echo job2b 5';
sleep 0.2;
parallel --semaphore --id 2jobs -u -j2 'echo job3a 4; sleep 1; echo job3b 6';
parallel --semaphore --id 2jobs --wait;
echo done
echo '### Test if parallel invoked as sem will run parallel --semaphore'
sem --id as_sem -u -j2 'echo job1a 1; sleep 1; echo job1b 3';
sleep 0.2;
sem --id as_sem -u -j2 'echo job2a 2; sleep 1; echo job2b 5';
sleep 0.2;
sem --id as_sem -u -j2 'echo job3a 4; sleep 1; echo job3b 6';
sem --id as_sem --wait;
echo done
echo '### Test similar example as from man page - run 2 jobs simultaneously' echo '### Test similar example as from man page - run 2 jobs simultaneously'
echo 'Expect done: 1 2 5 3 4' echo 'Expect done: 1 2 5 3 4'
for i in 5 1 2 3 4 ; do for i in 5 1 2 3 4 ; do

View file

@ -92,7 +92,7 @@ par_newline_on_commandline() {
par_showtables() { par_showtables() {
echo "### Test --show-tables" echo "### Test --show-tables"
sql --show-tables :oraunittest | sort sql --show-tables :oraunittest | LC_ALL=C sort
} }
par_showdatabases() { par_showdatabases() {

View file

@ -8,7 +8,7 @@ SSHLOGIN2=parallel@$SERVER2
export PARALLEL=-j0 export PARALLEL=-j0
#export PARALLEL="--sshdelay 0.3" #export PARALLEL="--sshdelay 0.3"
# Make sure sort order is the same # Make sure sort order is the same
export LANG=C export LC_ALL=C
echo '### Test --transfer --return --cleanup' echo '### Test --transfer --return --cleanup'

View file

@ -123,7 +123,7 @@ stdout ssh $SSHLOGIN1 ls 'tmp/parallel.file*' || echo OK
stdout ssh $SSHLOGIN2 ls 'tmp/parallel.file*' || echo OK stdout ssh $SSHLOGIN2 ls 'tmp/parallel.file*' || echo OK
echo 'Input for ssh' echo 'Input for ssh'
cat /tmp/myssh1-run /tmp/myssh2-run | perl -pe 's/(PID.)\d+/${1}00000/g;s/(SEQ[ =]|line)\d/$1X/g;' | cat /tmp/myssh1-run /tmp/myssh2-run | perl -pe 's/(PID.)\d+/${1}00000/g;s/(SEQ[ =]|line)\d/$1X/g;' |
perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-zA-Z0-9/\\+=]{500,}:base64:;' perl -pe 's/\S*parallel-server\S*/one-server/;s:\S[a-zA-Z0-9/\\+=]{500,}\S:base64:;'
rm /tmp/myssh1-run /tmp/myssh2-run rm /tmp/myssh1-run /tmp/myssh2-run
rm -rf /tmp/parallel.file* rm -rf /tmp/parallel.file*

View file

@ -27,7 +27,7 @@ seq 1 13 | parallel echo {} '>' parallel_{}.test
ls parallel_*.test | parallel -j+0 --trc {.}.out --bf my_script \ ls parallel_*.test | parallel -j+0 --trc {.}.out --bf my_script \
-S $SSHLOGIN1,$SSHLOGIN2,: "./my_script {} > {.}.out" -S $SSHLOGIN1,$SSHLOGIN2,: "./my_script {} > {.}.out"
cat parallel_*.test parallel_*.out ls parallel_*.test parallel_*.out | LC_ALL=C sort | xargs cat
## Broken since 2013-03-23 ## Broken since 2013-03-23
## rm -rf tmp ## rm -rf tmp

View file

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

View file

@ -10,34 +10,34 @@ echo $SERVER2 >~/.parallel/sshloginfile
echo '### Test --wd newtempdir/newdir/tmp/ with space dirs'; echo '### Test --wd newtempdir/newdir/tmp/ with space dirs';
ssh $SERVER2 rm -rf newtempdir; ssh $SERVER2 rm -rf newtempdir;
stdout parallel -j9 -k --wd newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.6 -S .. -v echo ">"{}.6 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg'; stdout parallel -j9 -k --wd newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.6 -S .. -v echo ">"{}.6 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg';
find . -name '*.6' | sort find . -name '*.6' | LC_ALL=C sort
echo '### Test --wd /tmp/newtempdir/newdir/tmp/ with space dirs'; echo '### Test --wd /tmp/newtempdir/newdir/tmp/ with space dirs';
ssh $SERVER2 rm -rf /tmp/newtempdir; ssh $SERVER2 rm -rf /tmp/newtempdir;
stdout parallel -j9 -k --wd /tmp/newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.7 -S .. -v echo ">"{}.7 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg'; stdout parallel -j9 -k --wd /tmp/newtempdir/newdir/tmp/ --basefile 1-col.txt --trc {}.7 -S .. -v echo ">"{}.7 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg';
find . -name '*.7' | sort find . -name '*.7' | LC_ALL=C sort
echo '### Test --workdir ...' echo '### Test --workdir ...'
parallel -j9 -k --workdir ... --trc {}.1 -S .. echo ">"{}.1 ::: 2-col.txt parallel -j9 -k --workdir ... --trc {}.1 -S .. echo ">"{}.1 ::: 2-col.txt
find . -name '*.1' | sort find . -name '*.1' | LC_ALL=C sort
echo '### Test --wd ...' echo '### Test --wd ...'
parallel -k --wd ... --trc {}.2 -S .. -v echo ">"{}.2 ::: 2-col.txt parallel -k --wd ... --trc {}.2 -S .. -v echo ">"{}.2 ::: 2-col.txt
find . -name '*.2' | sort find . -name '*.2' | LC_ALL=C sort
echo '### Test --wd ... with space dirs' echo '### Test --wd ... with space dirs'
stdout parallel -j9 -k --wd ... --trc {}.3 -S .. -v echo ">"{}.3 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg' stdout parallel -j9 -k --wd ... --trc {}.3 -S .. -v echo ">"{}.3 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg'
# A few rmdir errors are OK as we have multiple files in the same dirs # A few rmdir errors are OK as we have multiple files in the same dirs
find . -name '*.3' | sort find . -name '*.3' | LC_ALL=C sort
echo '### Test --wd tmpdir' echo '### Test --wd tmpdir'
parallel -j9 -k --wd tmpdir --basefile 1-col.txt --trc {}.4 -S .. -v echo ">"{}.4 ::: 2-col.txt parallel -j9 -k --wd tmpdir --basefile 1-col.txt --trc {}.4 -S .. -v echo ">"{}.4 ::: 2-col.txt
find . -name '*.4' | sort find . -name '*.4' | LC_ALL=C sort
echo '### Test --wd /tmp/ with space dirs' echo '### Test --wd /tmp/ with space dirs'
stdout parallel -k -j9 --wd /tmp/ --basefile 1-col.txt --trc {}.5 -S .. -v echo ">"{}.5 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg' stdout parallel -k -j9 --wd /tmp/ --basefile 1-col.txt --trc {}.5 -S .. -v echo ">"{}.5 ::: './ ab/c"d/ef g' ' ab/c"d/efg' ./b/bar ./b/foo "./ ab /c' d/ ef\"g" ./2-col.txt './a b/cd / ef/efg'
# A few rmdir errors are OK as we have multiple files in the same dirs # A few rmdir errors are OK as we have multiple files in the same dirs
find . -name '*.5' | sort find . -name '*.5' | LC_ALL=C sort
cd .. cd ..
rm -rf tmp rm -rf tmp

View file

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

View file

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

View file

@ -3,7 +3,7 @@
SERVER1=parallel-server1 SERVER1=parallel-server1
SERVER2=parallel-server2 SERVER2=parallel-server2
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj10 -k --joblog /tmp/jl-`basename $0` -L1 -r | perl -pe 's/(PARALLEL_PID....)\d+/$1XXXXX/g'
echo '### Test --return of weirdly named file' echo '### Test --return of weirdly named file'
stdout parallel --return {} -vv -S parallel\@$SERVER1 echo '>'{} ::: 'aa<${#}" b' | stdout parallel --return {} -vv -S parallel\@$SERVER1 echo '>'{} ::: 'aa<${#}" b' |
perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z+=/\\0-9]{500,}:base64:i;'; rm 'aa<${#}" b' perl -pe 's/\S*parallel-server\S*/one-server/;s:[a-z+=/\\0-9]{500,}:base64:i;'; rm 'aa<${#}" b'

View file

@ -64,10 +64,9 @@ par_shebang with
par_shebang /usr/bin/perl -w ./shebang-wrap-opt options par_shebang /usr/bin/perl -w ./shebang-wrap-opt options
par_shebang options par_shebang options
par_shellshock_bug par_shellshock_bug 2>&1 par_shellshock_bug par_shellshock_bug 2>&1
par_shellshock_bug bug #43358: shellshock breaks exporting functions using --env _ par_shellshock_bug bug #43358: shellshock breaks exporting functions using --env name
par_shellshock_bug Non-shellshock-hardened to non-shellshock-hardened par_shellshock_bug Non-shellshock-hardened to non-shellshock-hardened
par_shellshock_bug Function non-shellshock-hardened par_shellshock_bug Function non-shellshock-hardened
par_shellshock_bug bug #43358: shellshock breaks exporting functions using --env _ par_shellshock_bug bug #43358: shellshock breaks exporting functions using --env name
par_shellshock_bug Non-shellshock-hardened to shellshock-hardened par_shellshock_bug Non-shellshock-hardened to shellshock-hardened
par_shellshock_bug parallel: Warning: Shell functions may not be supported in /bin/sh.
par_shellshock_bug Function shellshock-hardened par_shellshock_bug Function shellshock-hardened

View file

@ -1,503 +0,0 @@
### Test installation missing pod2*
make[0]: Entering directory '~/privat/parallel'
make dist-gzip am__post_remove_distdir='@:'
make[0]: Entering directory '~/privat/parallel'
if test -d "parallel-00000000"; then find "parallel-00000000" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "parallel-00000000" || { sleep 5 && rm -rf "parallel-00000000"; }; else :; fi
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 '~/privat/parallel/src'
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_design.pod > ./parallel_design.7n \
&& mv ./parallel_design.7n ./parallel_design.7 \
|| echo "Warning: pod2man not found. Using old parallel_design.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_design.7
make[0]: Leaving directory '~/privat/parallel/src'
test -n "" \
|| find "parallel-00000000" -type d ! -perm -755 \
-exec chmod u+rwx,go+rx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec /bin/bash ~/privat/parallel/install-sh -c -m a+r {} {} \; \
|| chmod -R a+r "parallel-00000000"
tardir=parallel-00000000 && ${TAR-tar} chof - "$tardir" | GZIP=--best gzip -c >parallel-00000000.tar.gz
make[0]: Leaving directory '~/privat/parallel'
if test -d "parallel-00000000"; then find "parallel-00000000" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "parallel-00000000" || { sleep 5 && rm -rf "parallel-00000000"; }; else :; fi
make[0]: Leaving directory '~/privat/parallel'
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether ln -s works... yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
Making install in src
make[0]: Entering directory '/tmp/parallel-00000000/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
pod2man --release='00000000' --center='parallel' \
--section=1 ./env_parallel.pod > ./env_parallel.1n \
&& mv ./env_parallel.1n ./env_parallel.1 \
|| echo "Warning: pod2man not found. Using old env_parallel.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old env_parallel.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./sem.pod > ./sem.1n \
&& mv ./sem.1n ./sem.1 \
|| echo "Warning: pod2man not found. Using old sem.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old sem.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./sql > ./sql.1n \
&& mv ./sql.1n ./sql.1 \
|| echo "Warning: pod2man not found. Using old sql.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old sql.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./niceload.pod > ./niceload.1n \
&& mv ./niceload.1n ./niceload.1 \
|| echo "Warning: pod2man not found. Using old niceload.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old niceload.1
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_tutorial.pod > ./parallel_tutorial.7n \
&& mv ./parallel_tutorial.7n ./parallel_tutorial.7 \
|| echo "Warning: pod2man not found. Using old parallel_tutorial.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_tutorial.7
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_book.pod > ./parallel_book.7n \
&& mv ./parallel_book.7n ./parallel_book.7 \
|| echo "Warning: pod2man not found. Using old parallel_book.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_book.7
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_design.pod > ./parallel_design.7n \
&& mv ./parallel_design.7n ./parallel_design.7 \
|| echo "Warning: pod2man not found. Using old parallel_design.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_design.7
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_alternatives.pod > ./parallel_alternatives.7n \
&& mv ./parallel_alternatives.7n ./parallel_alternatives.7 \
|| echo "Warning: pod2man not found. Using old parallel_alternatives.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_alternatives.7
pod2man --release='00000000' --center='parallel' \
--section=1 ./parcat.pod > ./parcat.1n \
&& mv ./parcat.1n ./parcat.1 \
|| echo "Warning: pod2man not found. Using old parcat.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parcat.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./parset.pod > ./parset.1n \
&& mv ./parset.1n ./parset.1 \
|| echo "Warning: pod2man not found. Using old parset.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parset.1
pod2html --title "GNU Parallel" ./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*
pod2html --title "GNU Parallel with environment" ./env_parallel.pod > ./env_parallel.htmln \
&& mv ./env_parallel.htmln ./env_parallel.html \
|| echo "Warning: pod2html not found. Using old env_parallel.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old env_parallel.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel tutorial" ./parallel_tutorial.pod > ./parallel_tutorial.htmln \
&& mv ./parallel_tutorial.htmln ./parallel_tutorial.html \
|| echo "Warning: pod2html not found. Using old parallel_tutorial.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_tutorial.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel book" ./parallel_book.pod > ./parallel_book.htmln \
&& mv ./parallel_book.htmln ./parallel_book.html \
|| echo "Warning: pod2html not found. Using old parallel_book.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_book.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel design" ./parallel_design.pod > ./parallel_design.htmln \
&& mv ./parallel_design.htmln ./parallel_design.html \
|| echo "Warning: pod2html not found. Using old parallel_design.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_design.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel alternatives" ./parallel_alternatives.pod > ./parallel_alternatives.htmln \
&& mv ./parallel_alternatives.htmln ./parallel_alternatives.html \
|| echo "Warning: pod2html not found. Using old parallel_alternatives.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_alternatives.html
rm -f ./pod2htm*
pod2html --title "sem (GNU Parallel)" ./sem.pod > ./sem.htmln \
&& mv ./sem.htmln ./sem.html \
|| echo "Warning: pod2html not found. Using old sem.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sem.html
rm -f ./pod2htm*
pod2html --title "GNU SQL" ./sql > ./sql.htmln \
&& mv ./sql.htmln ./sql.html \
|| echo "Warning: pod2html not found. Using old sql.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sql.html
rm -f ./pod2htm*
pod2html --title "GNU niceload" ./niceload.pod > ./niceload.htmln \
&& mv ./niceload.htmln ./niceload.html \
|| echo "Warning: pod2html not found. Using old niceload.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old niceload.html
rm -f ./pod2htm*
pod2html --title "GNU parcat" ./parcat.pod > ./parcat.htmln \
&& mv ./parcat.htmln ./parcat.html \
|| echo "Warning: pod2html not found. Using old parcat.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parcat.html
rm -f ./pod2htm*
pod2html --title "GNU parset" ./parset.pod > ./parset.htmln \
&& mv ./parset.htmln ./parset.html \
|| echo "Warning: pod2html not found. Using old parset.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parset.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
pod2texi --output=./env_parallel.texi ./env_parallel.pod \
|| echo "Warning: pod2texi not found. Using old env_parallel.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old env_parallel.texi
pod2texi --output=./sem.texi ./sem.pod \
|| echo "Warning: pod2texi not found. Using old sem.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old sem.texi
pod2texi --output=./sql.texi ./sql \
|| echo "Warning: pod2texi not found. Using old sql.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old sql.texi
pod2texi --output=./niceload.texi ./niceload.pod \
|| echo "Warning: pod2texi not found. Using old niceload.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old niceload.texi
pod2texi --output=./parallel_tutorial.texi ./parallel_tutorial.pod \
|| echo "Warning: pod2texi not found. Using old parallel_tutorial.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_tutorial.texi
pod2texi --output=./parallel_book.texi ./parallel_book.pod \
|| echo "Warning: pod2texi not found. Using old parallel_book.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_book.texi
pod2texi --output=./parallel_design.texi ./parallel_design.pod \
|| echo "Warning: pod2texi not found. Using old parallel_design.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_design.texi
pod2texi --output=./parallel_alternatives.texi ./parallel_alternatives.pod \
|| echo "Warning: pod2texi not found. Using old parallel_alternatives.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_alternatives.texi
pod2texi --output=./parcat.texi ./parcat.pod \
|| echo "Warning: pod2texi not found. Using old parcat.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parcat.texi
pod2texi --output=./parset.texi ./parset.pod \
|| echo "Warning: pod2texi not found. Using old parset.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parset.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
pod2pdf --output-file ./env_parallel.pdf ./env_parallel.pod --title "GNU Parallel with environment" \
|| echo "Warning: pod2pdf not found. Using old env_parallel.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old env_parallel.pdf
pod2pdf --output-file ./sem.pdf ./sem.pod --title "GNU sem" \
|| echo "Warning: pod2pdf not found. Using old sem.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old sem.pdf
pod2pdf --output-file ./sql.pdf ./sql --title "GNU SQL" \
|| echo "Warning: pod2pdf not found. Using old sql.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old sql.pdf
pod2pdf --output-file ./niceload.pdf ./niceload.pod --title "GNU niceload" \
|| echo "Warning: pod2pdf not found. Using old niceload.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old niceload.pdf
pod2pdf --output-file ./parallel_tutorial.pdf ./parallel_tutorial.pod --title "GNU Parallel Tutorial" \
|| echo "Warning: pod2pdf not found. Using old parallel_tutorial.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_tutorial.pdf
pod2pdf --output-file ./parallel_book.pdf ./parallel_book.pod --title "GNU Parallel Book" \
|| echo "Warning: pod2pdf not found. Using old parallel_book.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_book.pdf
pod2pdf --output-file ./parallel_design.pdf ./parallel_design.pod --title "GNU Parallel Design" \
|| echo "Warning: pod2pdf not found. Using old parallel_design.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_design.pdf
pod2pdf --output-file ./parallel_alternatives.pdf ./parallel_alternatives.pod --title "GNU Parallel alternatives" \
|| echo "Warning: pod2pdf not found. Using old parallel_alternatives.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_alternatives.pdf
pod2pdf --output-file ./parcat.pdf ./parcat.pod --title "GNU parcat" \
|| echo "Warning: pod2pdf not found. Using old parcat.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parcat.pdf
pod2pdf --output-file ./parset.pdf ./parset.pod --title "GNU parset" \
|| echo "Warning: pod2pdf not found. Using old parset.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parset.pdf
make[0]: Entering directory '/tmp/parallel-00000000/src'
/bin/mkdir -p '/usr/local/bin'
/usr/bin/install -c parallel sql niceload parcat parset env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/usr/local/bin'
make install-exec-hook
make[0]: Entering directory '/tmp/parallel-00000000/src'
rm /usr/local/bin/sem || true
ln -s parallel /usr/local/bin/sem
make[0]: Leaving directory '/tmp/parallel-00000000/src'
pod2html --title "GNU Parallel" ./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*
pod2html --title "GNU Parallel with environment" ./env_parallel.pod > ./env_parallel.htmln \
&& mv ./env_parallel.htmln ./env_parallel.html \
|| echo "Warning: pod2html not found. Using old env_parallel.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old env_parallel.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel tutorial" ./parallel_tutorial.pod > ./parallel_tutorial.htmln \
&& mv ./parallel_tutorial.htmln ./parallel_tutorial.html \
|| echo "Warning: pod2html not found. Using old parallel_tutorial.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_tutorial.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel book" ./parallel_book.pod > ./parallel_book.htmln \
&& mv ./parallel_book.htmln ./parallel_book.html \
|| echo "Warning: pod2html not found. Using old parallel_book.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_book.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel design" ./parallel_design.pod > ./parallel_design.htmln \
&& mv ./parallel_design.htmln ./parallel_design.html \
|| echo "Warning: pod2html not found. Using old parallel_design.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_design.html
rm -f ./pod2htm*
pod2html --title "GNU Parallel alternatives" ./parallel_alternatives.pod > ./parallel_alternatives.htmln \
&& mv ./parallel_alternatives.htmln ./parallel_alternatives.html \
|| echo "Warning: pod2html not found. Using old parallel_alternatives.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parallel_alternatives.html
rm -f ./pod2htm*
pod2html --title "sem (GNU Parallel)" ./sem.pod > ./sem.htmln \
&& mv ./sem.htmln ./sem.html \
|| echo "Warning: pod2html not found. Using old sem.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sem.html
rm -f ./pod2htm*
pod2html --title "GNU SQL" ./sql > ./sql.htmln \
&& mv ./sql.htmln ./sql.html \
|| echo "Warning: pod2html not found. Using old sql.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old sql.html
rm -f ./pod2htm*
pod2html --title "GNU niceload" ./niceload.pod > ./niceload.htmln \
&& mv ./niceload.htmln ./niceload.html \
|| echo "Warning: pod2html not found. Using old niceload.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old niceload.html
rm -f ./pod2htm*
pod2html --title "GNU parcat" ./parcat.pod > ./parcat.htmln \
&& mv ./parcat.htmln ./parcat.html \
|| echo "Warning: pod2html not found. Using old parcat.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parcat.html
rm -f ./pod2htm*
pod2html --title "GNU parset" ./parset.pod > ./parset.htmln \
&& mv ./parset.htmln ./parset.html \
|| echo "Warning: pod2html not found. Using old parset.html"
/bin/bash: pod2html: command not found
Warning: pod2html not found. Using old parset.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
pod2texi --output=./env_parallel.texi ./env_parallel.pod \
|| echo "Warning: pod2texi not found. Using old env_parallel.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old env_parallel.texi
pod2texi --output=./sem.texi ./sem.pod \
|| echo "Warning: pod2texi not found. Using old sem.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old sem.texi
pod2texi --output=./sql.texi ./sql \
|| echo "Warning: pod2texi not found. Using old sql.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old sql.texi
pod2texi --output=./niceload.texi ./niceload.pod \
|| echo "Warning: pod2texi not found. Using old niceload.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old niceload.texi
pod2texi --output=./parallel_tutorial.texi ./parallel_tutorial.pod \
|| echo "Warning: pod2texi not found. Using old parallel_tutorial.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_tutorial.texi
pod2texi --output=./parallel_book.texi ./parallel_book.pod \
|| echo "Warning: pod2texi not found. Using old parallel_book.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_book.texi
pod2texi --output=./parallel_design.texi ./parallel_design.pod \
|| echo "Warning: pod2texi not found. Using old parallel_design.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_design.texi
pod2texi --output=./parallel_alternatives.texi ./parallel_alternatives.pod \
|| echo "Warning: pod2texi not found. Using old parallel_alternatives.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parallel_alternatives.texi
pod2texi --output=./parcat.texi ./parcat.pod \
|| echo "Warning: pod2texi not found. Using old parcat.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parcat.texi
pod2texi --output=./parset.texi ./parset.pod \
|| echo "Warning: pod2texi not found. Using old parset.texi"
/bin/bash: pod2texi: command not found
Warning: pod2texi not found. Using old parset.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
pod2pdf --output-file ./env_parallel.pdf ./env_parallel.pod --title "GNU Parallel with environment" \
|| echo "Warning: pod2pdf not found. Using old env_parallel.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old env_parallel.pdf
pod2pdf --output-file ./sem.pdf ./sem.pod --title "GNU sem" \
|| echo "Warning: pod2pdf not found. Using old sem.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old sem.pdf
pod2pdf --output-file ./sql.pdf ./sql --title "GNU SQL" \
|| echo "Warning: pod2pdf not found. Using old sql.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old sql.pdf
pod2pdf --output-file ./niceload.pdf ./niceload.pod --title "GNU niceload" \
|| echo "Warning: pod2pdf not found. Using old niceload.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old niceload.pdf
pod2pdf --output-file ./parallel_tutorial.pdf ./parallel_tutorial.pod --title "GNU Parallel Tutorial" \
|| echo "Warning: pod2pdf not found. Using old parallel_tutorial.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_tutorial.pdf
pod2pdf --output-file ./parallel_book.pdf ./parallel_book.pod --title "GNU Parallel Book" \
|| echo "Warning: pod2pdf not found. Using old parallel_book.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_book.pdf
pod2pdf --output-file ./parallel_design.pdf ./parallel_design.pod --title "GNU Parallel Design" \
|| echo "Warning: pod2pdf not found. Using old parallel_design.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_design.pdf
pod2pdf --output-file ./parallel_alternatives.pdf ./parallel_alternatives.pod --title "GNU Parallel alternatives" \
|| echo "Warning: pod2pdf not found. Using old parallel_alternatives.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parallel_alternatives.pdf
pod2pdf --output-file ./parcat.pdf ./parcat.pod --title "GNU parcat" \
|| echo "Warning: pod2pdf not found. Using old parcat.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parcat.pdf
pod2pdf --output-file ./parset.pdf ./parset.pod --title "GNU parset" \
|| echo "Warning: pod2pdf not found. Using old parset.pdf"
/bin/bash: pod2pdf: command not found
Warning: pod2pdf not found. Using old parset.pdf
/bin/mkdir -p '/usr/local/share/doc/parallel'
/usr/bin/install -c -m 644 parallel.html env_parallel.html sem.html sql.html niceload.html parallel_tutorial.html parallel_book.html parallel_design.html parallel_alternatives.html parcat.html parset.html parallel.texi env_parallel.texi sem.texi sql.texi niceload.texi parallel_tutorial.texi parallel_book.texi parallel_design.texi parallel_alternatives.texi parcat.texi parset.texi parallel.pdf env_parallel.pdf sem.pdf sql.pdf niceload.pdf parallel_tutorial.pdf parallel_book.pdf parallel_design.pdf parallel_alternatives.pdf parcat.pdf parset.pdf '/usr/local/share/doc/parallel'
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
pod2man --release='00000000' --center='parallel' \
--section=1 ./env_parallel.pod > ./env_parallel.1n \
&& mv ./env_parallel.1n ./env_parallel.1 \
|| echo "Warning: pod2man not found. Using old env_parallel.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old env_parallel.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./sem.pod > ./sem.1n \
&& mv ./sem.1n ./sem.1 \
|| echo "Warning: pod2man not found. Using old sem.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old sem.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./sql > ./sql.1n \
&& mv ./sql.1n ./sql.1 \
|| echo "Warning: pod2man not found. Using old sql.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old sql.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./niceload.pod > ./niceload.1n \
&& mv ./niceload.1n ./niceload.1 \
|| echo "Warning: pod2man not found. Using old niceload.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old niceload.1
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_tutorial.pod > ./parallel_tutorial.7n \
&& mv ./parallel_tutorial.7n ./parallel_tutorial.7 \
|| echo "Warning: pod2man not found. Using old parallel_tutorial.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_tutorial.7
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_book.pod > ./parallel_book.7n \
&& mv ./parallel_book.7n ./parallel_book.7 \
|| echo "Warning: pod2man not found. Using old parallel_book.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_book.7
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_design.pod > ./parallel_design.7n \
&& mv ./parallel_design.7n ./parallel_design.7 \
|| echo "Warning: pod2man not found. Using old parallel_design.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_design.7
pod2man --release='00000000' --center='parallel' \
--section=7 ./parallel_alternatives.pod > ./parallel_alternatives.7n \
&& mv ./parallel_alternatives.7n ./parallel_alternatives.7 \
|| echo "Warning: pod2man not found. Using old parallel_alternatives.7"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parallel_alternatives.7
pod2man --release='00000000' --center='parallel' \
--section=1 ./parcat.pod > ./parcat.1n \
&& mv ./parcat.1n ./parcat.1 \
|| echo "Warning: pod2man not found. Using old parcat.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parcat.1
pod2man --release='00000000' --center='parallel' \
--section=1 ./parset.pod > ./parset.1n \
&& mv ./parset.1n ./parset.1 \
|| echo "Warning: pod2man not found. Using old parset.1"
/bin/bash: pod2man: command not found
Warning: pod2man not found. Using old parset.1
/bin/mkdir -p '/usr/local/share/man/man1'
/usr/bin/install -c -m 644 parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 parcat.1 parset.1 '/usr/local/share/man/man1'
/bin/mkdir -p '/usr/local/share/man/man7'
/usr/bin/install -c -m 644 parallel_tutorial.7 parallel_book.7 parallel_design.7 parallel_alternatives.7 '/usr/local/share/man/man7'
make[0]: Leaving directory '/tmp/parallel-00000000/src'
make[0]: Leaving directory '/tmp/parallel-00000000/src'
make[0]: Entering directory '/tmp/parallel-00000000'
make[0]: Entering directory '/tmp/parallel-00000000'
make[0]: Nothing to be done for 'install-exec-am'.
make[0]: Nothing to be done for 'install-data-am'.
make[0]: Leaving directory '/tmp/parallel-00000000'
make[0]: Leaving directory '/tmp/parallel-00000000'

View file

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

View file

@ -6,182 +6,182 @@ par_exit_code # but fish 2.4.0 returns 1 while X.X.X returns 0
par_exit_code ash /tmp/mysleep 100 137 par_exit_code ash /tmp/mysleep 100 137
par_exit_code ash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code ash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code ash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code ash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code ash parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code ash parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code ash parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code ash parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code ash true;/tmp/mysleep 100 137 par_exit_code ash true;/tmp/mysleep 100 137
par_exit_code ash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code ash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code ash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code ash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code ash parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code ash parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code ash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code ash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code bash /tmp/mysleep 100 0 par_exit_code bash /tmp/mysleep 100 0
par_exit_code bash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code bash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code bash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code bash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code bash parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code bash parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code bash parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code bash parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code bash true;/tmp/mysleep 100 137 par_exit_code bash true;/tmp/mysleep 100 137
par_exit_code bash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code bash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code bash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code bash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code bash parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code bash parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code bash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code bash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code csh /tmp/mysleep 100 137 par_exit_code csh /tmp/mysleep 100 137
par_exit_code csh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code csh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code csh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code csh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code csh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code csh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code csh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code csh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code csh true;/tmp/mysleep 100 137 par_exit_code csh true;/tmp/mysleep 100 137
par_exit_code csh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code csh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code csh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code csh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code csh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code csh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code csh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code csh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code dash /tmp/mysleep 100 137 par_exit_code dash /tmp/mysleep 100 137
par_exit_code dash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code dash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code dash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code dash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code dash parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code dash parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code dash parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code dash parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code dash true;/tmp/mysleep 100 137 par_exit_code dash true;/tmp/mysleep 100 137
par_exit_code dash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code dash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code dash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code dash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code dash parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code dash parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code dash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code dash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code fish /tmp/mysleep 100 137 par_exit_code fish /tmp/mysleep 100 137
par_exit_code fish parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code fish parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code fish parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code fish parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code fish parallel --halt-on-error now,done=1 true ::: 100 1 par_exit_code fish parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code fish parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code fish parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code fish true;/tmp/mysleep 100 137 par_exit_code fish true;/tmp/mysleep 100 137
par_exit_code fish parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code fish parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code fish parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code fish parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code fish parallel --halt-on-error now,done=1 "true;true" ::: 100 1 par_exit_code fish parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code fish parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code fish parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code mksh /tmp/mysleep 100 0 par_exit_code mksh /tmp/mysleep 100 0
par_exit_code mksh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code mksh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code mksh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code mksh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code mksh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code mksh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code mksh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code mksh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code mksh true;/tmp/mysleep 100 137 par_exit_code mksh true;/tmp/mysleep 100 137
par_exit_code mksh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code mksh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code mksh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code mksh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code mksh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code mksh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code mksh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code mksh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code posh /tmp/mysleep 100 137 par_exit_code posh /tmp/mysleep 100 137
par_exit_code posh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code posh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code posh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code posh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code posh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code posh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code posh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code posh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code posh true;/tmp/mysleep 100 137 par_exit_code posh true;/tmp/mysleep 100 137
par_exit_code posh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code posh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code posh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code posh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code posh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code posh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code posh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code posh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code rc /tmp/mysleep 100 1 par_exit_code rc /tmp/mysleep 100 1
par_exit_code rc parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 1 par_exit_code rc parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 1
par_exit_code rc parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 1 par_exit_code rc parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 1
par_exit_code rc parallel --halt-on-error now,done=1 true ::: 100 1 par_exit_code rc parallel --halt-on-error now,done=1 /bin/true ::: 100 1
par_exit_code rc parallel --halt-on-error now,done=1 exit ::: 100 1 par_exit_code rc parallel --halt-on-error now,done=1 exit ::: 100 1
par_exit_code rc true;/tmp/mysleep 100 1 par_exit_code rc true;/tmp/mysleep 100 1
par_exit_code rc parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 1 par_exit_code rc parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 1
par_exit_code rc parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 1 par_exit_code rc parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 1
par_exit_code rc parallel --halt-on-error now,done=1 "true;true" ::: 100 1 par_exit_code rc parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 1
par_exit_code rc parallel --halt-on-error now,done=1 "true;exit" ::: 100 1 par_exit_code rc parallel --halt-on-error now,done=1 "true;exit" ::: 100 1
par_exit_code sash /tmp/mysleep 100 255 par_exit_code sash /tmp/mysleep 100 255
par_exit_code sash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 255 par_exit_code sash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 255
par_exit_code sash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 255 par_exit_code sash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 255
par_exit_code sash parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code sash parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code sash parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code sash parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code sash true;/tmp/mysleep 100 0 par_exit_code sash true;/tmp/mysleep 100 0
par_exit_code sash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 0 par_exit_code sash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 0
par_exit_code sash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 0 par_exit_code sash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 0
par_exit_code sash parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code sash parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code sash parallel --halt-on-error now,done=1 "true;exit" ::: 100 0 par_exit_code sash parallel --halt-on-error now,done=1 "true;exit" ::: 100 0
par_exit_code sh /tmp/mysleep 100 137 par_exit_code sh /tmp/mysleep 100 137
par_exit_code sh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code sh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code sh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code sh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code sh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code sh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code sh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code sh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code sh true;/tmp/mysleep 100 137 par_exit_code sh true;/tmp/mysleep 100 137
par_exit_code sh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code sh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code sh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code sh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code sh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code sh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code sh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code sh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code static-sh /tmp/mysleep 100 137 par_exit_code static-sh /tmp/mysleep 100 137
par_exit_code static-sh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code static-sh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code static-sh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code static-sh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code static-sh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code static-sh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code static-sh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code static-sh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code static-sh true;/tmp/mysleep 100 137 par_exit_code static-sh true;/tmp/mysleep 100 137
par_exit_code static-sh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code static-sh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code static-sh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code static-sh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code static-sh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code static-sh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code static-sh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code static-sh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code tcsh /tmp/mysleep 100 137 par_exit_code tcsh /tmp/mysleep 100 137
par_exit_code tcsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code tcsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code tcsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code tcsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code tcsh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code tcsh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code tcsh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code tcsh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code tcsh true;/tmp/mysleep 100 137 par_exit_code tcsh true;/tmp/mysleep 100 137
par_exit_code tcsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code tcsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code tcsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code tcsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code tcsh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code tcsh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code tcsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code tcsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code fdsh /tmp/mysleep 100 137 par_exit_code fdsh /tmp/mysleep 100 137
par_exit_code fdsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 2 par_exit_code fdsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 2
par_exit_code fdsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 2 par_exit_code fdsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 2
par_exit_code fdsh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code fdsh parallel --halt-on-error now,done=1 /bin/true ::: 100 2
par_exit_code fdsh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code fdsh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code fdsh true;/tmp/mysleep 100 137 par_exit_code fdsh true;/tmp/mysleep 100 137
par_exit_code fdsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 2 par_exit_code fdsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 2
par_exit_code fdsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 2 par_exit_code fdsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 2
par_exit_code fdsh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code fdsh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 2
par_exit_code fdsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code fdsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code fizsh /tmp/mysleep 100 137 par_exit_code fizsh /tmp/mysleep 100 137
par_exit_code fizsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code fizsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code fizsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code fizsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code fizsh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code fizsh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code fizsh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code fizsh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code fizsh true;/tmp/mysleep 100 137 par_exit_code fizsh true;/tmp/mysleep 100 137
par_exit_code fizsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code fizsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code fizsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code fizsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code fizsh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code fizsh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code fizsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code fizsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code ksh /tmp/mysleep 100 0 par_exit_code ksh /tmp/mysleep 100 0
par_exit_code ksh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code ksh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code ksh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code ksh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code ksh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code ksh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code ksh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code ksh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code ksh true;/tmp/mysleep 100 0 par_exit_code ksh true;/tmp/mysleep 100 0
par_exit_code ksh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code ksh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code ksh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code ksh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code ksh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code ksh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code ksh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code ksh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code ksh93 /tmp/mysleep 100 0 par_exit_code ksh93 /tmp/mysleep 100 0
par_exit_code ksh93 parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code ksh93 parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code ksh93 parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code ksh93 parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code ksh93 parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code ksh93 parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code ksh93 parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code ksh93 parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code ksh93 true;/tmp/mysleep 100 0 par_exit_code ksh93 true;/tmp/mysleep 100 0
par_exit_code ksh93 parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code ksh93 parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code ksh93 parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code ksh93 parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code ksh93 parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code ksh93 parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code ksh93 parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code ksh93 parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code yash /tmp/mysleep 100 0 par_exit_code yash /tmp/mysleep 100 0
par_exit_code yash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code yash parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code yash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code yash parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code yash parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code yash parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code yash parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code yash parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code yash true;/tmp/mysleep 100 0 par_exit_code yash true;/tmp/mysleep 100 0
par_exit_code yash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code yash parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code yash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code yash parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code yash parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code yash parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code yash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code yash parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code zsh /tmp/mysleep 100 0 par_exit_code zsh /tmp/mysleep 100 0
par_exit_code zsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137 par_exit_code zsh parallel --halt-on-error now,fail=1 /tmp/mysleep ::: 100 137
par_exit_code zsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137 par_exit_code zsh parallel --halt-on-error now,done=1 /tmp/mysleep ::: 100 137
par_exit_code zsh parallel --halt-on-error now,done=1 true ::: 100 0 par_exit_code zsh parallel --halt-on-error now,done=1 /bin/true ::: 100 0
par_exit_code zsh parallel --halt-on-error now,done=1 exit ::: 100 100 par_exit_code zsh parallel --halt-on-error now,done=1 exit ::: 100 100
par_exit_code zsh true;/tmp/mysleep 100 0 par_exit_code zsh true;/tmp/mysleep 100 0
par_exit_code zsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code zsh parallel --halt-on-error now,fail=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code zsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137 par_exit_code zsh parallel --halt-on-error now,done=1 "true;/tmp/mysleep" ::: 100 137
par_exit_code zsh parallel --halt-on-error now,done=1 "true;true" ::: 100 0 par_exit_code zsh parallel --halt-on-error now,done=1 "true;/bin/true" ::: 100 0
par_exit_code zsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100 par_exit_code zsh parallel --halt-on-error now,done=1 "true;exit" ::: 100 100
par_exit_code parallel: This job finished: par_exit_code parallel: This job finished:
par_exit_code runit par_exit_code runit
@ -380,7 +380,7 @@ par_test_build_and_install ! -type d ! -perm -444 -links 1 -exec chmod a+r {}
par_test_build_and_install ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ par_test_build_and_install ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
par_test_build_and_install ! -type d ! -perm -444 -exec /bin/bash ~/privat/parallel/install-sh -c -m a+r {} {} \; \ par_test_build_and_install ! -type d ! -perm -444 -exec /bin/bash ~/privat/parallel/install-sh -c -m a+r {} {} \; \
par_test_build_and_install || chmod -R a+r "parallel-00000000" par_test_build_and_install || chmod -R a+r "parallel-00000000"
par_test_build_and_install tardir=parallel-00000000 && ${TAR-tar} chof - "$tardir" | GZIP=--best gzip -c >parallel-00000000.tar.gz par_test_build_and_install tardir=parallel-00000000 && ${TAR-tar} chof - "$tardir" | eval GZIP= gzip --best -c >parallel-00000000.tar.gz
par_test_build_and_install make[0]: Leaving directory '~/privat/parallel' par_test_build_and_install make[0]: Leaving directory '~/privat/parallel'
par_test_build_and_install if test -d "parallel-00000000"; then find "parallel-00000000" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "parallel-00000000" || { sleep 5 && rm -rf "parallel-00000000"; }; else :; fi par_test_build_and_install if test -d "parallel-00000000"; then find "parallel-00000000" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -rf "parallel-00000000" || { sleep 5 && rm -rf "parallel-00000000"; }; else :; fi
par_test_build_and_install make[0]: Leaving directory '~/privat/parallel' par_test_build_and_install make[0]: Leaving directory '~/privat/parallel'

View file

@ -27,8 +27,8 @@ par_interactive sleep 0.1; echo opt-p 2 ?...n
par_interactive sleep 0.1; echo opt-p 3 ?...y par_interactive sleep 0.1; echo opt-p 3 ?...y
par_interactive spawn /tmp/parallel-script-for-expect par_interactive spawn /tmp/parallel-script-for-expect
par_k ### Test -k par_k ### Test -k
par_k parallel: Warning: Only enough file handles to run 9 jobs in parallel. par_k parallel: Warning: Only enough file handles to run 8 jobs in parallel.
par_k parallel: Warning: Running 'parallel -j0 -N 9 --pipe parallel -j0' or par_k parallel: Warning: Running 'parallel -j0 -N 8 --pipe parallel -j0' or
par_k parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf par_k parallel: Warning: raising 'ulimit -n' or 'nofile' in /etc/security/limits.conf
par_k parallel: Warning: or /proc/sys/fs/file-max may help. par_k parallel: Warning: or /proc/sys/fs/file-max may help.
par_k begin par_k begin
@ -243,22 +243,9 @@ par_kill_children_timeout 0 0 0
par_line_buffer ### --line-buffer par_line_buffer ### --line-buffer
par_line_buffer 55 55 120 par_line_buffer 55 55 120
par_line_buffer These must diff: 1 par_line_buffer These must diff: 1
par_linebuffer_tag_slow_output Test output tag with mixing halflines
par_linebuffer_tag_slow_output a aH
par_linebuffer_tag_slow_output b bH
par_linebuffer_tag_slow_output a aa
par_linebuffer_tag_slow_output b ba
par_linebuffer_tag_slow_output a al
par_linebuffer_tag_slow_output b bl
par_linebuffer_tag_slow_output a af
par_linebuffer_tag_slow_output b bf
par_linebuffer_tag_slow_output a a
par_linebuffer_tag_slow_output a
par_linebuffer_tag_slow_output b b
par_linebuffer_tag_slow_output b
par_long_line_remote ### Deal with long command lines on remote servers par_long_line_remote ### Deal with long command lines on remote servers
par_long_line_remote 2 6 30006 par_long_line_remote 2 6 30006
par_long_line_remote 2 50 250050 par_long_line_remote 3 50 250050
par_maxlinelen_X_I ### Test max line length -X -I par_maxlinelen_X_I ### Test max line length -X -I
par_maxlinelen_X_I 3cfc69ee81b0fe7fdbe8eb059ad2da61 - par_maxlinelen_X_I 3cfc69ee81b0fe7fdbe8eb059ad2da61 -
par_maxlinelen_X_I Chars per line (817788/7): 116826 par_maxlinelen_X_I Chars per line (817788/7): 116826
@ -338,10 +325,10 @@ par_results_compress 0
par_results_compress 1 par_results_compress 1
par_results_csv bug #: --results csv par_results_csv bug #: --results csv
par_results_csv --header : --tag --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr par_results_csv --header : --tag --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr
par_results_csv --header : --tag --files --compress 1,:,999.999,999.999,0,31,0,0,"echo 22 11",22,11,"22 11 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --header : --tag --files --compress 1,:,999.999,999.999,0,15,0,0,"echo 22 11",22,11,"22 11 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --header : --tag --files --compress 2,:,999.999,999.999,0,31,0,0,"echo 22 12",22,12,"22 12 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --header : --tag --files --compress 2,:,999.999,999.999,0,15,0,0,"echo 22 12",22,12,"22 12 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --header : --tag --files --compress 3,:,999.999,999.999,0,31,0,0,"echo 23 11",23,11,"23 11 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --header : --tag --files --compress 3,:,999.999,999.999,0,15,0,0,"echo 23 11",23,11,"23 11 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --header : --tag --files --compress 4,:,999.999,999.999,0,31,0,0,"echo 23 12",23,12,"23 12 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --header : --tag --files --compress 4,:,999.999,999.999,0,15,0,0,"echo 23 12",23,12,"23 12 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --header : --tag --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr par_results_csv --header : --tag --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr
par_results_csv --header : --tag --files 1,:,999.999,999.999,0,6,0,0,"echo 22 11",22,11,"22 11 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --header : --tag --files 1,:,999.999,999.999,0,6,0,0,"echo 22 11",22,11,"22 11 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --header : --tag --files 2,:,999.999,999.999,0,6,0,0,"echo 22 12",22,12,"22 12 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --header : --tag --files 2,:,999.999,999.999,0,6,0,0,"echo 22 12",22,12,"22 12 /tmp/parallel-local-10s-tmpdir/tmpfile",
@ -366,10 +353,10 @@ par_results_csv --header : --tag ",
par_results_csv --header : --tag 4,:,999.999,999.999,0,6,0,0,"echo 23 12",23,12,"23 12 23 12 par_results_csv --header : --tag 4,:,999.999,999.999,0,6,0,0,"echo 23 12",23,12,"23 12 23 12
par_results_csv --header : --tag ", par_results_csv --header : --tag ",
par_results_csv --header : --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr par_results_csv --header : --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr
par_results_csv --header : --files --compress 1,:,999.999,999.999,0,31,0,0,"echo 22 11",22,11,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --header : --files --compress 1,:,999.999,999.999,0,15,0,0,"echo 22 11",22,11,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --header : --files --compress 2,:,999.999,999.999,0,31,0,0,"echo 22 12",22,12,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --header : --files --compress 2,:,999.999,999.999,0,15,0,0,"echo 22 12",22,12,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --header : --files --compress 3,:,999.999,999.999,0,31,0,0,"echo 23 11",23,11,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --header : --files --compress 3,:,999.999,999.999,0,15,0,0,"echo 23 11",23,11,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --header : --files --compress 4,:,999.999,999.999,0,31,0,0,"echo 23 12",23,12,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --header : --files --compress 4,:,999.999,999.999,0,15,0,0,"echo 23 12",23,12,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --header : --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr par_results_csv --header : --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,H2,H1,Stdout,Stderr
par_results_csv --header : --files 1,:,999.999,999.999,0,6,0,0,"echo 22 11",22,11,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --header : --files 1,:,999.999,999.999,0,6,0,0,"echo 22 11",22,11,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --header : --files 2,:,999.999,999.999,0,6,0,0,"echo 22 12",22,12,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --header : --files 2,:,999.999,999.999,0,6,0,0,"echo 22 12",22,12,/tmp/parallel-local-10s-tmpdir/tmpfile,
@ -394,15 +381,15 @@ par_results_csv --header : ",
par_results_csv --header : 4,:,999.999,999.999,0,6,0,0,"echo 23 12",23,12,"23 12 par_results_csv --header : 4,:,999.999,999.999,0,6,0,0,"echo 23 12",23,12,"23 12
par_results_csv --header : ", par_results_csv --header : ",
par_results_csv --tag --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr par_results_csv --tag --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr
par_results_csv --tag --files --compress 1,:,999.999,999.999,0,31,0,0,"echo H2 H1",H2,H1,"H2 H1 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 1,:,999.999,999.999,0,15,0,0,"echo H2 H1",H2,H1,"H2 H1 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 2,:,999.999,999.999,0,31,0,0,"echo H2 11",H2,11,"H2 11 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 2,:,999.999,999.999,0,15,0,0,"echo H2 11",H2,11,"H2 11 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 3,:,999.999,999.999,0,31,0,0,"echo H2 12",H2,12,"H2 12 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 3,:,999.999,999.999,0,15,0,0,"echo H2 12",H2,12,"H2 12 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 4,:,999.999,999.999,0,31,0,0,"echo 22 H1",22,H1,"22 H1 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 4,:,999.999,999.999,0,15,0,0,"echo 22 H1",22,H1,"22 H1 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 5,:,999.999,999.999,0,31,0,0,"echo 22 11",22,11,"22 11 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 5,:,999.999,999.999,0,15,0,0,"echo 22 11",22,11,"22 11 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 6,:,999.999,999.999,0,31,0,0,"echo 22 12",22,12,"22 12 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 6,:,999.999,999.999,0,15,0,0,"echo 22 12",22,12,"22 12 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 7,:,999.999,999.999,0,31,0,0,"echo 23 H1",23,H1,"23 H1 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 7,:,999.999,999.999,0,15,0,0,"echo 23 H1",23,H1,"23 H1 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 8,:,999.999,999.999,0,31,0,0,"echo 23 11",23,11,"23 11 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 8,:,999.999,999.999,0,15,0,0,"echo 23 11",23,11,"23 11 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files --compress 9,:,999.999,999.999,0,31,0,0,"echo 23 12",23,12,"23 12 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files --compress 9,:,999.999,999.999,0,15,0,0,"echo 23 12",23,12,"23 12 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr par_results_csv --tag --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr
par_results_csv --tag --files 1,:,999.999,999.999,0,6,0,0,"echo H2 H1",H2,H1,"H2 H1 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files 1,:,999.999,999.999,0,6,0,0,"echo H2 H1",H2,H1,"H2 H1 /tmp/parallel-local-10s-tmpdir/tmpfile",
par_results_csv --tag --files 2,:,999.999,999.999,0,6,0,0,"echo H2 11",H2,11,"H2 11 /tmp/parallel-local-10s-tmpdir/tmpfile", par_results_csv --tag --files 2,:,999.999,999.999,0,6,0,0,"echo H2 11",H2,11,"H2 11 /tmp/parallel-local-10s-tmpdir/tmpfile",
@ -452,15 +439,15 @@ par_results_csv --tag ",
par_results_csv --tag 9,:,999.999,999.999,0,6,0,0,"echo 23 12",23,12,"23 12 23 12 par_results_csv --tag 9,:,999.999,999.999,0,6,0,0,"echo 23 12",23,12,"23 12 23 12
par_results_csv --tag ", par_results_csv --tag ",
par_results_csv --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr par_results_csv --files --compress Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr
par_results_csv --files --compress 1,:,999.999,999.999,0,31,0,0,"echo H2 H1",H2,H1,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 1,:,999.999,999.999,0,15,0,0,"echo H2 H1",H2,H1,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 2,:,999.999,999.999,0,31,0,0,"echo H2 11",H2,11,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 2,:,999.999,999.999,0,15,0,0,"echo H2 11",H2,11,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 3,:,999.999,999.999,0,31,0,0,"echo H2 12",H2,12,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 3,:,999.999,999.999,0,15,0,0,"echo H2 12",H2,12,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 4,:,999.999,999.999,0,31,0,0,"echo 22 H1",22,H1,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 4,:,999.999,999.999,0,15,0,0,"echo 22 H1",22,H1,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 5,:,999.999,999.999,0,31,0,0,"echo 22 11",22,11,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 5,:,999.999,999.999,0,15,0,0,"echo 22 11",22,11,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 6,:,999.999,999.999,0,31,0,0,"echo 22 12",22,12,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 6,:,999.999,999.999,0,15,0,0,"echo 22 12",22,12,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 7,:,999.999,999.999,0,31,0,0,"echo 23 H1",23,H1,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 7,:,999.999,999.999,0,15,0,0,"echo 23 H1",23,H1,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 8,:,999.999,999.999,0,31,0,0,"echo 23 11",23,11,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 8,:,999.999,999.999,0,15,0,0,"echo 23 11",23,11,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files --compress 9,:,999.999,999.999,0,31,0,0,"echo 23 12",23,12,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files --compress 9,:,999.999,999.999,0,15,0,0,"echo 23 12",23,12,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr par_results_csv --files Seq,Host,Starttime,JobRuntime,Send,Receive,Exitval,Signal,Command,V1,V2,Stdout,Stderr
par_results_csv --files 1,:,999.999,999.999,0,6,0,0,"echo H2 H1",H2,H1,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files 1,:,999.999,999.999,0,6,0,0,"echo H2 H1",H2,H1,/tmp/parallel-local-10s-tmpdir/tmpfile,
par_results_csv --files 2,:,999.999,999.999,0,6,0,0,"echo H2 11",H2,11,/tmp/parallel-local-10s-tmpdir/tmpfile, par_results_csv --files 2,:,999.999,999.999,0,6,0,0,"echo H2 11",H2,11,/tmp/parallel-local-10s-tmpdir/tmpfile,
@ -520,6 +507,22 @@ par_retries_all_fail 7
par_retries_all_fail 8 par_retries_all_fail 8
par_round_robin_blocks bug #49664: --round-robin does not complete par_round_robin_blocks bug #49664: --round-robin does not complete
par_round_robin_blocks 8 par_round_robin_blocks 8
par_sem_2jobs ### Test semaphore 2 jobs running simultaneously
par_sem_2jobs job1a 1
par_sem_2jobs job2a 2
par_sem_2jobs job1b 3
par_sem_2jobs job3a 4
par_sem_2jobs job2b 5
par_sem_2jobs job3b 6
par_sem_2jobs done
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_slow_total_jobs bug #51006: Slow total_jobs() eats job par_slow_total_jobs bug #51006: Slow total_jobs() eats job
par_slow_total_jobs a par_slow_total_jobs a
par_slow_total_jobs b par_slow_total_jobs b
@ -528,9 +531,9 @@ par_slow_total_jobs 2
par_slow_total_jobs parallel: Warning: Reading X arguments took longer than XX seconds. par_slow_total_jobs parallel: Warning: Reading X arguments took longer than XX seconds.
par_sockets_cores_threads ### Test --number-of-sockets/cores/threads par_sockets_cores_threads ### Test --number-of-sockets/cores/threads
par_sockets_cores_threads 1 par_sockets_cores_threads 1
par_sockets_cores_threads 2 par_sockets_cores_threads 4
par_sockets_cores_threads 2 par_sockets_cores_threads 8
par_sockets_cores_threads 2 par_sockets_cores_threads 4
par_sockets_cores_threads ### Test --use-sockets-instead-of-threads par_sockets_cores_threads ### Test --use-sockets-instead-of-threads
par_sockets_cores_threads threads done par_sockets_cores_threads threads done
par_sockets_cores_threads sockets done par_sockets_cores_threads sockets done

View file

@ -619,3 +619,6 @@ par_test_XI_mI a7 b1 2 3 4 5 6 7
par_test_XI_mI a8 b1 2 3 4 5 6 7 8 par_test_XI_mI a8 b1 2 3 4 5 6 7 8
par_test_XI_mI a9 b1 2 3 4 5 6 7 8 9 par_test_XI_mI a9 b1 2 3 4 5 6 7 8 9
par_test_XI_mI a10 b1 2 3 4 5 6 7 8 9 10 par_test_XI_mI a10 b1 2 3 4 5 6 7 8 9 10
par_too_long_line_X bug #54869: Long lines break
par_too_long_line_X 1 29302 131012
par_too_long_line_X 1 12698 63490

View file

@ -251,7 +251,7 @@ par_test_detected_shell test_known_shell_c fizsh Global::shell /usr/bin/zsh
par_test_detected_shell test_known_shell_c ksh Global::shell /usr/bin/ksh par_test_detected_shell test_known_shell_c ksh Global::shell /usr/bin/ksh
par_test_detected_shell test_known_shell_c ksh93 Global::shell /bin/ksh93 par_test_detected_shell test_known_shell_c ksh93 Global::shell /bin/ksh93
par_test_detected_shell test_known_shell_c mksh Global::shell /bin/mksh par_test_detected_shell test_known_shell_c mksh Global::shell /bin/mksh
par_test_detected_shell test_known_shell_c posh Global::shell /bin/posh par_test_detected_shell test_known_shell_c posh Global::shell /usr/bin/posh
par_test_detected_shell test_known_shell_c rbash Global::shell /bin/rbash par_test_detected_shell test_known_shell_c rbash Global::shell /bin/rbash
par_test_detected_shell test_known_shell_c rush Local configuration error occurred. par_test_detected_shell test_known_shell_c rush Local configuration error occurred.
par_test_detected_shell test_known_shell_c rush Contact the systems administrator for further assistance. par_test_detected_shell test_known_shell_c rush Contact the systems administrator for further assistance.
@ -267,11 +267,11 @@ par_test_detected_shell test_known_shell_pipe bash Global::shell /bin/bash
par_test_detected_shell test_known_shell_pipe csh Global::shell /bin/csh par_test_detected_shell test_known_shell_pipe csh Global::shell /bin/csh
par_test_detected_shell test_known_shell_pipe dash Global::shell /bin/dash par_test_detected_shell test_known_shell_pipe dash Global::shell /bin/dash
par_test_detected_shell test_known_shell_pipe fish Global::shell /usr/bin/fish par_test_detected_shell test_known_shell_pipe fish Global::shell /usr/bin/fish
par_test_detected_shell test_known_shell_pipe fizsh Global::shell /usr/bin/zsh par_test_detected_shell test_known_shell_pipe fizsh Global::shell /usr/bin/fizsh
par_test_detected_shell test_known_shell_pipe ksh Global::shell /usr/bin/ksh par_test_detected_shell test_known_shell_pipe ksh Global::shell /usr/bin/ksh
par_test_detected_shell test_known_shell_pipe ksh93 Global::shell /bin/ksh93 par_test_detected_shell test_known_shell_pipe ksh93 Global::shell /bin/ksh93
par_test_detected_shell test_known_shell_pipe mksh Global::shell /bin/mksh par_test_detected_shell test_known_shell_pipe mksh Global::shell /bin/mksh
par_test_detected_shell test_known_shell_pipe posh Global::shell /bin/posh par_test_detected_shell test_known_shell_pipe posh Global::shell /usr/bin/posh
par_test_detected_shell test_known_shell_pipe rbash Global::shell /bin/rbash par_test_detected_shell test_known_shell_pipe rbash Global::shell /bin/rbash
par_test_detected_shell test_known_shell_pipe rush Local configuration error occurred. par_test_detected_shell test_known_shell_pipe rush Local configuration error occurred.
par_test_detected_shell test_known_shell_pipe rush Contact the systems administrator for further assistance. par_test_detected_shell test_known_shell_pipe rush Contact the systems administrator for further assistance.

View file

@ -81,11 +81,6 @@ par_nice parallel: SIGTERM received. No new jobs will be started.
par_nice parallel: Waiting for these 2 jobs to finish. Send SIGTERM again to stop now. par_nice parallel: Waiting for these 2 jobs to finish. Send SIGTERM again to stop now.
par_nice parallel: bzip2 < /dev/zero par_nice parallel: bzip2 < /dev/zero
par_nice parallel: bzip2 < /dev/zero par_nice parallel: bzip2 < /dev/zero
par_parcat_mixing parcat output should mix: a b a b
par_parcat_mixing astart
par_parcat_mixing bstart
par_parcat_mixing aend
par_parcat_mixing bend
par_pipe_unneeded_procs ### Test bug #34241: --pipe should not spawn unneeded processes par_pipe_unneeded_procs ### Test bug #34241: --pipe should not spawn unneeded processes
par_pipe_unneeded_procs 1 par_pipe_unneeded_procs 1
par_pipe_unneeded_procs 2 par_pipe_unneeded_procs 2

View file

@ -15,7 +15,7 @@ par_2gb_record_reading Eats 4.7 GB
par_2gb_record_reading parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1. par_2gb_record_reading parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1.
par_2gb_record_reading 2300000004 par_2gb_record_reading 2300000004
par_2gb_records_N ### bug #44358: 2 GB records cause problems for -N par_2gb_records_N ### bug #44358: 2 GB records cause problems for -N
par_2gb_records_N 5 GB version: Eats 12.5 GB par_2gb_records_N 5 GB version: Eats 12.5 GB RAM + 4 GB Swap
par_2gb_records_N parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001. par_2gb_records_N parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001.
par_2gb_records_N parallel: Warning: A record was longer than 1300000001. Increasing to --blocksize 1690000003. par_2gb_records_N parallel: Warning: A record was longer than 1300000001. Increasing to --blocksize 1690000003.
par_2gb_records_N parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647. par_2gb_records_N parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647.
@ -28,7 +28,7 @@ par_2gb_records_N parallel: Warning: A record was longer than 1690000003. Increa
par_2gb_records_N 4600000007 par_2gb_records_N 4600000007
par_2gb_records_N 1000000001 par_2gb_records_N 1000000001
par_2gb_records_N ### -L >4GB par_2gb_records_N ### -L >4GB
par_2gb_records_N Eats 12.5 GB par_2gb_records_N Eats 12.5 GB RAM + 6 GB Swap
par_2gb_records_N parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001. par_2gb_records_N parallel: Warning: A record was longer than 1000000000. Increasing to --blocksize 1300000001.
par_2gb_records_N parallel: Warning: A record was longer than 1300000001. Increasing to --blocksize 1690000003. par_2gb_records_N parallel: Warning: A record was longer than 1300000001. Increasing to --blocksize 1690000003.
par_2gb_records_N parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647. par_2gb_records_N parallel: Warning: A record was longer than 1690000003. Increasing to --blocksize 2147483647.

View file

@ -11,6 +11,30 @@ Control case: Burn for 2.9 seconds
stdout /usr/bin/time -f CPUTIME=%U parallel --timeout 5 -q perl -e "while(1){ }" ::: 1 | \grep -q CPUTIME=1 stdout /usr/bin/time -f CPUTIME=%U parallel --timeout 5 -q perl -e "while(1){ }" ::: 1 | \grep -q CPUTIME=1
1=OK 1 1=OK 1
par_continuous_output Test delayed output with ''
par_continuous_output -u is optimal but hard to reach, due to non-mixing
par_continuous_output 4
par_continuous_output 0
par_continuous_output 0
par_continuous_output 0
par_continuous_output 1
par_continuous_output 1
par_continuous_output 1
par_continuous_output 1
par_continuous_output 1
par_continuous_output 0
par_continuous_output Test delayed output with '-u'
par_continuous_output -u is optimal but hard to reach, due to non-mixing
par_continuous_output 4
par_continuous_output 0
par_continuous_output 0
par_continuous_output 0
par_continuous_output 0
par_continuous_output 1
par_continuous_output 1
par_continuous_output 1
par_continuous_output 1
par_continuous_output 1
par_hostgroup ### --hostgroup force ncpu par_hostgroup ### --hostgroup force ncpu
par_hostgroup parallel par_hostgroup parallel
par_hostgroup parallel par_hostgroup parallel
@ -80,6 +104,24 @@ par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup tcsh par_hostgroup tcsh
par_hostgroup tcsh par_hostgroup tcsh
par_linebuffer_tag_slow_output Test output tag with mixing halflines
par_linebuffer_tag_slow_output a aH
par_linebuffer_tag_slow_output b bH
par_linebuffer_tag_slow_output a aa
par_linebuffer_tag_slow_output b ba
par_linebuffer_tag_slow_output a al
par_linebuffer_tag_slow_output b bl
par_linebuffer_tag_slow_output a af
par_linebuffer_tag_slow_output b bf
par_linebuffer_tag_slow_output a a
par_linebuffer_tag_slow_output a
par_linebuffer_tag_slow_output b b
par_linebuffer_tag_slow_output b
par_parcat_mixing parcat output should mix: a b a b
par_parcat_mixing astart
par_parcat_mixing bstart
par_parcat_mixing aend
par_parcat_mixing bend
par_testhalt now fail 0 true ### testhalt --halt now,fail=0 par_testhalt now fail 0 true ### testhalt --halt now,fail=0
par_testhalt now fail 0 true job 1 par_testhalt now fail 0 true job 1
par_testhalt now fail 0 true parallel: This job failed: par_testhalt now fail 0 true parallel: This job failed:

File diff suppressed because it is too large Load diff

View file

@ -28,36 +28,12 @@ echo '### Stop if all hosts are filtered and there are no hosts left to run on'
### Stop if all hosts are filtered and there are no hosts left to run on ### Stop if all hosts are filtered and there are no hosts left to run on
stdout parallel --filter-hosts -S no-such.host echo ::: 1 stdout parallel --filter-hosts -S no-such.host echo ::: 1
parallel: Warning: Removed no-such.host. parallel: Warning: Removed no-such.host.
parallel: Error: There are no hosts left to run on. parallel: Error: Cannot run any jobs.
echo '### Can csh propagate a variable containing \n'; export A=$(seq 3); parallel -S csh@lo --env A bash -c \''echo "$A"'\' ::: dummy echo '### Can csh propagate a variable containing \n'; export A=$(seq 3); parallel -S csh@lo --env A bash -c \''echo "$A"'\' ::: dummy
### Can csh propagate a variable containing \n ### Can csh propagate a variable containing \n
1 1
2 2
3 3
echo '### bug #41805: Idea: propagate --env for parallel --number-of-cores'
### bug #41805: Idea: propagate --env for parallel --number-of-cores
echo '** test_zsh'
** test_zsh
FOO=test_zsh parallel --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_zsh
HOME=~
echo '** test_zsh_filter'
** test_zsh_filter
FOO=test_zsh_filter parallel --filter-hosts --env FOO,HOME -S zsh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_zsh_filter
HOME=~
echo '** test_csh'
** test_csh
FOO=test_csh parallel --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_csh
HOME=~
echo '** test_csh_filter'
** test_csh_filter
FOO=test_csh_filter parallel --filter-hosts --env FOO,HOME -S csh@lo -N0 env ::: "" |sort|egrep 'FOO|^HOME'
FOO=test_csh_filter
HOME=~
echo '** bug #41805 done'
** bug #41805 done
echo '### Test bug #34241: --pipe should not spawn unneeded processes' echo '### Test bug #34241: --pipe should not spawn unneeded processes'
### Test bug #34241: --pipe should not spawn unneeded processes ### Test bug #34241: --pipe should not spawn unneeded processes
seq 5 | ssh csh@lo parallel -k --block 5 --pipe -j10 cat\\\;echo Block_end seq 5 | ssh csh@lo parallel -k --block 5 --pipe -j10 cat\\\;echo Block_end
@ -171,7 +147,7 @@ ls: No match.
ls: cannot access './--?.a': No such file or directory ls: cannot access './--?.a': No such file or directory
echo '### Test --trc "/tmp/./--- /A" "/tmp/./ ---/B"' echo '### Test --trc "/tmp/./--- /A" "/tmp/./ ---/B"'
### Test --trc "/tmp/./--- /A" "/tmp/./ ---/B" ### Test --trc "/tmp/./--- /A" "/tmp/./ ---/B"
mkdir -p '/tmp/./--- ' '/tmp/ ---'; touch -- '/tmp/./--- /A' '/tmp/ ---/B'; rm -f ./---?/A.a ./?---/B.a; parallel --trc {=s:.*/./::=}.a -S csh@lo,sh@lo touch ./{=s:.*/./::=}.a ::: '/tmp/./--- /A' '/tmp/./ ---/B'; ls ./---?/A.a ./?---/B.a; parallel --nonall -k -S csh@lo,sh@lo 'ls ./?--- ./---? || echo OK'; echo '### bug #46519: --onall ignores --transfer' mkdir -p '/tmp/./--- ' '/tmp/ ---'; touch -- '/tmp/./--- /A' '/tmp/ ---/B'; rm -f ./---?/A.a ./?---/B.a; parallel --trc {=s:.*/./::=}.a -S csh@lo,sh@lo touch ./{=s:.*/./::=}.a ::: '/tmp/./--- /A' '/tmp/./ ---/B'; ls ./---?/A.a ./?---/B.a | LC_ALL=C sort; parallel --nonall -k -S csh@lo,sh@lo 'ls ./?--- ./---? || echo OK' | LC_ALL=C sort; echo '### bug #46519: --onall ignores --transfer'
./ ---/B.a ./ ---/B.a
./--- /A.a ./--- /A.a
OK OK

Some files were not shown because too many files have changed in this diff Show more