Compare commits

..

No commits in common. "14089a1ff0e9d51b95adf3aa537d058c47dfd053" and "e47cf9837708d389482a370f6d31fae38ba585af" have entirely different histories.

29 changed files with 204 additions and 667 deletions

28
NEWS
View file

@ -1,31 +1,3 @@
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
New in this release:

24
README
View file

@ -57,11 +57,11 @@ document.
Full installation of GNU Parallel is as simple as:
wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2.sig
gpg parallel-20241122.tar.bz2.sig
bzip2 -dc parallel-20241122.tar.bz2 | tar xvf -
cd parallel-20241122
wget https://ftpmirror.gnu.org/parallel/parallel-20241022.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20241022.tar.bz2.sig
gpg parallel-20241022.tar.bz2.sig
bzip2 -dc parallel-20241022.tar.bz2 | tar xvf -
cd parallel-20241022
./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
~/bin and ~/share:
wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20241122.tar.bz2.sig
gpg parallel-20241122.tar.bz2.sig
bzip2 -dc parallel-20241122.tar.bz2 | tar xvf -
cd parallel-20241122
wget https://ftpmirror.gnu.org/parallel/parallel-20241022.tar.bz2
wget https://ftpmirror.gnu.org/parallel/parallel-20241022.tar.bz2.sig
gpg parallel-20241022.tar.bz2.sig
bzip2 -dc parallel-20241022.tar.bz2 | tar xvf -
cd parallel-20241022
./configure --prefix=$HOME && make && make install
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
publication please cite:
Tange, O. (2024, November 22). GNU Parallel 20241122 ('Ahoo Daryaei').
Zenodo. https://doi.org/10.5281/zenodo.14207479
Tange, O. (2024, October 22). GNU Parallel 20241022 ('Sinwar Nasrallah').
Zenodo. https://doi.org/10.5281/zenodo.13957646
Copyright (C) 2007-2022 Ole Tange, http://ole.tange.dk and Free
Software Foundation, Inc.

20
configure vendored
View file

