Compare commits

..

3 commits

29 changed files with 667 additions and 204 deletions

28
NEWS
View file

@ -1,3 +1,31 @@
20241122
New in this release:
* --pipe --block works similar to --pipepart --block if --block size is negative.
* DBURLs can be written with / instead of %2F for sqlite and CSV.
* Bug fixes and man page updates.
News about GNU Parallel:
* Embarrassingly GNU parallel
https://dengin.xyz/blog/2024/10/24/embarrassingly-gnu-parallel/
* GNU Parallel for Your Terminal Tasks
https://erolrecep.github.io/posts/gnuparallel_for_your_terminal_tasks/
* How to leverage GNU parallel to utilize multiple cores while running AUGUSTUS
https://lifescienceshub.wixsite.com/lifesciencehub/post/how-to-leverage-gnu-parallel-to-utilize-multiple-cores-while-running-augustus
* GNU Parallel: The Good Parts
https://diekmeier.de/posts/2024-11-17-gnu-parallel/
* Put your CPU to work with GNU Parallel
https://www.redhat.com/en/blog/gnu-parallel
20241022 20241022
New in this release: New in this release:

24
README
View file

@ -57,11 +57,11 @@ 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-20241022.tar.bz2 wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20241022.tar.bz2.sig wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2.sig
gpg parallel-20241022.tar.bz2.sig gpg parallel-20241122.tar.bz2.sig
bzip2 -dc parallel-20241022.tar.bz2 | tar xvf - bzip2 -dc parallel-20241122.tar.bz2 | tar xvf -
cd parallel-20241022 cd parallel-20241122
./configure && make && sudo make install ./configure && make && sudo make install
@ -70,11 +70,11 @@ 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-20241022.tar.bz2 wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20241022.tar.bz2.sig wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2.sig
gpg parallel-20241022.tar.bz2.sig gpg parallel-20241122.tar.bz2.sig
bzip2 -dc parallel-20241022.tar.bz2 | tar xvf - bzip2 -dc parallel-20241122.tar.bz2 | tar xvf -
cd parallel-20241022 cd parallel-20241122
./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
@ -122,8 +122,8 @@ will love you for it.
When using programs that use GNU Parallel to process data for When using programs that use GNU Parallel to process data for
publication please cite: publication please cite:
Tange, O. (2024, October 22). GNU Parallel 20241022 ('Sinwar Nasrallah'). Tange, O. (2024, November 22). GNU Parallel 20241122 ('Ahoo Daryaei').
Zenodo. https://doi.org/10.5281/zenodo.13957646 Zenodo. https://doi.org/10.5281/zenodo.14207479
Copyright (C) 2007-2022 Ole Tange, http://ole.tange.dk and Free Copyright (C) 2007-2022 Ole Tange, http://ole.tange.dk and Free
Software Foundation, Inc. Software Foundation, Inc.

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.71 for parallel 20241022. # Generated by GNU Autoconf 2.71 for parallel 20241122.
# #
# Report bugs to <bug-parallel@gnu.org>. # Report bugs to <bug-parallel@gnu.org>.
# #
@ -610,8 +610,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='parallel' PACKAGE_NAME='parallel'
PACKAGE_TARNAME='parallel' PACKAGE_TARNAME='parallel'
PACKAGE_VERSION='20241022' PACKAGE_VERSION='20241122'
PACKAGE_STRING='parallel 20241022' PACKAGE_STRING='parallel 20241122'
PACKAGE_BUGREPORT='bug-parallel@gnu.org' PACKAGE_BUGREPORT='bug-parallel@gnu.org'
PACKAGE_URL='' PACKAGE_URL=''
@ -1246,7 +1246,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 20241022 to adapt to many kinds of systems. \`configure' configures parallel 20241122 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1313,7 +1313,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 20241022:";; short | recursive ) echo "Configuration of parallel 20241122:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1390,7 +1390,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 20241022 parallel configure 20241122
generated by GNU Autoconf 2.71 generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc. Copyright (C) 2021 Free Software Foundation, Inc.
@ -1427,7 +1427,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 20241022, which was It was created by parallel $as_me 20241122, which was
generated by GNU Autoconf 2.71. Invocation command line was generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw $ $0$ac_configure_args_raw
@ -2379,7 +2379,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='parallel' PACKAGE='parallel'
VERSION='20241022' VERSION='20241122'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@ -3026,7 +3026,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 20241022, which was This file was extended by parallel $as_me 20241122, which was
generated by GNU Autoconf 2.71. Invocation command line was generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -3090,7 +3090,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped' ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\ ac_cs_version="\\
parallel config.status 20241022 parallel config.status 20241122
configured by $0, generated by GNU Autoconf 2.71, configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View file

@ -1,4 +1,4 @@
AC_INIT([parallel],[20241022],[bug-parallel@gnu.org]) AC_INIT([parallel],[20241122],[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

@ -4,6 +4,24 @@
Quote of the month: Quote of the month:
GNU parallel is awesome. Use it more often in your scripts!
-- Wade @WadeGrimshire@twitter
i rly love gnu parallel over xargs, it's basically the same but has lots of useful and well documented options. sry if u know already
-- d@nny "disc@" mc² @hipsterelectron@circumstances.run
ainda não inventaram palavras capazes de expressar minha gratidão aos desenvolvedores do GNU Parallel
-- nueidris @nueidris.kawaii.social
Und die Tage jetzt hab ich GNU parallel für mich entdeckt, auch ne nette Geschichte, gerade wenn's irgendwelche remote APIs sind.
-- Vince @dd1des.bsky.social
gnu parallelすごい
-- たらたら@nosennyuu@twitter
GNU parallel is awesome. Use it more often in your scripts!
-- Wade @WadeGrimshire@twitter
by extreme do you mean extremely slow? you could do it at least 100x faster using awk + grep + gnu parallel by extreme do you mean extremely slow? you could do it at least 100x faster using awk + grep + gnu parallel
-- @ObssessedDev@twitter -- @ObssessedDev@twitter
@ -221,6 +239,9 @@ https://negfeedback.blogspot.com/2020/05/indispensable-command-line-tools.html
=== Used === === Used ===
GNU parallel is so satisfying
-- James Coman @jcoman.bsky.social
GNU Parallel is one of the most helpful tools I've been using recently, and it's just something like: parallel -j4 'gzip {}' ::: folder/*.csv GNU Parallel is one of the most helpful tools I've been using recently, and it's just something like: parallel -j4 'gzip {}' ::: folder/*.csv
-- Milton Pividori @miltondp@twitter -- Milton Pividori @miltondp@twitter

View file

@ -34,6 +34,12 @@ make short
== Update version == == Update version ==
https://savannah.gnu.org/news/submit.php?group=parallel
Draft:
perl -ne '/It\sis\savailable/..0 and print' doc/release_new_version | clipboard
https://zenodo.org/deposit/new https://zenodo.org/deposit/new
Do you already have a DOI for this upload? No Do you already have a DOI for this upload? No
@ -112,8 +118,7 @@ lbry://@GnuParallel#4/parallel-20210322.tar.bz2
. .last-doitag.txt . .last-doitag.txt
file_path="`pwd`/parallel-$YYYYMMDD.tar.bz2" file_path="`pwd`/parallel-$YYYYMMDD.tar.bz2"
title="GNU Parallel $YYYYMMDD ('$SPCTAG') [stable]" #title="GNU Parallel $YYYYMMDD ('$SPCTAG') [stable]"
title="GNU Parallel $YYYYMMDD ('$SPCTAG')" title="GNU Parallel $YYYYMMDD ('$SPCTAG')"
name="GNU-Parallel-$YYYYMMDD-$TAG" name="GNU-Parallel-$YYYYMMDD-$TAG"
author="Ole Tange" author="Ole Tange"
@ -121,6 +126,7 @@ license="GNU GPLv3 or later"
thumbnail_url=https://www.gnu.org/software/parallel/logo-gray+black10000.png thumbnail_url=https://www.gnu.org/software/parallel/logo-gray+black10000.png
channel_name="@GnuParallel" channel_name="@GnuParallel"
tags_opt='--tag gnu --tag parallel --tag free --tag software' tags_opt='--tag gnu --tag parallel --tag free --tag software'
release_time=$(date -d "$YYYYMMDD" +%s)
description="An easy way to support GNU Parallel is to tip on LBRY. description="An easy way to support GNU Parallel is to tip on LBRY.
@ -141,8 +147,7 @@ lbrynet publish \
--license="$license" \ --license="$license" \
--thumbnail_url="$thumbnail_url" \ --thumbnail_url="$thumbnail_url" \
--channel_name="$channel_name" \ --channel_name="$channel_name" \
--release_time="$release_time" \
# --release_time="$release_time" \
== Update website == == Update website ==
@ -267,30 +272,39 @@ 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 20241022 ('Sinwar Nasrallah') released Subject: GNU Parallel 20241122 ('Ahoo Daryaei') released
GNU Parallel 20241022 ('Sinwar Nasrallah') has been released. It is available for download at: lbry://@GnuParallel:4 GNU Parallel 20241122 ('Ahoo Daryaei') has been released. It is available for download at: lbry://@GnuParallel:4
Quote of the month: Quote of the month:
GNU Parallel is one of the most helpful tools I've been using recently, and it's just something like: parallel -j4 'gzip {}' ::: folder/*.csv GNU parallel is so satisfying
-- Milton Pividori @miltondp@twitter -- James Coman @jcoman.bsky.social
New in this release: New in this release:
* No new features. This is a candidate for a stable release. * --pipe --block works similar to --pipepart --block if --block size is negative.
* DBURLs can be written with / instead of %2F for sqlite and CSV.
* Bug fixes and man page updates. * Bug fixes and man page updates.
News about GNU Parallel: News about GNU Parallel:
* Separate arguments with a custom separator in GNU Parallel https://boxofcuriosities.co.uk/post/separate-arguments-with-a-custom-separator-in-gnu-parallel * Embarrassingly GNU parallel
https://dengin.xyz/blog/2024/10/24/embarrassingly-gnu-parallel/
* GNU parallel is underrated https://amontalenti.com/2021/11/10/parallel * GNU Parallel for Your Terminal Tasks
https://erolrecep.github.io/posts/gnuparallel_for_your_terminal_tasks/
* Unlocking the Power of Supercomputers: My HPC Adventure with 2800 Cores and GNU Parallel https://augalip.com/2024/03/10/unlocking-the-power-of-supercomputers-my-hpc-adventure-with-2800-cores-and-gnu-parallel/ * How to leverage GNU parallel to utilize multiple cores while running AUGUSTUS
https://lifescienceshub.wixsite.com/lifesciencehub/post/how-to-leverage-gnu-parallel-to-utilize-multiple-cores-while-running-augustus
* Converting WebP Images to PNG Using parallel and dwebp https://bytefreaks.net/gnulinux/bash/converting-webp-images-to-png-using-parallel-and-dwebp * GNU Parallel: The Good Parts
https://diekmeier.de/posts/2024-11-17-gnu-parallel/
* Put your CPU to work with GNU Parallel
https://www.redhat.com/en/blog/gnu-parallel
GNU Parallel - For people who live life in the parallel lane. GNU Parallel - For people who live life in the parallel lane.

View file

@ -1,10 +1,9 @@
<directory name="parallel" rev="402" vrev="3" srcmd5="eabde6986e84a2ee89d3573226212c2b"> <directory name="parallel" rev="403" vrev="2" srcmd5="5859fde67057353653a861981a199093">
<entry name="Makefile" md5="d62bf3bdf277f9787ce915e6d1309317" size="1254" mtime="1727031498" /> <entry name="Makefile" md5="d62bf3bdf277f9787ce915e6d1309317" size="1254" mtime="1727031498" />
<entry name="PKGBUILD" md5="d0637068b5eb4d647b3e281a32c4a383" size="795" mtime="1729438421" /> <entry name="PKGBUILD" md5="2147d5d0557cb1d87e905ec16b855cfb" size="795" mtime="1732313409" />
<entry name="parallel-20241022.tar.bz2" md5="d6b236cd452959c5f8e1740f9d6bd52f" size="2677432" mtime="1729438421" /> <entry name="parallel-20241122.tar.bz2" md5="37e808b62e43c87c49bb4b876cec0a8d" size="2677531" mtime="1732313409" />
<entry name="parallel-20241022.tar.bz2.sig" md5="310b1d88f6413d6f3126be2eb55514ba" size="2080" mtime="1729438421" /> <entry name="parallel-20241122.tar.bz2.sig" md5="b2b7cd40233f2da68986ef54d02128ce" size="2080" mtime="1732313410" />
<entry name="parallel.spec" md5="f723f1c49a4f85e96ee2cd0bbf668e77" size="6224" mtime="1729437802" /> <entry name="parallel.spec" md5="47eaf53b1ed3821dedd238cabccf1149" size="6224" mtime="1732313410" />
<entry name="parallel_20240922.tar.gz" md5="e0845f75badfde97790129aa5b793563" size="2917995" mtime="1729437803" /> <entry name="parallel_20241122.dsc" md5="d35026e2ea3527f8d24fd1048923812a" size="557" mtime="1732313410" />
<entry name="parallel_20241022.dsc" md5="3f822685e8ab5c249191f2afad054250" size="557" mtime="1729438422" /> <entry name="parallel_20241122.tar.gz" md5="cf60d96051e42ec28f8acb9080620223" size="2922864" mtime="1732313410" />
<entry name="parallel_20241022.tar.gz" md5="c4c614919c48a7f9718c6de7e00ae681" size="2918710" mtime="1729438422" />
</directory> </directory>

View file

@ -1,7 +1,7 @@
Summary: Shell tool for executing jobs in parallel Summary: Shell tool for executing jobs in parallel
Name: parallel Name: parallel
Version: 20241022 Version: 20241122
Release: 2.1 Release: 2.1
License: GPL-3.0-or-later License: GPL-3.0-or-later
Group: Productivity/File utilities Group: Productivity/File utilities

View file

@ -601,7 +601,7 @@ _parset_main() {
fi fi
if [ "$_parset_NAME" = "--version" ] ; then if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006 # shellcheck disable=SC2006
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)" echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software" echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc." echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -605,7 +605,7 @@ _parset_main() {
fi fi
if [ "$_parset_NAME" = "--version" ] ; then if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006 # shellcheck disable=SC2006
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)" echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software" echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc." echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -601,7 +601,7 @@ _parset_main() {
fi fi
if [ "$_parset_NAME" = "--version" ] ; then if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006 # shellcheck disable=SC2006
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)" echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software" echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc." echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -601,7 +601,7 @@ _parset_main() {
fi fi
if [ "$_parset_NAME" = "--version" ] ; then if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006 # shellcheck disable=SC2006
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)" echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software" echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc." echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -570,7 +570,7 @@ _parset_main() {
fi fi
if [ "$_parset_NAME" = "--version" ] ; then if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006 # shellcheck disable=SC2006
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)" echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software" echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc." echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -275,7 +275,7 @@ Due to a bug in Bash, aliases containing newlines must be followed by
a newline in the command. Some systems are not affected by this bug, a newline in the command. Some systems are not affected by this bug,
but will print a warning anyway. but will print a warning anyway.
=head2 csh (beta testing) =head2 csh
B<env_parallel> for B<csh> breaks B<$PARALLEL>, so do not use B<env_parallel> for B<csh> breaks B<$PARALLEL>, so do not use
B<$PARALLEL>. B<$PARALLEL>.
@ -679,7 +679,7 @@ B<--session> is supported.
=back =back
=head2 tcsh (beta testing) =head2 tcsh
B<env_parallel> for B<tcsh> breaks B<$PARALLEL>, so do not use B<env_parallel> for B<tcsh> breaks B<$PARALLEL>, so do not use
B<$PARALLEL>. B<$PARALLEL>.

View file

@ -601,7 +601,7 @@ _parset_main() {
fi fi
if [ "$_parset_NAME" = "--version" ] ; then if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006 # shellcheck disable=SC2006
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)" echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software" echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc." echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -601,7 +601,7 @@ _parset_main() {
fi fi
if [ "$_parset_NAME" = "--version" ] ; then if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006 # shellcheck disable=SC2006
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)" echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software" echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc." echo "Foundation, Inc."
echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>" echo "License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>"

View file

@ -26,7 +26,7 @@
use strict; use strict;
use Getopt::Long; use Getopt::Long;
$Global::progname="niceload"; $Global::progname="niceload";
$Global::version = 20241022; $Global::version = 20241122;
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) {

View file

@ -1165,6 +1165,8 @@ sub spreadstdin() {
my $blocksize = int($Global::blocksize); my $blocksize = int($Global::blocksize);
my $in = *STDIN; my $in = *STDIN;
my $timeout = $Global::blocktimeout; my $timeout = $Global::blocktimeout;
my @parts;
my $everything_read;
if($opt::skip_first_line) { if($opt::skip_first_line) {
my $newline; my $newline;
@ -1178,12 +1180,14 @@ sub spreadstdin() {
my $eof; my $eof;
my $garbage_read; my $garbage_read;
sub read_block() { sub read_with_alarm($) {
# Read a --blocksize from STDIN my ($readsize) = @_;
my ($nread,$alarm,$read_everything);
if($readsize < 0) {
$readsize = -$readsize;
$read_everything = 1;
}
# possibly interrupted by --blocktimeout # possibly interrupted by --blocktimeout
# Add up to the next full block
my $readsize = $blocksize - (length $buf) % $blocksize;
my ($nread,$alarm);
eval { eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
# --blocktimeout (or 0 if not set) # --blocktimeout (or 0 if not set)
@ -1191,13 +1195,13 @@ sub spreadstdin() {
if($] >= 5.026) { if($] >= 5.026) {
do { do {
$nread = sysread $in, $buf, $readsize, length $buf; $nread = sysread $in, $buf, $readsize, length $buf;
$readsize -= $nread; if(not $read_everything) { $readsize -= $nread; }
} while($readsize and $nread); } while($readsize and $nread);
} else { } else {
# Less efficient reading, but 32-bit sysread compatible # Less efficient reading, but 32-bit sysread compatible
do { do {
$nread = sysread($in,substr($buf,length $buf,0),$readsize,0); $nread = sysread($in,substr($buf,length $buf,0),$readsize,0);
$readsize -= $nread; if(not $read_everything) { $readsize -= $nread; }
} while($readsize and $nread); } while($readsize and $nread);
} }
alarm 0; alarm 0;
@ -1208,7 +1212,60 @@ sub spreadstdin() {
} else { } else {
$alarm = 0; $alarm = 0;
} }
$eof = not ($nread or $alarm); # Is this EOF?
return not ($nread or $alarm);
}
sub read_block_per_jobslot() {
if(not $everything_read) {
# Read everything in readsize of 2^17
# 21 = 20s
# 20 = 16s
# 19 = 16s,15s
# 18 = 15s
# 17 = 14s
# 16 = 14s
# 15 = 14s
$eof = read_with_alarm(-2**17);
if($eof) {
$everything_read = 1;
# Trick the rest of the code to think we are not done reading blocks yet.
$eof = 0;
# Chop into parts
my $total_size = length($buf);
my $jobslots = $Global::max_jobs_running;
my $parts = -$Global::blocksize * $jobslots;
my $part_size = int($total_size / $parts);
for my $i (0 .. $parts - 1) {
my $start = $i * $part_size;
my $end = ($i == $parts - 1) ? $total_size : $start + $part_size;
# Extract the chunk from buffer
push @parts, substr($buf, $start, $end - $start);
}
$buf="";
} else {
# What do we do here? Caused by alarm.
::die_bug("Read block from pipe failed");
}
}
if(@parts) {
# pop part and return that
$buf .= shift @parts;
} else {
# All parts are done: Let the rest of the code know we are EOF
$eof = 1;
}
}
sub read_block() {
# Read a --blocksize from STDIN
if($Global::blocksize < 0) {
read_block_per_jobslot();
} else {
# Add up to the next full block
my $readsize = $blocksize - (length $buf) % $blocksize;
$eof = read_with_alarm($readsize);
}
} }
sub pass_n_line_records() { sub pass_n_line_records() {
@ -2888,7 +2945,7 @@ sub check_invalid_option_combinations() {
sub init_globals() { sub init_globals() {
# Defaults: # Defaults:
$Global::version = 20241022; $Global::version = 20241122;
$Global::progname = 'parallel'; $Global::progname = 'parallel';
$::name = "GNU Parallel"; $::name = "GNU Parallel";
$Global::infinity = 2**31; $Global::infinity = 2**31;
@ -5946,8 +6003,8 @@ sub usage() {
"If you use programs that use GNU Parallel to process data for an article in a", "If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:", "scientific publication, please cite:",
"", "",
" Tange, O. (2024, October 22). GNU Parallel 20241022 ('Sinwar Nasrallah').", " Tange, O. (2024, November 22). GNU Parallel 20241122 ('Ahoo Daryaei').",
" Zenodo. https://doi.org/10.5281/zenodo.13957646", " Zenodo. https://doi.org/10.5281/zenodo.14207479",
"", "",
# Before changing these lines, please read # Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice # https://www.gnu.org/software/parallel/parallel_design.html#citation-notice
@ -5979,8 +6036,8 @@ sub citation_notice() {
"If you use programs that use GNU Parallel to process data for an article in a", "If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:", "scientific publication, please cite:",
"", "",
" Tange, O. (2024, October 22). GNU Parallel 20241022 ('Sinwar Nasrallah').", " Tange, O. (2024, November 22). GNU Parallel 20241122 ('Ahoo Daryaei').",
" Zenodo. https://doi.org/10.5281/zenodo.13957646", " Zenodo. https://doi.org/10.5281/zenodo.14207479",
"", "",
# Before changing these line, please read # Before changing these line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and # https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and
@ -6106,20 +6163,20 @@ sub citation() {
"If you use programs that use GNU Parallel to process data for an article in a", "If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:", "scientific publication, please cite:",
"", "",
"\@software{tange_2024_13957646,", "\@software{tange_2024_14207479,",
" author = {Tange, Ole},", " author = {Tange, Ole},",
" title = {GNU Parallel 20241022 ('Sinwar Nasrallah')},", " title = {GNU Parallel 20241122 ('Ahoo Daryaei')},",
" month = Oct,", " month = Nov,",
" year = 2024,", " year = 2024,",
" note = {{GNU Parallel is a general parallelizer to run", " note = {{GNU Parallel is a general parallelizer to run",
" multiple serial command line programs in parallel", " multiple serial command line programs in parallel",
" without changing them.}},", " without changing them.}},",
" publisher = {Zenodo},", " publisher = {Zenodo},",
" doi = {10.5281/zenodo.13957646},", " doi = {10.5281/zenodo.14207479},",
" url = {https://doi.org/10.5281/zenodo.13957646}", " url = {https://doi.org/10.5281/zenodo.14207479}",
"}", "}",
"", "",
"(Feel free to use \\nocite{tange_2024_13957646})", "(Feel free to use \\nocite{tange_2024_14207479})",
"", "",
# Before changing these lines, please read # Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and # https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and
@ -15159,12 +15216,18 @@ sub check_permissions($) {
} }
sub parse_dburl($) { sub parse_dburl($) {
sub undef_if_empty {
if(defined($_[0]) and $_[0] eq "") {
return undef;
}
return $_[0];
}
my $url = shift; my $url = shift;
my %options = (); my %options = ();
# sql:mysql://[[user][:password]@][host][:port]/[database[/table][?query]] # sql:mysql://[[user][:password]@][host][:port]/[database[/table][?query]]
if($url=~m!^(?:sql:)? # You can prefix with 'sql:' if($url=~m!^(?:sql:)? # You can prefix with 'sql:'
((?:oracle|ora|mysql|pg|postgres|postgresql)(?:s|ssl|)| ((?:oracle|ora|mysql|pg|postgres|postgresql|influx|influxdb)(?:s|ssl|)|
(?:sqlite|sqlite2|sqlite3|csv)):// # Databasedriver ($1) (?:sqlite|sqlite2|sqlite3|csv)):// # Databasedriver ($1)
(?: (?:
([^:@/][^:@]*|) # Username ($2) ([^:@/][^:@]*|) # Username ($2)
@ -15179,25 +15242,27 @@ sub parse_dburl($) {
)? )?
(?: (?:
/ /
([^/?]*)? # Database ($6) ([^?]*)? # Database ($6)
)? )?
(?: (?:
/ /
([^?]*)? # Table ($7) ([^?/]*)? # Table ($7)
)? )
(?: (?:
\? \?
(.*)? # Query ($8) (.*)? # Query ($8)
)? )?
$!ix) { $!ix) {
$options{databasedriver} = ::undef_if_empty(lc(uri_unescape($1))); $options{databasedriver} = undef_if_empty(lc(uri_unescape($1)));
$options{user} = ::undef_if_empty(uri_unescape($2)); $options{user} = undef_if_empty(uri_unescape($2));
$options{password} = ::undef_if_empty(uri_unescape($3)); $options{password} = undef_if_empty(uri_unescape($3));
$options{host} = ::undef_if_empty(uri_unescape($4)); $options{host} = undef_if_empty(uri_unescape($4));
$options{port} = ::undef_if_empty(uri_unescape($5)); $options{port} = undef_if_empty(uri_unescape($5));
$options{database} = ::undef_if_empty(uri_unescape($6)); $options{database} = undef_if_empty(uri_unescape($6))
$options{table} = ::undef_if_empty(uri_unescape($7)); || $options{user} || $ENV{'USER'};
$options{query} = ::undef_if_empty(uri_unescape($8)); $options{table} = undef_if_empty(uri_unescape($7))
|| $options{user} || $ENV{'USER'};
$options{query} = undef_if_empty(uri_unescape($8));
::debug("sql", "dburl $url\n"); ::debug("sql", "dburl $url\n");
::debug("sql", "databasedriver ", $options{databasedriver}, ::debug("sql", "databasedriver ", $options{databasedriver},
" user ", $options{user}, " user ", $options{user},

View file

@ -134,7 +134,7 @@ B<Bash, Csh, or Tcsh aliases>: Use B<env_parallel>.
B<Zsh, Fish, Ksh, and Pdksh functions and aliases>: Use B<env_parallel>. B<Zsh, Fish, Ksh, and Pdksh functions and aliases>: Use B<env_parallel>.
=item B<{}> (beta testing) =item B<{}>
Input line. Input line.
@ -155,7 +155,7 @@ See also: B<--plus> B<{.}> B<{/}> B<{//}> B<{/.}> B<{#}> B<{%}>
B<{>I<n>B<}> B<{=>I<perl expression>B<=}> B<{>I<n>B<}> B<{=>I<perl expression>B<=}>
=item B<{.}> (beta testing) =item B<{.}>
Input line without extension. Input line without extension.
@ -173,7 +173,7 @@ The replacement string B<{.}> can be changed with B<--extensionreplace>
See also: B<{}> B<--extensionreplace> See also: B<{}> B<--extensionreplace>
=item B<{/}> (beta testing) =item B<{/}>
Basename of input line. Basename of input line.
@ -183,7 +183,7 @@ directory part removed.
See also: B<{}> B<--basenamereplace> See also: B<{}> B<--basenamereplace>
=item B<{//}> (beta testing) =item B<{//}>
Dirname of input line. Dirname of input line.
@ -193,7 +193,7 @@ line. See B<dirname>(1).
See also: B<{}> B<--dirnamereplace> See also: B<{}> B<--dirnamereplace>
=item B<{/.}> (beta testing) =item B<{/.}>
Basename of input line without extension. Basename of input line without extension.
@ -204,7 +204,7 @@ B<{/}> and B<{.}>.
See also: B<{}> B<--basenameextensionreplace> See also: B<{}> B<--basenameextensionreplace>
=item B<{#}> (beta testing) =item B<{#}>
Sequence number of the job to run. Sequence number of the job to run.
@ -214,7 +214,7 @@ job being run. It contains the same number as $PARALLEL_SEQ.
See also: B<{}> B<--seqreplace> See also: B<{}> B<--seqreplace>
=item B<{%}> (beta testing) =item B<{%}>
Job slot number. Job slot number.
@ -249,7 +249,7 @@ Notice how {%} and $PARALLEL_JOBSLOT differ in the retry run of C and D.
See also: B<{}> B<--jobs> B<--slotreplace> See also: B<{}> B<--jobs> B<--slotreplace>
=item B<{>I<n>B<}> (beta testing) =item B<{>I<n>B<}>
Argument from input source I<n> or the I<n>'th argument. Argument from input source I<n> or the I<n>'th argument.
@ -263,7 +263,7 @@ See also: B<{}> B<{>I<n>.B<}> B<{>I<n>/B<}> B<{>I<n>//B<}>
B<{>I<n>/.B<}> B<--colsep> B<{>I<n>/.B<}> B<--colsep>
=item B<{>I<n>.B<}> (beta testing) =item B<{>I<n>.B<}>
Argument from input source I<n> or the I<n>'th argument without Argument from input source I<n> or the I<n>'th argument without
extension. extension.
@ -278,7 +278,7 @@ extension removed.
See also: B<{>I<n>B<}> B<{.}> See also: B<{>I<n>B<}> B<{.}>
=item B<{>I<n>/B<}> (beta testing) =item B<{>I<n>/B<}>
Basename of argument from input source I<n> or the I<n>'th argument. Basename of argument from input source I<n> or the I<n>'th argument.
@ -292,7 +292,7 @@ directory (if any) removed.
See also: B<{>I<n>B<}> B<{/}> See also: B<{>I<n>B<}> B<{/}>
=item B<{>I<n>//B<}> (beta testing) =item B<{>I<n>//B<}>
Dirname of argument from input source I<n> or the I<n>'th argument. Dirname of argument from input source I<n> or the I<n>'th argument.
@ -305,7 +305,7 @@ the I<n>'th argument (when used with B<-N>). See B<dirname>(1).
See also: B<{>I<n>B<}> B<{//}> See also: B<{>I<n>B<}> B<{//}>
=item B<{>I<n>/.B<}> (beta testing) =item B<{>I<n>/.B<}>
Basename of argument from input source I<n> or the I<n>'th argument Basename of argument from input source I<n> or the I<n>'th argument
without extension. without extension.
@ -321,7 +321,7 @@ directory (if any) and extension removed.
See also: B<{>I<n>B<}> B<{/.}> See also: B<{>I<n>B<}> B<{/.}>
=item B<{=>I<perl expression>B<=}> (beta testing) =item B<{=>I<perl expression>B<=}>
Replace with calculated I<perl expression>. Replace with calculated I<perl expression>.
@ -438,7 +438,7 @@ See also: B<--rpl> B<--parens> B<{}> B<{=>I<n> I<perl expression>B<=}>
B<--filter> B<--filter>
=item B<{=>I<n> I<perl expression>B<=}> (beta testing) =item B<{=>I<n> I<perl expression>B<=}>
Positional equivalent to B<{=>I<perl expression>B<=}>. Positional equivalent to B<{=>I<perl expression>B<=}>.
@ -447,7 +447,7 @@ To understand positional replacement strings see B<{>I<n>B<}>.
See also: B<{=>I<perl expression>B<=}> B<{>I<n>B<}> See also: B<{=>I<perl expression>B<=}> B<{>I<n>B<}>
=item B<{>I<rpl>:I<format>B<}> (beta testing) =item B<{>I<rpl>:I<format>B<}>
Format replacement string. Format replacement string.
@ -740,19 +740,25 @@ length of one record. For performance reasons I<size> should be bigger
than a two records. GNU B<parallel> will warn you and automatically than a two records. GNU B<parallel> will warn you and automatically
increase the size if you choose a I<size> that is too small. increase the size if you choose a I<size> that is too small.
If you use B<-N>, B<--block> should be bigger than N+1 records.
I<size> defaults to 1M. I<size> defaults to 1M.
When using B<--pipe-part> a negative block size is not interpreted as a A negative block size is not interpreted as a blocksize but as the
blocksize but as the number of blocks each jobslot should have. So number of blocks each jobslot should have. So B<--block -3> will make
this will run 10*5 = 50 jobs in total: 3 jobs for each jobslot. In other words: this will run 3*5 = 15 jobs
in total:
parallel --pipe-part -a myfile --block -10 -j5 wc parallel --pipe-part -a myfile --block -3 -j5 wc
cat myfile | parallel --pipe --block -3 -j5 wc
This is an efficient alternative to B<--round-robin> because data is B<--pipe-part --block> is an efficient alternative to B<--round-robin>
never read by GNU B<parallel>, but you can still have very few because data is never read by GNU B<parallel>, but you can still have
jobslots process large amounts of data. very few jobslots process huge amounts of data.
On the other hand, B<--pipe --block> is quite I<inefficient>: It reads
the whole file into memory before splitting it. Thus input must be
able to fit in memory.
If you use B<--block> -I<size>, input should be bigger than I<size>+1 records.
See also: UNIT PREFIX B<-N> B<--pipe> B<--pipe-part> B<--round-robin> See also: UNIT PREFIX B<-N> B<--pipe> B<--pipe-part> B<--round-robin>
B<--block-timeout> B<--block-timeout>
@ -1817,7 +1823,7 @@ If in doubt use B<-X> as that will most likely do what is needed.
See also: B<-X> B<--xargs> See also: B<-X> B<--xargs>
=item B<--match> I<regexp> (beta testing) =item B<--match> I<regexp>
Match input source with regexp to set replacement fields. Match input source with regexp to set replacement fields.
@ -3124,7 +3130,7 @@ complete.
The format of a DBURL is: The format of a DBURL is:
[sql:]vendor://[[user][:pwd]@][host][:port]/[db]/table [sql:]vendor://[[user][:pwd]@][host][:port]/[db]/[table]
E.g. E.g.
@ -3134,11 +3140,16 @@ E.g.
postgresql://scott:tiger@pg.example.com/pgdb/parjob postgresql://scott:tiger@pg.example.com/pgdb/parjob
pg:///parjob pg:///parjob
sqlite3:///%2Ftmp%2Fpardb.sqlite/parjob sqlite3:///%2Ftmp%2Fpardb.sqlite/parjob
sqlite:///file_in_current_dir.sqlite/my_table
csv:///%2Ftmp%2Fpardb/parjob csv:///%2Ftmp%2Fpardb/parjob
csv:///./file_in_current_dir
pg:////
Notice how / in the path of sqlite and CVS must be encoded as Notice how / in the path of sqlite and CSV must be encoded as
%2F. Except the last / in CSV which must be a /. %2F. Except the last / in CSV which must be a /.
I<db> and I<table> defaults to $USER: pg://// = pg:///$USER/$USER
It can also be an alias from ~/.sql/aliases: It can also be an alias from ~/.sql/aliases:
:myalias mysql:///mydb/paralleljobs :myalias mysql:///mydb/paralleljobs

View file

@ -173,11 +173,13 @@ The following features are in some of the comparable tools:
=back =back
As every new version of the programs are not tested the table may be Since each new version of the programs is not tested, the table may be
outdated. Please file a bug report if you find errors (See REPORTING outdated. Please file a bug report if you find errors (See REPORTING
BUGS). BUGS).
parallel: =head2 GNU Parallel
Summary (see legend above):
=over =over
@ -4916,6 +4918,8 @@ https://github.com/simonjwright/parallelize
=head2 Todo =head2 Todo
https://github.com/rustunit/parallelrun?tab=readme-ov-file
https://github.com/justanhduc/task-spooler https://github.com/justanhduc/task-spooler
https://manpages.ubuntu.com/manpages/xenial/man1/tsp.1.html https://manpages.ubuntu.com/manpages/xenial/man1/tsp.1.html

View file

@ -25,17 +25,6 @@ FUBAR in all files in this dir and subdirs:
Note B<-q> is needed because of the space in 'FOO BAR'. Note B<-q> is needed because of the space in 'FOO BAR'.
=head2 EXAMPLE: Simple network scanner
B<prips> can generate IP-addresses from CIDR notation. With GNU
B<parallel> you can build a simple network scanner to see which
addresses respond to B<ping>:
prips 130.229.16.0/20 | \
parallel --timeout 2 -j0 \
'ping -c 1 {} >/dev/null && echo {}' 2>/dev/null
=head2 EXAMPLE: Reading arguments from command line =head2 EXAMPLE: Reading arguments from command line
GNU B<parallel> can take the arguments from command line instead of GNU B<parallel> can take the arguments from command line instead of
@ -49,6 +38,20 @@ To convert *.wav to *.mp3 using LAME running one process per CPU run:
parallel lame {} -o {.}.mp3 ::: *.wav parallel lame {} -o {.}.mp3 ::: *.wav
=head2 EXAMPLE: Running full commands in parallel
If there is no command given to GNU B<parallel>, then the arguments
are treated as a command line.
To run B<gzip foo> and B<bzip2 bar> in parallel run:
parallel ::: "gzip foo" "bzip2 bar"
or:
(echo "gzip foo"; echo "bzip2 bar") | parallel
=head2 EXAMPLE: Inserting multiple arguments =head2 EXAMPLE: Inserting multiple arguments
When moving a lot of files like this: B<mv *.log destdir> you will When moving a lot of files like this: B<mv *.log destdir> you will
@ -377,6 +380,17 @@ the log:
mv log log.1 mv log log.1
=head2 EXAMPLE: Simple network scanner
B<prips> can generate IP-addresses from CIDR notation. With GNU
B<parallel> you can build a simple network scanner to see which
addresses respond to B<ping>:
prips 130.229.16.0/20 | \
parallel --timeout 2 -j0 \
'ping -c 1 {} >/dev/null && echo {}' 2>/dev/null
=head2 EXAMPLE: Removing file extension when processing files =head2 EXAMPLE: Removing file extension when processing files
When processing files removing the file extension using B<{.}> is When processing files removing the file extension using B<{.}> is

View file

@ -137,7 +137,7 @@ GetOptions(
"help" => \$opt::dummy, "help" => \$opt::dummy,
) || exit(255); ) || exit(255);
$Global::progname = ($0 =~ m:(^|/)([^/]+)$:)[1]; $Global::progname = ($0 =~ m:(^|/)([^/]+)$:)[1];
$Global::version = 20241022; $Global::version = 20241122;
if($opt::version) { version(); exit 0; } if($opt::version) { version(); exit 0; }
# Remove -D and --parallel=N # Remove -D and --parallel=N
my @s = (grep { ! /^-D$|^--parallel=\S+$/ } my @s = (grep { ! /^-D$|^--parallel=\S+$/ }

49
src/sql
View file

@ -234,6 +234,18 @@ To quote special characters use %-encoding specified in
http://tools.ietf.org/html/rfc3986#section-2.1 (E.g. a password http://tools.ietf.org/html/rfc3986#section-2.1 (E.g. a password
containing '/' would contain '%2F'). containing '/' would contain '%2F').
csv:///%2Ftmp%2Fparallel-bug-56096/mytable
csv:////tmp/parallel-bug-56096/mytable
mysql://me@/me/
mysql:////
sqlite3:///%2Frun%2Fshm%2Fparallel.db
sqlite3:///%2Frun%2Fshm%2Fparallel.db/table
sqlite:///%2Ftmp%2Ffile.sqlite?SELECT
csv:///%2Ftmp%2Fparallel-CSV/OK
csv:///%2Fmust%2Ffail/fail
sqlite3:///%2Frun%2Fshm%2Fparallel.db
Examples: Examples:
mysql://scott:tiger@my.example.com/mydb mysql://scott:tiger@my.example.com/mydb
@ -245,12 +257,23 @@ Examples:
sql:sqlite2:////tmp/db.sqlite?SELECT * FROM foo; sql:sqlite2:////tmp/db.sqlite?SELECT * FROM foo;
sqlite3:///../db.sqlite3?SELECT%20*%20FROM%20foo; sqlite3:///../db.sqlite3?SELECT%20*%20FROM%20foo;
Currently supported vendors: MySQL (mysql), MySQL with SSL (mysqls, Currently supported vendors:
mysqlssl), Oracle (oracle, ora), PostgreSQL (postgresql, pg, pgsql,
postgres), PostgreSQL with SSL (postgresqlssl, pgs, pgsqlssl, =over 2
postgresssl, pgssl, postgresqls, pgsqls, postgress), SQLite2 (sqlite,
sqlite2), SQLite3 (sqlite3), InfluxDB 1.x (influx, influxdb), InfluxDB =item * MySQL (mysql) with SSL (mysqls, mysqlssl)
with SSL (influxdbssl, influxdbs, influxs, influxssl)
=item * Oracle (oracle, ora)
=item * PostgreSQL (postgresql, pg, pgsql, postgres) with SSL (postgresqlssl, pgs, pgsqlssl, postgresssl, pgssl, postgresqls, pgsqls, postgress)
=item * SQLite2 (sqlite, sqlite2)
=item * SQLite3 (sqlite3)
=item * InfluxDB 1.x (influx, influxdb) with SSL (influxdbssl, influxdbs, influxs, influxssl)
=back
Aliases must start with ':' and are read from Aliases must start with ':' and are read from
/etc/sql/aliases and ~/.sql/aliases. The user's own /etc/sql/aliases and ~/.sql/aliases. The user's own
@ -670,7 +693,7 @@ $Global::Initfile && unlink $Global::Initfile;
exit ($err); exit ($err);
sub parse_options { sub parse_options {
$Global::version = 20241022; $Global::version = 20241122;
$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
@ -1152,9 +1175,9 @@ sub parse_dburl {
my %options = (); my %options = ();
# sql:mysql://[[user][:password]@][host][:port]/[database[?sql query]] # sql:mysql://[[user][:password]@][host][:port]/[database[?sql query]]
if($url=~m!(?:sql:)? # You can prefix with 'sql:' if($url=~m!^(?:sql:)? # You can prefix with 'sql:'
((?:oracle|ora|mysql|pg|postgres|postgresql|influx|influxdb)(?:s|ssl|)| ((?:oracle|ora|mysql|pg|postgres|postgresql|influx|influxdb)(?:s|ssl|)|
(?:sqlite|sqlite2|sqlite3)):// # Databasedriver ($1) (?:sqlite|sqlite2|sqlite3|csv)):// # Databasedriver ($1)
(?: (?:
([^:@/][^:@]*|) # Username ($2) ([^:@/][^:@]*|) # Username ($2)
(?: (?:
@ -1168,21 +1191,21 @@ sub parse_dburl {
)? )?
(?: (?:
/ /
([^?/]*)? # Database ($6) ([^?]*)? # Database ($6)
)? )?
(?: (?:
/? /?
\? \?
(.*)? # Query ($7) (.*)? # Query ($7)
)? )?
!x) { $!ix) {
$options{databasedriver} = undef_if_empty(uri_unescape($1)); $options{databasedriver} = undef_if_empty(lc(uri_unescape($1)));
$options{user} = undef_if_empty(uri_unescape($2)); $options{user} = undef_if_empty(uri_unescape($2));
$options{password} = undef_if_empty(uri_unescape($3)); $options{password} = undef_if_empty(uri_unescape($3));
$options{host} = undef_if_empty(uri_unescape($4)); $options{host} = undef_if_empty(uri_unescape($4));
$options{port} = undef_if_empty(uri_unescape($5)); $options{port} = undef_if_empty(uri_unescape($5));
$options{database} = undef_if_empty(uri_unescape($6)) $options{database} = undef_if_empty(uri_unescape($6))
|| $options{user}; || $options{user} || $ENV{'USER'};
$options{query} = undef_if_empty(uri_unescape($7)); $options{query} = undef_if_empty(uri_unescape($7));
debug("dburl $url\n"); debug("dburl $url\n");
debug("databasedriver ",$options{databasedriver}, " user ", $options{user}, debug("databasedriver ",$options{databasedriver}, " user ", $options{user},

View file

@ -8,6 +8,11 @@
# Each should be taking 1-3s and be possible to run in parallel # Each should be taking 1-3s and be possible to run in parallel
# I.e.: No race conditions, no logins # I.e.: No race conditions, no logins
par_--pipe--block-2() {
echo '### --block -2'
yes `seq 100` | head -c 100M | parallel -j 5 --block -2 -k --pipe wc
}
par_keep_order_make_job_1_output_fast() { par_keep_order_make_job_1_output_fast() {
echo '# EXAMPLE: Keep order, but make job 1 output fast' echo '# EXAMPLE: Keep order, but make job 1 output fast'
doit() { doit() {

View file

@ -8,6 +8,88 @@
# Each should be taking 30-100s and be possible to run in parallel # Each should be taking 30-100s and be possible to run in parallel
# I.e.: No race conditions, no logins # I.e.: No race conditions, no logins
par__dburl_parsing() {
mkdir -p test
(
cd test
export me=$(whoami)
pwd=$(pwd)
pwdurl=$(pwd | perl -pe 's:/:%2F:g')
dburls=(
# relative path - no dir
# relative path - with dir
# full path
# default
csv:///mydir/$me
csv:///./mydir/$me
csv:///.%2Fmydir/$me
csv:///$pwd/$me
csv:///$pwdurl/$me
csv:///./$me
csv:///./
# this defaults to $me/$me = non-existent dir
csv:///$me/$me
csv:////$me
csv:///$me/
csv:////
csv:///
sqlite3:///$me/$me
sqlite3://mydir/$me/$me
sqlite3:///mydir/$me/$me
sqlite3:///mydir%2F$me/$me
sqlite3:///$pwd/$me/$me
sqlite3:///$pwdurl/$me/$me
sqlite3:///$me/
sqlite3:///$me/$me
sqlite3:////$me
sqlite3:///$me/
sqlite3:////
sqlite3:///
sqlite:///$me/$me
sqlite://mydir/$me/$me
sqlite:///mydir/$me/$me
sqlite:///mydir%2F$me/$me
sqlite:///$pwd/$me/$me
sqlite:///$pwdurl/$me/$me
sqlite:///$me/
sqlite:///$me/$me
sqlite:////$me
sqlite:///$me/
sqlite:////
sqlite:///
mysql://$me@/$me/$me
mysql://$me@/$me/
mysql://$me@//
mysql:///$me/$me
mysql:////$me
mysql:///$me/
mysql:////
mysql:///
pg://$me@/$me/$me
pg://$me@/$me/
pg://$me@//
pg:///$me/$me
pg:////$me
pg:///$me/
pg:////
pg:///
)
test_dburl() {
mkdir mydir
parallel -k --sqlandworker $1 echo ::: {1..3}
rm -rf "$me" mydir
}
export -f test_dburl
parallel -j1 --tag test_dburl ::: ${dburls[@]}
)
rmdir test
}
par_sshlogin_parsing() { par_sshlogin_parsing() {
echo '### Generate sshlogins to test parsing' echo '### Generate sshlogins to test parsing'
sudo sshd -p 22222 sudo sshd -p 22222
@ -564,7 +646,7 @@ par_memfree() {
grep -v TERM | grep -v ps/display.c grep -v TERM | grep -v ps/display.c
} }
par_test_detected_shell() { par__test_detected_shell() {
echo '### bug #42913: Dont use $SHELL but the shell currently running' echo '### bug #42913: Dont use $SHELL but the shell currently running'
shells="bash csh dash fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh" shells="bash csh dash fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh"

View file

@ -73,7 +73,7 @@ par_exit() {
export -f test_signal export -f test_signal
ulimit -c 0 ulimit -c 0
stdout parallel -j15 -k --timeout 20 --tag test_signal ::: {0..64} | stdout parallel -j15 -k --timeout 20 --tag test_signal ::: {0..64} |
perl -pe 's/line 1: (\d+)/line 1: PID/' perl -pe 's/line 1: *(\d+)/line 1: PID/'
} }

View file

@ -1,3 +1,15 @@
par_--pipe--block-2 ### --block -2
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35911 3591100 10486012
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 35910 3591000 10485720
par_--pipe--block-2 0 39 108
par__arg_sep ### Test basic --arg-sep par__arg_sep ### Test basic --arg-sep
par__arg_sep a par__arg_sep a
par__arg_sep b par__arg_sep b

View file

@ -1,3 +1,182 @@
par__dburl_parsing csv:///mydir/tange parallel: Error:
par__dburl_parsing csv:///mydir/tange Execution ERROR: Cannot open /tmp/parallel-local-30s-tmp/
par__dburl_parsing csv:///mydir/tange `/tmp/trip`>/tmp/tripwire;
par__dburl_parsing csv:///mydir/tange 
par__dburl_parsing csv:///mydir/tange "'@<?[]|~\/tmp/test/mydir/tange: No such file or directory (2) at /usr/lib/x86_64-linux-gnu/perl5/5.38/DBI/DBD/SqlEngine.pm line 1624.
par__dburl_parsing csv:///mydir/tange called from /usr/local/bin/parallel at 15320.
par__dburl_parsing csv:///mydir/tange
par__dburl_parsing csv:///mydir/tange
par__dburl_parsing csv:///./mydir/tange parallel: Error:
par__dburl_parsing csv:///./mydir/tange Execution ERROR: Cannot open /tmp/parallel-local-30s-tmp/
par__dburl_parsing csv:///./mydir/tange `/tmp/trip`>/tmp/tripwire;
par__dburl_parsing csv:///./mydir/tange 
par__dburl_parsing csv:///./mydir/tange "'@<?[]|~\/tmp/test/mydir/tange: No such file or directory (2) at /usr/lib/x86_64-linux-gnu/perl5/5.38/DBI/DBD/SqlEngine.pm line 1624.
par__dburl_parsing csv:///./mydir/tange called from /usr/local/bin/parallel at 15320.
par__dburl_parsing csv:///./mydir/tange
par__dburl_parsing csv:///./mydir/tange
par__dburl_parsing csv:///.%2Fmydir/tange parallel: Error:
par__dburl_parsing csv:///.%2Fmydir/tange Execution ERROR: Cannot open /tmp/parallel-local-30s-tmp/
par__dburl_parsing csv:///.%2Fmydir/tange `/tmp/trip`>/tmp/tripwire;
par__dburl_parsing csv:///.%2Fmydir/tange 
par__dburl_parsing csv:///.%2Fmydir/tange "'@<?[]|~\/tmp/test/mydir/tange: No such file or directory (2) at /usr/lib/x86_64-linux-gnu/perl5/5.38/DBI/DBD/SqlEngine.pm line 1624.
par__dburl_parsing csv:///.%2Fmydir/tange called from /usr/local/bin/parallel at 15320.
par__dburl_parsing csv:///.%2Fmydir/tange
par__dburl_parsing csv:///.%2Fmydir/tange
par__dburl_parsing csv:////tmp/parallel-local-30s-tmp/ 1
par__dburl_parsing csv:////tmp/parallel-local-30s-tmp/ 2
par__dburl_parsing csv:////tmp/parallel-local-30s-tmp/ 3
par__dburl_parsing `/tmp/trip`>/tmp/tripwire; parallel: Error: `/tmp/trip`>/tmp/tripwire; is not a valid DBURL
par__dburl_parsing  parallel: Error:  is not a valid DBURL
par__dburl_parsing "'@<?[]|~\/tmp/test/tange parallel: Error: "'@<?[]|~\/tmp/test/tange is not a valid DBURL
par__dburl_parsing csv:///%2Ftmp%2Fparallel-local-30s-tmp%2F parallel: Error: tange is not a directory.
par__dburl_parsing `%2Ftmp%2Ftrip`>%2Ftmp%2Ftripwire; parallel: Error: `%2Ftmp%2Ftrip`>%2Ftmp%2Ftripwire; is not a valid DBURL
par__dburl_parsing  parallel: Error:  is not a valid DBURL
par__dburl_parsing "'@<?[]|~\%2Ftmp%2Ftest/tange parallel: Error: "'@<?[]|~\%2Ftmp%2Ftest/tange is not a valid DBURL
par__dburl_parsing csv:///./tange parallel: Error:
par__dburl_parsing csv:///./tange Execution ERROR: Cannot open /tmp/parallel-local-30s-tmp/
par__dburl_parsing csv:///./tange `/tmp/trip`>/tmp/tripwire;
par__dburl_parsing csv:///./tange 
par__dburl_parsing csv:///./tange "'@<?[]|~\/tmp/test/tange: No such file or directory (2) at /usr/lib/x86_64-linux-gnu/perl5/5.38/DBI/DBD/SqlEngine.pm line 1624.
par__dburl_parsing csv:///./tange called from /usr/local/bin/parallel at 15320.
par__dburl_parsing csv:///./tange
par__dburl_parsing csv:///./tange
par__dburl_parsing csv:///./ parallel: Error:
par__dburl_parsing csv:///./ Execution ERROR: Cannot open /tmp/parallel-local-30s-tmp/
par__dburl_parsing csv:///./ `/tmp/trip`>/tmp/tripwire;
par__dburl_parsing csv:///./ 
par__dburl_parsing csv:///./ "'@<?[]|~\/tmp/test/tange: No such file or directory (2) at /usr/lib/x86_64-linux-gnu/perl5/5.38/DBI/DBD/SqlEngine.pm line 1624.
par__dburl_parsing csv:///./ called from /usr/local/bin/parallel at 15320.
par__dburl_parsing csv:///./
par__dburl_parsing csv:///./
par__dburl_parsing csv:///tange/tange parallel: Error: tange is not a directory.
par__dburl_parsing csv:////tange parallel: Error: tange is not a directory.
par__dburl_parsing csv:///tange/ parallel: Error: tange is not a directory.
par__dburl_parsing csv://// parallel: Error: tange is not a directory.
par__dburl_parsing csv:/// parallel: Error: tange is not a directory.
par__dburl_parsing sqlite3:///tange/tange 1
par__dburl_parsing sqlite3:///tange/tange 2
par__dburl_parsing sqlite3:///tange/tange 3
par__dburl_parsing sqlite3://mydir/tange/tange 1
par__dburl_parsing sqlite3://mydir/tange/tange 2
par__dburl_parsing sqlite3://mydir/tange/tange 3
par__dburl_parsing sqlite3:///mydir/tange/tange 1
par__dburl_parsing sqlite3:///mydir/tange/tange 2
par__dburl_parsing sqlite3:///mydir/tange/tange 3
par__dburl_parsing sqlite3:///mydir%2Ftange/tange 1
par__dburl_parsing sqlite3:///mydir%2Ftange/tange 2
par__dburl_parsing sqlite3:///mydir%2Ftange/tange 3
par__dburl_parsing sqlite3:////tmp/parallel-local-30s-tmp/ DBI connect('dbname=/tmp/parallel-local-30s-tmp','',...) failed: unable to open database file at /usr/local/bin/parallel line 15114.
par__dburl_parsing `/tmp/trip`>/tmp/tripwire; parallel: Error: `/tmp/trip`>/tmp/tripwire; is not a valid DBURL
par__dburl_parsing  parallel: Error:  is not a valid DBURL
par__dburl_parsing "'@<?[]|~\/tmp/test/tange/tange parallel: Error: "'@<?[]|~\/tmp/test/tange/tange is not a valid DBURL
par__dburl_parsing sqlite3:///%2Ftmp%2Fparallel-local-30s-tmp%2F DBD::SQLite::db prepare failed: near "/": syntax error [for Statement "DROP TABLE IF EXISTS /tmp/parallel-local-30s-tmp/;"] at /usr/local/bin/parallel line 15317, <$fh> line 1.
par__dburl_parsing `%2Ftmp%2Ftrip`>%2Ftmp%2Ftripwire; parallel: Error: `%2Ftmp%2Ftrip`>%2Ftmp%2Ftripwire; is not a valid DBURL
par__dburl_parsing  parallel: Error:  is not a valid DBURL
par__dburl_parsing "'@<?[]|~\%2Ftmp%2Ftest/tange/tange parallel: Error: "'@<?[]|~\%2Ftmp%2Ftest/tange/tange is not a valid DBURL
par__dburl_parsing sqlite3:///tange/ 1
par__dburl_parsing sqlite3:///tange/ 2
par__dburl_parsing sqlite3:///tange/ 3
par__dburl_parsing sqlite3:///tange/tange 1
par__dburl_parsing sqlite3:///tange/tange 2
par__dburl_parsing sqlite3:///tange/tange 3
par__dburl_parsing sqlite3:////tange 1
par__dburl_parsing sqlite3:////tange 2
par__dburl_parsing sqlite3:////tange 3
par__dburl_parsing sqlite3:///tange/ 1
par__dburl_parsing sqlite3:///tange/ 2
par__dburl_parsing sqlite3:///tange/ 3
par__dburl_parsing sqlite3://// 1
par__dburl_parsing sqlite3://// 2
par__dburl_parsing sqlite3://// 3
par__dburl_parsing sqlite3:/// 1
par__dburl_parsing sqlite3:/// 2
par__dburl_parsing sqlite3:/// 3
par__dburl_parsing sqlite:///tange/tange 1
par__dburl_parsing sqlite:///tange/tange 2
par__dburl_parsing sqlite:///tange/tange 3
par__dburl_parsing sqlite://mydir/tange/tange 1
par__dburl_parsing sqlite://mydir/tange/tange 2
par__dburl_parsing sqlite://mydir/tange/tange 3
par__dburl_parsing sqlite:///mydir/tange/tange 1
par__dburl_parsing sqlite:///mydir/tange/tange 2
par__dburl_parsing sqlite:///mydir/tange/tange 3
par__dburl_parsing sqlite:///mydir%2Ftange/tange 1
par__dburl_parsing sqlite:///mydir%2Ftange/tange 2
par__dburl_parsing sqlite:///mydir%2Ftange/tange 3
par__dburl_parsing sqlite:////tmp/parallel-local-30s-tmp/ DBI connect('dbname=/tmp/parallel-local-30s-tmp','',...) failed: unable to open database file at /usr/local/bin/parallel line 15114.
par__dburl_parsing `/tmp/trip`>/tmp/tripwire; parallel: Error: `/tmp/trip`>/tmp/tripwire; is not a valid DBURL
par__dburl_parsing  parallel: Error:  is not a valid DBURL
par__dburl_parsing "'@<?[]|~\/tmp/test/tange/tange parallel: Error: "'@<?[]|~\/tmp/test/tange/tange is not a valid DBURL
par__dburl_parsing sqlite:///%2Ftmp%2Fparallel-local-30s-tmp%2F DBD::SQLite::db prepare failed: near "/": syntax error [for Statement "DROP TABLE IF EXISTS /tmp/parallel-local-30s-tmp/;"] at /usr/local/bin/parallel line 15317, <$fh> line 1.
par__dburl_parsing `%2Ftmp%2Ftrip`>%2Ftmp%2Ftripwire; parallel: Error: `%2Ftmp%2Ftrip`>%2Ftmp%2Ftripwire; is not a valid DBURL
par__dburl_parsing  parallel: Error:  is not a valid DBURL
par__dburl_parsing "'@<?[]|~\%2Ftmp%2Ftest/tange/tange parallel: Error: "'@<?[]|~\%2Ftmp%2Ftest/tange/tange is not a valid DBURL
par__dburl_parsing sqlite:///tange/ 1
par__dburl_parsing sqlite:///tange/ 2
par__dburl_parsing sqlite:///tange/ 3
par__dburl_parsing sqlite:///tange/tange 1
par__dburl_parsing sqlite:///tange/tange 2
par__dburl_parsing sqlite:///tange/tange 3
par__dburl_parsing sqlite:////tange 1
par__dburl_parsing sqlite:////tange 2
par__dburl_parsing sqlite:////tange 3
par__dburl_parsing sqlite:///tange/ 1
par__dburl_parsing sqlite:///tange/ 2
par__dburl_parsing sqlite:///tange/ 3
par__dburl_parsing sqlite://// 1
par__dburl_parsing sqlite://// 2
par__dburl_parsing sqlite://// 3
par__dburl_parsing sqlite:/// 1
par__dburl_parsing sqlite:/// 2
par__dburl_parsing sqlite:/// 3
par__dburl_parsing mysql://tange@/tange/tange 1
par__dburl_parsing mysql://tange@/tange/tange 2
par__dburl_parsing mysql://tange@/tange/tange 3
par__dburl_parsing mysql://tange@/tange/ 1
par__dburl_parsing mysql://tange@/tange/ 2
par__dburl_parsing mysql://tange@/tange/ 3
par__dburl_parsing mysql://tange@// 1
par__dburl_parsing mysql://tange@// 2
par__dburl_parsing mysql://tange@// 3
par__dburl_parsing mysql:///tange/tange 1
par__dburl_parsing mysql:///tange/tange 2
par__dburl_parsing mysql:///tange/tange 3
par__dburl_parsing mysql:////tange 1
par__dburl_parsing mysql:////tange 2
par__dburl_parsing mysql:////tange 3
par__dburl_parsing mysql:///tange/ 1
par__dburl_parsing mysql:///tange/ 2
par__dburl_parsing mysql:///tange/ 3
par__dburl_parsing mysql://// 1
par__dburl_parsing mysql://// 2
par__dburl_parsing mysql://// 3
par__dburl_parsing mysql:/// 1
par__dburl_parsing mysql:/// 2
par__dburl_parsing mysql:/// 3
par__dburl_parsing pg://tange@/tange/tange 1
par__dburl_parsing pg://tange@/tange/tange 2
par__dburl_parsing pg://tange@/tange/tange 3
par__dburl_parsing pg://tange@/tange/ 1
par__dburl_parsing pg://tange@/tange/ 2
par__dburl_parsing pg://tange@/tange/ 3
par__dburl_parsing pg://tange@// 1
par__dburl_parsing pg://tange@// 2
par__dburl_parsing pg://tange@// 3
par__dburl_parsing pg:///tange/tange 1
par__dburl_parsing pg:///tange/tange 2
par__dburl_parsing pg:///tange/tange 3
par__dburl_parsing pg:////tange 1
par__dburl_parsing pg:////tange 2
par__dburl_parsing pg:////tange 3
par__dburl_parsing pg:///tange/ 1
par__dburl_parsing pg:///tange/ 2
par__dburl_parsing pg:///tange/ 3
par__dburl_parsing pg://// 1
par__dburl_parsing pg://// 2
par__dburl_parsing pg://// 3
par__dburl_parsing pg:/// 1
par__dburl_parsing pg:/// 2
par__dburl_parsing pg:/// 3
par__groupby_big ### test --group-by on file bigger than block par__groupby_big ### test --group-by on file bigger than block
par__groupby_big --group-by on col 1..3, -n1..5 par__groupby_big --group-by on col 1..3, -n1..5
par__groupby_big _pipe and _ppart (pipepart) must return the same par__groupby_big _pipe and _ppart (pipepart) must return the same
@ -1608,7 +1787,58 @@ par__print_in_blocks ### bug #41565: Print happens in blocks - not after each jo
par__print_in_blocks The timing here is important: a full second between each par__print_in_blocks The timing here is important: a full second between each
par__print_in_blocks 1 par__print_in_blocks 1
par__print_in_blocks 300 ms jobs: par__print_in_blocks 300 ms jobs:
par__print_in_blocks 3 par__print_in_blocks 4
par__test_detected_shell ### bug #42913: Dont use $SHELL but the shell currently running
par__test_detected_shell test_unknown_shell bash Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell csh Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell dash Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell fish Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell fizsh Global::shell /usr/bin/zsh
par__test_detected_shell test_unknown_shell ksh Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell ksh93 Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell mksh Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell posh Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell rbash Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell rzsh Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell sash Global::shell /usr/bin/sh
par__test_detected_shell test_unknown_shell sh Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell tcsh Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell yash Global::shell /usr/bin/bash
par__test_detected_shell test_unknown_shell zsh Global::shell /usr/bin/bash
par__test_detected_shell test_known_shell_c bash Global::shell /usr/bin/bash
par__test_detected_shell test_known_shell_c csh Global::shell /usr/bin/csh
par__test_detected_shell test_known_shell_c dash Global::shell /usr/bin/dash
par__test_detected_shell test_known_shell_c fish Global::shell /usr/bin/fish
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 ksh93 Global::shell /usr/bin/ksh93
par__test_detected_shell test_known_shell_c mksh Global::shell /usr/bin/mksh
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 /usr/bin/rbash
par__test_detected_shell test_known_shell_c rzsh Global::shell /usr/bin/rzsh
par__test_detected_shell test_known_shell_c sash Global::shell /usr/bin/sh
par__test_detected_shell test_known_shell_c sh Global::shell /usr/bin/sh
par__test_detected_shell test_known_shell_c static-sh Global::shell /usr/bin/static-sh
par__test_detected_shell test_known_shell_c tcsh Global::shell /usr/bin/tcsh
par__test_detected_shell test_known_shell_c yash Global::shell /usr/bin/yash
par__test_detected_shell test_known_shell_c zsh Global::shell /usr/bin/zsh
par__test_detected_shell test_known_shell_pipe bash Global::shell /usr/bin/bash
par__test_detected_shell test_known_shell_pipe csh Global::shell /usr/bin/csh
par__test_detected_shell test_known_shell_pipe dash Global::shell /usr/bin/dash
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/fizsh
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 /usr/bin/ksh93
par__test_detected_shell test_known_shell_pipe mksh Global::shell /usr/bin/mksh
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 /usr/bin/rbash
par__test_detected_shell test_known_shell_pipe rzsh Global::shell /usr/bin/rzsh
par__test_detected_shell test_known_shell_pipe sash Global::shell /usr/bin/sh
par__test_detected_shell test_known_shell_pipe sh Global::shell /usr/bin/sh
par__test_detected_shell test_known_shell_pipe static-sh Global::shell /usr/bin/static-sh
par__test_detected_shell test_known_shell_pipe tcsh Global::shell /usr/bin/tcsh
par__test_detected_shell test_known_shell_pipe yash Global::shell /usr/bin/yash
par__test_detected_shell test_known_shell_pipe zsh Global::shell /usr/bin/zsh
par_bin ### Test --bin par_bin ### Test --bin
par_bin 2 2 4 par_bin 2 2 4
par_bin 2 2 4 par_bin 2 2 4
@ -3187,57 +3417,6 @@ par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)
par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo withpassword
par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222 par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 22222
par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword par_sshlogin_parsing @grp1+grp2/4//usr/bin/ssh withpassword::;`echo>/tmp/trap`;)(|<*&"'@lo:22222 withpassword
par_test_detected_shell ### bug #42913: Dont use $SHELL but the shell currently running
par_test_detected_shell test_unknown_shell bash Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell csh Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell dash Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell fish Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell fizsh Global::shell /usr/bin/zsh
par_test_detected_shell test_unknown_shell ksh Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell ksh93 Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell mksh Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell posh Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell rbash Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell rzsh Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell sash Global::shell /usr/bin/sh
par_test_detected_shell test_unknown_shell sh Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell tcsh Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell yash Global::shell /usr/bin/bash
par_test_detected_shell test_unknown_shell zsh Global::shell /usr/bin/bash
par_test_detected_shell test_known_shell_c bash Global::shell /usr/bin/bash
par_test_detected_shell test_known_shell_c csh Global::shell /usr/bin/csh
par_test_detected_shell test_known_shell_c dash Global::shell /usr/bin/dash
par_test_detected_shell test_known_shell_c fish Global::shell /usr/bin/fish
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 ksh93 Global::shell /usr/bin/ksh93
par_test_detected_shell test_known_shell_c mksh Global::shell /usr/bin/mksh
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 /usr/bin/rbash
par_test_detected_shell test_known_shell_c rzsh Global::shell /usr/bin/rzsh
par_test_detected_shell test_known_shell_c sash Global::shell /usr/bin/sh
par_test_detected_shell test_known_shell_c sh Global::shell /usr/bin/sh
par_test_detected_shell test_known_shell_c static-sh Global::shell /usr/bin/static-sh
par_test_detected_shell test_known_shell_c tcsh Global::shell /usr/bin/tcsh
par_test_detected_shell test_known_shell_c yash Global::shell /usr/bin/yash
par_test_detected_shell test_known_shell_c zsh Global::shell /usr/bin/zsh
par_test_detected_shell test_known_shell_pipe bash Global::shell /usr/bin/bash
par_test_detected_shell test_known_shell_pipe csh Global::shell /usr/bin/csh
par_test_detected_shell test_known_shell_pipe dash Global::shell /usr/bin/dash
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/fizsh
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 /usr/bin/ksh93
par_test_detected_shell test_known_shell_pipe mksh Global::shell /usr/bin/mksh
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 /usr/bin/rbash
par_test_detected_shell test_known_shell_pipe rzsh Global::shell /usr/bin/rzsh
par_test_detected_shell test_known_shell_pipe sash Global::shell /usr/bin/sh
par_test_detected_shell test_known_shell_pipe sh Global::shell /usr/bin/sh
par_test_detected_shell test_known_shell_pipe static-sh Global::shell /usr/bin/static-sh
par_test_detected_shell test_known_shell_pipe tcsh Global::shell /usr/bin/tcsh
par_test_detected_shell test_known_shell_pipe yash Global::shell /usr/bin/yash
par_test_detected_shell test_known_shell_pipe zsh Global::shell /usr/bin/zsh
par_test_diff_roundrobin_k ### test there is difference on -k par_test_diff_roundrobin_k ### test there is difference on -k
par_test_diff_roundrobin_k OK par_test_diff_roundrobin_k OK
par_test_ipv6_format ### Host as IPv6 address par_test_ipv6_format ### Host as IPv6 address

View file

@ -51,10 +51,7 @@ par_continuous_output 1
par_continuous_output 1 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 - 2x parallel, 6x me
par_hostgroup parallel
par_hostgroup tange
par_hostgroup ### --hostgroup two group arg
par_hostgroup parallel par_hostgroup parallel
par_hostgroup parallel par_hostgroup parallel
par_hostgroup tange par_hostgroup tange
@ -63,7 +60,16 @@ par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup ### --hostgroup one group arg par_hostgroup ### --hostgroup two group arg - 2x parallel, 6x me
par_hostgroup parallel
par_hostgroup parallel
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup tange
par_hostgroup ### --hostgroup one group arg - 8x me
par_hostgroup tange par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup tange par_hostgroup tange
@ -72,7 +78,7 @@ par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup ### --hostgroup multiple group arg + unused group par_hostgroup ### --hostgroup multiple group arg + unused group - 2x parallel, 6x me, 0x tcsh
par_hostgroup parallel par_hostgroup parallel
par_hostgroup tange par_hostgroup tange
par_hostgroup ### --hostgroup two groups @ par_hostgroup ### --hostgroup two groups @
@ -87,17 +93,17 @@ par_hostgroup implicit_group
par_hostgroup ### --hostgroup --sshlogin with @ par_hostgroup ### --hostgroup --sshlogin with @
par_hostgroup no_group par_hostgroup no_group
par_hostgroup implicit_group par_hostgroup implicit_group
par_hostgroup ### --hostgroup -S @group par_hostgroup ### --hostgroup -S @group - bad if you get parallel@lo
par_hostgroup tange par_hostgroup tange
par_hostgroup tcsh par_hostgroup tcsh
par_hostgroup ### --hostgroup -S @group1 -Sgrp2 par_hostgroup ### --hostgroup -S @group1 -Sgrp2 - get all twice
par_hostgroup parallel par_hostgroup parallel
par_hostgroup parallel par_hostgroup parallel
par_hostgroup tange par_hostgroup tange
par_hostgroup tange par_hostgroup tange
par_hostgroup tcsh par_hostgroup tcsh
par_hostgroup tcsh par_hostgroup tcsh
par_hostgroup ### --hostgroup -S @group1+grp2 par_hostgroup ### --hostgroup -S @group1+grp2 - get all twice
par_hostgroup parallel par_hostgroup parallel
par_hostgroup parallel par_hostgroup parallel
par_hostgroup tange par_hostgroup tange