@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.71 for parallel 20241122.
# Generated by GNU Autoconf 2.71 for parallel 20241022.
#
# Report bugs to <bug-parallel@gnu.org>.
#
@ -610,8 +610,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='parallel'
PACKAGE_TARNAME='parallel'
PACKAGE_VERSION='20241122'
PACKAGE_STRING='parallel 20241122'
PACKAGE_VERSION='20241022'
PACKAGE_STRING='parallel 20241022'
PACKAGE_BUGREPORT='bug-parallel@gnu.org'
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.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
\`configure' configures parallel 20241122 to adapt to many kinds of systems.
\`configure' configures parallel 20241022 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1313,7 +1313,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of parallel 20241122:";;
short | recursive ) echo "Configuration of parallel 20241022:";;
esac
cat <<\_ACEOF
@ -1390,7 +1390,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
parallel configure 20241122
parallel configure 20241022
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@ -1427,7 +1427,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by parallel $as_me 20241122, which was
It was created by parallel $as_me 20241022, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@ -2379,7 +2379,7 @@ fi
# Define the identity of the package.
PACKAGE='parallel'
VERSION='20241122'
VERSION='20241022'
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
# values after options handling.
ac_log="
This file was extended by parallel $as_me 20241122, which was
This file was extended by parallel $as_me 20241022, which was
generated by GNU Autoconf 2.71. Invocation command line was
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
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
parallel config.status 20241122
parallel config.status 20241022
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"

View file

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

View file

@ -4,24 +4,6 @@
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
-- @ObssessedDev@twitter
@ -239,9 +221,6 @@ https://negfeedback.blogspot.com/2020/05/indispensable-command-line-tools.html
=== 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
-- Milton Pividori @miltondp@twitter

View file

@ -34,12 +34,6 @@ make short
== 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
Do you already have a DOI for this upload? No
@ -118,7 +112,8 @@ lbry://@GnuParallel#4/parallel-20210322.tar.bz2
. .last-doitag.txt
file_path="`pwd`/parallel-$YYYYMMDD.tar.bz2"
#title="GNU Parallel $YYYYMMDD ('$SPCTAG') [stable]"
title="GNU Parallel $YYYYMMDD ('$SPCTAG') [stable]"
title="GNU Parallel $YYYYMMDD ('$SPCTAG')"
name="GNU-Parallel-$YYYYMMDD-$TAG"
author="Ole Tange"
@ -126,7 +121,6 @@ license="GNU GPLv3 or later"
thumbnail_url=https://www.gnu.org/software/parallel/logo-gray+black10000.png
channel_name="@GnuParallel"
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.
@ -147,7 +141,8 @@ lbrynet publish \
--license="$license" \
--thumbnail_url="$thumbnail_url" \
--channel_name="$channel_name" \
--release_time="$release_time" \
# --release_time="$release_time" \
== Update website ==
@ -272,39 +267,30 @@ from:tange@gnu.org
to:parallel@gnu.org, bug-parallel@gnu.org
stable-bcc: Jesse Alama <jessealama@fastmail.fm>
Subject: GNU Parallel 20241122 ('Ahoo Daryaei') released
Subject: GNU Parallel 20241022 ('Sinwar Nasrallah') released
GNU Parallel 20241122 ('Ahoo Daryaei') has been released. It is available for download at: lbry://@GnuParallel:4
GNU Parallel 20241022 ('Sinwar Nasrallah') has been released. It is available for download at: lbry://@GnuParallel:4
Quote of the month:
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
-- Milton Pividori @miltondp@twitter
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.
* No new features. This is a candidate for a stable release.
* Bug fixes and man page updates.
News about GNU Parallel:
* Embarrassingly GNU parallel
https://dengin.xyz/blog/2024/10/24/embarrassingly-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
* GNU Parallel for Your Terminal Tasks
https://erolrecep.github.io/posts/gnuparallel_for_your_terminal_tasks/
* GNU parallel is underrated https://amontalenti.com/2021/11/10/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
* 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/
* 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
* 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 - For people who live life in the parallel lane.

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -570,7 +570,7 @@ _parset_main() {
fi
if [ "$_parset_NAME" = "--version" ] ; then
# shellcheck disable=SC2006
echo "parset 20241122 (GNU parallel `parallel --minversion 1`)"
echo "parset 20241022 (GNU parallel `parallel --minversion 1`)"
echo "Copyright (C) 2007-2024 Ole Tange, http://ole.tange.dk and Free Software"
echo "Foundation, Inc."
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,
but will print a warning anyway.
=head2 csh
=head2 csh (beta testing)
B<env_parallel> for B<csh> breaks B<$PARALLEL>, so do not use
B<$PARALLEL>.
@ -679,7 +679,7 @@ B<--session> is supported.
=back
=head2 tcsh
=head2 tcsh (beta testing)
B<env_parallel> for B<tcsh> breaks B<$PARALLEL>, so do not use
B<$PARALLEL>.

View file

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

View file

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

View file

@ -26,7 +26,7 @@
use strict;
use Getopt::Long;
$Global::progname="niceload";
$Global::version = 20241122;
$Global::version = 20241022;
Getopt::Long::Configure("bundling","require_order");
get_options_from_array(\@ARGV) || die_usage();
if($opt::version) {

View file

@ -1165,8 +1165,6 @@ sub spreadstdin() {
my $blocksize = int($Global::blocksize);
my $in = *STDIN;
my $timeout = $Global::blocktimeout;
my @parts;
my $everything_read;
if($opt::skip_first_line) {
my $newline;
@ -1180,14 +1178,12 @@ sub spreadstdin() {
my $eof;
my $garbage_read;
sub read_with_alarm($) {
my ($readsize) = @_;
my ($nread,$alarm,$read_everything);
if($readsize < 0) {
$readsize = -$readsize;
$read_everything = 1;
}
sub read_block() {
# Read a --blocksize from STDIN
# possibly interrupted by --blocktimeout
# Add up to the next full block
my $readsize = $blocksize - (length $buf) % $blocksize;
my ($nread,$alarm);
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
# --blocktimeout (or 0 if not set)
@ -1195,13 +1191,13 @@ sub spreadstdin() {
if($] >= 5.026) {
do {
$nread = sysread $in, $buf, $readsize, length $buf;
if(not $read_everything) { $readsize -= $nread; }
$readsize -= $nread;
} while($readsize and $nread);
} else {
# Less efficient reading, but 32-bit sysread compatible
do {
$nread = sysread($in,substr($buf,length $buf,0),$readsize,0);
if(not $read_everything) { $readsize -= $nread; }
$readsize -= $nread;
} while($readsize and $nread);
}
alarm 0;
@ -1212,60 +1208,7 @@ sub spreadstdin() {
} else {
$alarm = 0;
}
# 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);
}
$eof = not ($nread or $alarm);
}
sub pass_n_line_records() {
@ -2945,7 +2888,7 @@ sub check_invalid_option_combinations() {
sub init_globals() {
# Defaults:
$Global::version = 20241122;
$Global::version = 20241022;
$Global::progname = 'parallel';
$::name = "GNU Parallel";
$Global::infinity = 2**31;
@ -6003,8 +5946,8 @@ sub usage() {
"If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:",
"",
" Tange, O. (2024, November 22). GNU Parallel 20241122 ('Ahoo Daryaei').",
" Zenodo. https://doi.org/10.5281/zenodo.14207479",
" Tange, O. (2024, October 22). GNU Parallel 20241022 ('Sinwar Nasrallah').",
" Zenodo. https://doi.org/10.5281/zenodo.13957646",
"",
# Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice
@ -6036,8 +5979,8 @@ sub citation_notice() {
"If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:",
"",
" Tange, O. (2024, November 22). GNU Parallel 20241122 ('Ahoo Daryaei').",
" Zenodo. https://doi.org/10.5281/zenodo.14207479",
" Tange, O. (2024, October 22). GNU Parallel 20241022 ('Sinwar Nasrallah').",
" Zenodo. https://doi.org/10.5281/zenodo.13957646",
"",
# Before changing these line, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and
@ -6163,20 +6106,20 @@ sub citation() {
"If you use programs that use GNU Parallel to process data for an article in a",
"scientific publication, please cite:",
"",
"\@software{tange_2024_14207479,",
"\@software{tange_2024_13957646,",
" author = {Tange, Ole},",
" title = {GNU Parallel 20241122 ('Ahoo Daryaei')},",
" month = Nov,",
" title = {GNU Parallel 20241022 ('Sinwar Nasrallah')},",
" month = Oct,",
" year = 2024,",
" note = {{GNU Parallel is a general parallelizer to run",
" multiple serial command line programs in parallel",
" without changing them.}},",
" publisher = {Zenodo},",
" doi = {10.5281/zenodo.14207479},",
" url = {https://doi.org/10.5281/zenodo.14207479}",
" doi = {10.5281/zenodo.13957646},",
" url = {https://doi.org/10.5281/zenodo.13957646}",
"}",
"",
"(Feel free to use \\nocite{tange_2024_14207479})",
"(Feel free to use \\nocite{tange_2024_13957646})",
"",
# Before changing these lines, please read
# https://www.gnu.org/software/parallel/parallel_design.html#citation-notice and
@ -15216,18 +15159,12 @@ sub check_permissions($) {
}
sub parse_dburl($) {
sub undef_if_empty {
if(defined($_[0]) and $_[0] eq "") {
return undef;
}
return $_[0];
}
my $url = shift;
my %options = ();
# sql:mysql://[[user][:password]@][host][:port]/[database[/table][?query]]
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)(?:s|ssl|)|
(?:sqlite|sqlite2|sqlite3|csv)):// # Databasedriver ($1)
(?:
([^:@/][^:@]*|) # Username ($2)
@ -15242,27 +15179,25 @@ sub parse_dburl($) {
)?
(?:
/
([^?]*)? # Database ($6)
([^/?]*)? # Database ($6)
)?
(?:
/
([^?/]*)? # Table ($7)
)
([^?]*)? # Table ($7)
)?
(?:
\?
(.*)? # Query ($8)
)?
$!ix) {
$options{databasedriver} = undef_if_empty(lc(uri_unescape($1)));
$options{user} = undef_if_empty(uri_unescape($2));
$options{password} = undef_if_empty(uri_unescape($3));
$options{host} = undef_if_empty(uri_unescape($4));
$options{port} = undef_if_empty(uri_unescape($5));
$options{database} = undef_if_empty(uri_unescape($6))
|| $options{user} || $ENV{'USER'};
$options{table} = undef_if_empty(uri_unescape($7))
|| $options{user} || $ENV{'USER'};
$options{query} = undef_if_empty(uri_unescape($8));
$options{databasedriver} = ::undef_if_empty(lc(uri_unescape($1)));
$options{user} = ::undef_if_empty(uri_unescape($2));
$options{password} = ::undef_if_empty(uri_unescape($3));
$options{host} = ::undef_if_empty(uri_unescape($4));
$options{port} = ::undef_if_empty(uri_unescape($5));
$options{database} = ::undef_if_empty(uri_unescape($6));
$options{table} = ::undef_if_empty(uri_unescape($7));
$options{query} = ::undef_if_empty(uri_unescape($8));
::debug("sql", "dburl $url\n");
::debug("sql", "databasedriver ", $options{databasedriver},
" 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>.
=item B<{}>
=item B<{}> (beta testing)
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<=}>
=item B<{.}>
=item B<{.}> (beta testing)
Input line without extension.
@ -173,7 +173,7 @@ The replacement string B<{.}> can be changed with B<--extensionreplace>
See also: B<{}> B<--extensionreplace>
=item B<{/}>
=item B<{/}> (beta testing)
Basename of input line.
@ -183,7 +183,7 @@ directory part removed.
See also: B<{}> B<--basenamereplace>
=item B<{//}>
=item B<{//}> (beta testing)
Dirname of input line.
@ -193,7 +193,7 @@ line. See B<dirname>(1).
See also: B<{}> B<--dirnamereplace>
=item B<{/.}>
=item B<{/.}> (beta testing)
Basename of input line without extension.
@ -204,7 +204,7 @@ B<{/}> and B<{.}>.
See also: B<{}> B<--basenameextensionreplace>
=item B<{#}>
=item B<{#}> (beta testing)
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>
=item B<{%}>
=item B<{%}> (beta testing)
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>
=item B<{>I<n>B<}>
=item B<{>I<n>B<}> (beta testing)
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>
=item B<{>I<n>.B<}>
=item B<{>I<n>.B<}> (beta testing)
Argument from input source I<n> or the I<n>'th argument without
extension.
@ -278,7 +278,7 @@ extension removed.
See also: B<{>I<n>B<}> B<{.}>
=item B<{>I<n>/B<}>
=item B<{>I<n>/B<}> (beta testing)
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<{/}>
=item B<{>I<n>//B<}>
=item B<{>I<n>//B<}> (beta testing)
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<{//}>
=item B<{>I<n>/.B<}>
=item B<{>I<n>/.B<}> (beta testing)
Basename of argument from input source I<n> or the I<n>'th argument
without extension.
@ -321,7 +321,7 @@ directory (if any) and extension removed.
See also: B<{>I<n>B<}> B<{/.}>
=item B<{=>I<perl expression>B<=}>
=item B<{=>I<perl expression>B<=}> (beta testing)
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>
=item B<{=>I<n> I<perl expression>B<=}>
=item B<{=>I<n> I<perl expression>B<=}> (beta testing)
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<}>
=item B<{>I<rpl>:I<format>B<}>
=item B<{>I<rpl>:I<format>B<}> (beta testing)
Format replacement string.
@ -740,25 +740,19 @@ length of one record. For performance reasons I<size> should be bigger
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.
If you use B<-N>, B<--block> should be bigger than N+1 records.
I<size> defaults to 1M.
A negative block size is not interpreted as a blocksize but as the
number of blocks each jobslot should have. So B<--block -3> will make
3 jobs for each jobslot. In other words: this will run 3*5 = 15 jobs
in total:
When using B<--pipe-part> a negative block size is not interpreted as a
blocksize but as the number of blocks each jobslot should have. So
this will run 10*5 = 50 jobs in total:
parallel --pipe-part -a myfile --block -3 -j5 wc
cat myfile | parallel --pipe --block -3 -j5 wc
parallel --pipe-part -a myfile --block -10 -j5 wc
B<--pipe-part --block> is an efficient alternative to B<--round-robin>
because data is never read by GNU B<parallel>, but you can still have
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.
This is an efficient alternative to B<--round-robin> because data is
never read by GNU B<parallel>, but you can still have very few
jobslots process large amounts of data.
See also: UNIT PREFIX B<-N> B<--pipe> B<--pipe-part> B<--round-robin>
B<--block-timeout>
@ -1823,7 +1817,7 @@ If in doubt use B<-X> as that will most likely do what is needed.
See also: B<-X> B<--xargs>
=item B<--match> I<regexp>
=item B<--match> I<regexp> (beta testing)
Match input source with regexp to set replacement fields.
@ -3130,7 +3124,7 @@ complete.
The format of a DBURL is:
[sql:]vendor://[[user][:pwd]@][host][:port]/[db]/[table]
[sql:]vendor://[[user][:pwd]@][host][:port]/[db]/table
E.g.
@ -3140,16 +3134,11 @@ E.g.
postgresql://scott:tiger@pg.example.com/pgdb/parjob
pg:///parjob
sqlite3:///%2Ftmp%2Fpardb.sqlite/parjob
sqlite:///file_in_current_dir.sqlite/my_table
csv:///%2Ftmp%2Fpardb/parjob
csv:///./file_in_current_dir
pg:////
Notice how / in the path of sqlite and CSV must be encoded as
Notice how / in the path of sqlite and CVS must be encoded as
%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:
:myalias mysql:///mydb/paralleljobs

View file

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

View file

@ -25,6 +25,17 @@ FUBAR in all files in this dir and subdirs:
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
GNU B<parallel> can take the arguments from command line instead of
@ -38,20 +49,6 @@ To convert *.wav to *.mp3 using LAME running one process per CPU run:
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
When moving a lot of files like this: B<mv *.log destdir> you will
@ -380,17 +377,6 @@ the log:
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
When processing files removing the file extension using B<{.}> is

View file

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

49
src/sql
View file

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

View file

@ -8,11 +8,6 @@
# Each should be taking 1-3s and be possible to run in parallel
# 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() {
echo '# EXAMPLE: Keep order, but make job 1 output fast'
doit() {

View file

@ -8,88 +8,6 @@
# Each should be taking 30-100s and be possible to run in parallel
# 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() {
echo '### Generate sshlogins to test parsing'
sudo sshd -p 22222
@ -646,7 +564,7 @@ par_memfree() {
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'
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
ulimit -c 0
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,15 +1,3 @@
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 a
par__arg_sep b

View file

@ -1,182 +1,3 @@
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 --group-by on col 1..3, -n1..5
par__groupby_big _pipe and _ppart (pipepart) must return the same
@ -1787,58 +1608,7 @@ 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 1
par__print_in_blocks 300 ms jobs:
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__print_in_blocks 3
par_bin ### Test --bin
par_bin 2 2 4
par_bin 2 2 4
@ -3417,6 +3187,57 @@ 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:22222 22222
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 OK
par_test_ipv6_format ### Host as IPv6 address

View file

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