mirror of
https://git.savannah.gnu.org/git/parallel.git
synced 2024-12-22 20:57:53 +00:00
env_parallel.fish: Converted to '-quoting.
This commit is contained in:
parent
1501d93eea
commit
a51c54dafe
|
@ -15,7 +15,7 @@
|
|||
# If that fails, it copies to $HOME/bin
|
||||
#
|
||||
# You can download and run the script directly by:
|
||||
# (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
|
||||
# (lynx -source pi.dk/3 || wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
|
||||
|
||||
run() {
|
||||
# tail on openindiana must be /usr/xpg4/bin/tail
|
||||
|
@ -24,12 +24,13 @@ run() {
|
|||
# grep on openindiana must be /usr/xpg4/bin/grep
|
||||
GREP=$(echo | grep -vE . 2>/dev/null && echo grep ||
|
||||
(echo | /usr/xpg4/bin/grep -vE . && echo /usr/xpg4/bin/grep))
|
||||
# FreeBSD prefers 'fetch', MacOS prefers 'curl', Linux prefers 'wget'
|
||||
# FreeBSD prefers 'fetch', MacOS prefers 'curl', Linux prefers 'wget'
|
||||
GET=$(
|
||||
(fetch -o /dev/null file:///bin/sh && echo fetch -o -) ||
|
||||
(lynx -source /dev/null && echo lynx -source) ||
|
||||
(fetch -o /dev/null file:///bin/sh && echo fetch -o -) ||
|
||||
(curl -h >/dev/null && echo curl -L) ||
|
||||
(wget -h >/dev/null && echo wget -qO -) ||
|
||||
echo 'No wget, curl, fetch: Please inform parallel@gnu.org what you use for downloading URLs' >&2
|
||||
echo 'No lynx, wget, curl, fetch: Please inform parallel@gnu.org what you use for downloading URLs' >&2
|
||||
)
|
||||
if test "$GET" = ""; then
|
||||
exit 1
|
||||
|
|
26
NEWS
26
NEWS
|
@ -1,5 +1,20 @@
|
|||
<<<<<<< HEAD
|
||||
=======
|
||||
20181222
|
||||
|
||||
* Better /proc/cpuinfo parser.
|
||||
|
||||
* Simpler job scheduling flow.
|
||||
|
||||
* MPGI Workshop: Job Parallelization with Task Arrays and GNU Parallel https://www.msi.umn.edu/tutorials/mpgi-workshop-module-4
|
||||
|
||||
* CONCOCT uses GNU Parallel https://media.readthedocs.org/pdf/concoct/latest/concoct.pdf
|
||||
|
||||
* If you use SLURM read https://wiki.hpc.uconn.edu/index.php/Advanced_SLURM
|
||||
|
||||
* すぐ忘れてしまう、仕事で使う技 https://qiita.com/hana_shin/items/53c3c78525c9c758ae7c
|
||||
|
||||
* Bug fixes and man page updates.
|
||||
|
||||
|
||||
20181122
|
||||
|
||||
* Experimental simpler job flow control.
|
||||
|
@ -55,7 +70,6 @@
|
|||
* Bug fixes and man page updates.
|
||||
|
||||
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
20180722
|
||||
|
||||
* The quoting engine has been changed. Instead of using \-quoting GNU
|
||||
|
@ -82,11 +96,8 @@
|
|||
* Parallel download genomic data with GNU-Parallel
|
||||
https://digibio.blogspot.com/search/label/GNU-Parallel
|
||||
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
* Bug fixes and man page updates.
|
||||
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
|
||||
20180622
|
||||
|
||||
|
@ -293,7 +304,8 @@
|
|||
|
||||
* Initial support for XDG Base Directory $XDG_* environment variables.
|
||||
|
||||
* Validating half a million TIFF files. Part Two
|
||||
* Validating half a million TIFF files. Part
|
||||
Two
|
||||
https://www.dpoc.ac.uk/2017/08/17/validating-half-a-million-tiff-files-part-two/
|
||||
|
||||
* Turing data science class: Cluster computing
|
||||
|
|
12
README
12
README
|
@ -44,9 +44,9 @@ document.
|
|||
|
||||
Full installation of GNU Parallel is as simple as:
|
||||
|
||||
wget https://ftpmirror.gnu.org/parallel/parallel-20181122.tar.bz2
|
||||
bzip2 -dc parallel-20181122.tar.bz2 | tar xvf -
|
||||
cd parallel-20181122
|
||||
wget https://ftpmirror.gnu.org/parallel/parallel-20181222.tar.bz2
|
||||
bzip2 -dc parallel-20181222.tar.bz2 | tar xvf -
|
||||
cd parallel-20181222
|
||||
./configure && make && sudo make install
|
||||
|
||||
|
||||
|
@ -55,9 +55,9 @@ Full installation of GNU Parallel is as simple as:
|
|||
If you are not root you can add ~/bin to your path and install in
|
||||
~/bin and ~/share:
|
||||
|
||||
wget https://ftpmirror.gnu.org/parallel/parallel-20181122.tar.bz2
|
||||
bzip2 -dc parallel-20181122.tar.bz2 | tar xvf -
|
||||
cd parallel-20181122
|
||||
wget https://ftpmirror.gnu.org/parallel/parallel-20181222.tar.bz2
|
||||
bzip2 -dc parallel-20181222.tar.bz2 | tar xvf -
|
||||
cd parallel-20181222
|
||||
./configure --prefix=$HOME && make && make install
|
||||
|
||||
Or if your system lacks 'make' you can simply copy src/parallel
|
||||
|
|
20
configure
vendored
20
configure
vendored
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for parallel 20181122.
|
||||
# Generated by GNU Autoconf 2.69 for parallel 20181222.
|
||||
#
|
||||
# Report bugs to <bug-parallel@gnu.org>.
|
||||
#
|
||||
|
@ -579,8 +579,8 @@ MAKEFLAGS=
|
|||
# Identity of this package.
|
||||
PACKAGE_NAME='parallel'
|
||||
PACKAGE_TARNAME='parallel'
|
||||
PACKAGE_VERSION='20181122'
|
||||
PACKAGE_STRING='parallel 20181122'
|
||||
PACKAGE_VERSION='20181222'
|
||||
PACKAGE_STRING='parallel 20181222'
|
||||
PACKAGE_BUGREPORT='bug-parallel@gnu.org'
|
||||
PACKAGE_URL=''
|
||||
|
||||
|
@ -1214,7 +1214,7 @@ if test "$ac_init_help" = "long"; then
|
|||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures parallel 20181122 to adapt to many kinds of systems.
|
||||
\`configure' configures parallel 20181222 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
|
@ -1281,7 +1281,7 @@ fi
|
|||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of parallel 20181122:";;
|
||||
short | recursive ) echo "Configuration of parallel 20181222:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
|
@ -1357,7 +1357,7 @@ fi
|
|||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
parallel configure 20181122
|
||||
parallel configure 20181222
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
|
@ -1374,7 +1374,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 20181122, which was
|
||||
It was created by parallel $as_me 20181222, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
|
@ -2237,7 +2237,7 @@ fi
|
|||
|
||||
# Define the identity of the package.
|
||||
PACKAGE='parallel'
|
||||
VERSION='20181122'
|
||||
VERSION='20181222'
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
|
@ -2880,7 +2880,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by parallel $as_me 20181122, which was
|
||||
This file was extended by parallel $as_me 20181222, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
|
@ -2942,7 +2942,7 @@ _ACEOF
|
|||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
parallel config.status 20181122
|
||||
parallel config.status 20181222
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
AC_INIT([parallel], [20181122], [bug-parallel@gnu.org])
|
||||
AC_INIT([parallel], [20181222], [bug-parallel@gnu.org])
|
||||
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_FILES([
|
||||
|
|
|
@ -206,17 +206,19 @@ from:tange@gnu.org
|
|||
to:parallel@gnu.org, bug-parallel@gnu.org
|
||||
stable-bcc: Jesse Alama <jessealama@fastmail.fm>
|
||||
|
||||
Subject: GNU Parallel 20181222 ('Kilogram/brexitdeal/Stan Lee/Cesar Sayoc/Tree of Life/Iran') released <<[stable]>>
|
||||
Subject: GNU Parallel 20190122 ('Indonesia=Tanjung Lesung=Sunda ') released <<[stable]>>
|
||||
|
||||
GNU Parallel 20181222 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
|
||||
GNU Parallel 20190122 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/
|
||||
|
||||
<<No new functionality was introduced so this is a good candidate for a stable release.>>
|
||||
|
||||
Quote of the month:
|
||||
|
||||
<<>>
|
||||
|
||||
New in this release:
|
||||
|
||||
* https://qiita.com/hana_shin/items/53c3c78525c9c758ae7c
|
||||
*
|
||||
|
||||
* Bug fixes and man page updates.
|
||||
|
||||
|
@ -235,11 +237,12 @@ GNU Parallel makes sure output from the commands is the same output as you would
|
|||
|
||||
You can find more about GNU Parallel at: http://www.gnu.org/s/parallel/
|
||||
|
||||
You can install GNU Parallel in just 10 seconds with: (wget -O - pi.dk/3 || curl pi.dk/3/) | bash
|
||||
You can install GNU Parallel in just 10 seconds with:
|
||||
(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash
|
||||
|
||||
Watch the intro video on http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
|
||||
|
||||
Walk through the tutorial (man parallel_tutorial). Your commandline will love you for it.
|
||||
Walk through the tutorial (man parallel_tutorial). Your command line will love you for it.
|
||||
|
||||
When using programs that use GNU Parallel to process data for publication please cite:
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<directory name="parallel" rev="227" srcmd5="21d1e9e6d757ee09c239531d094bac7b" vrev="1">
|
||||
<entry md5="7f377215f4bfec95ae667a756cdda905" mtime="1542929947" name="parallel-20181122.tar.bz2" size="1797510" />
|
||||
<entry md5="21c2c593abc38419b337648cd12518ae" mtime="1542929947" name="parallel.spec" size="4667" />
|
||||
<entry md5="30d6a27fae9852f24b415b6e00feb43f" mtime="1542929947" name="parallel_20181122.dsc" size="556" />
|
||||
<entry md5="4e0cdca7d064c5174b0858b8e2acb1f5" mtime="1542929947" name="parallel_20181122.tar.gz" size="1991811" />
|
||||
<directory name="parallel" rev="228" srcmd5="6b5a77aa91c7b5b1222e49ab36f563df" vrev="1">
|
||||
<entry md5="04ebc06103bdf5ce70c360742adbcbd8" mtime="1545440269" name="parallel-20181222.tar.bz2" size="1799481" />
|
||||
<entry md5="68cf0f3d678a67b8317122c1f4c45afc" mtime="1545440269" name="parallel.spec" size="4667" />
|
||||
<entry md5="0ee51c455e89f82f7c8f0dfe9310c250" mtime="1545440269" name="parallel_20181222.dsc" size="556" />
|
||||
<entry md5="ddaa3054a0ab04e30ad38d2b32617a4a" mtime="1545440270" name="parallel_20181222.tar.gz" size="1995147" />
|
||||
</directory>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
Summary: Shell tool for executing jobs in parallel
|
||||
Name: parallel
|
||||
Version: 20181122
|
||||
Version: 20181222
|
||||
Release: 1.2
|
||||
License: GPL
|
||||
Group: Productivity/File utilities
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
Summary: Shell tool for executing jobs in parallel
|
||||
Name: parallel
|
||||
Version: 20181122
|
||||
Version: 20181222
|
||||
Release: 1.2
|
||||
License: GPL
|
||||
Group: Productivity/File utilities
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016-2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016-2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
@ -136,7 +136,7 @@ function env_parallel
|
|||
#
|
||||
begin;
|
||||
for v in (set -n | \
|
||||
grep -Ev '^(PARALLEL_TMP|PARALLEL_ENV)$' | \
|
||||
grep -Ev '^(PARALLEL_TMP)$' | \
|
||||
grep -E "^$_grep_REGEXP\$" | grep -vE "^$_ignore_UNDERSCORE\$");
|
||||
# Separate variables with the string: \000
|
||||
# array_name1 val1\0
|
||||
|
@ -158,15 +158,15 @@ function env_parallel
|
|||
# Ignore read-only vars
|
||||
$name=~/^(HOME|USER|COLUMNS|FISH_VERSION|LINES|PWD|SHLVL|_|
|
||||
history|status|version)$/x and next;
|
||||
# Quote $val
|
||||
$val=~s/[\002-\011\013-\032\\\#\?\`\(\)\{\}\[\]\^\*\<\=\>\~
|
||||
\|\; \"\!\$\&\202-\377]/\\\$&/gox;
|
||||
# Quote single quote
|
||||
$val=~s/'"'"'/\\\$&/go;
|
||||
# Quote newline as '\n'
|
||||
$val =~ s/[\n]/\\\n/go;
|
||||
# Empty value => 2 single quotes = \047\047
|
||||
$val=~s/^$/\047\047/o;
|
||||
# Single quote $val
|
||||
if($val =~ /[^-_.+a-z0-9\/]/i) {
|
||||
$val =~ s/\047/\047"\047"\047/g; # "-quote single quotes
|
||||
$val = "\047$val\047"; # single-quote entire string
|
||||
$val =~ s/^\047\047|\047\047$//g; # Remove unneeded '' at ends
|
||||
} elsif ($val eq "") {
|
||||
$val = "\047\047";
|
||||
}
|
||||
|
||||
if($name ne $last and $last) {
|
||||
# The $name is different, so this is a new variable.
|
||||
# Print the last one.
|
||||
|
@ -183,16 +183,8 @@ function env_parallel
|
|||
s/\n/\001/g'
|
||||
end;
|
||||
)
|
||||
# --session
|
||||
perl -e 'exit grep { /^--session$/ } @ARGV' -- $argv; or begin;
|
||||
setenv PARALLEL_IGNORED_NAMES (
|
||||
functions -n | perl -ne 's/,/\n/g; /^(env_parallel)$/ and next; print';
|
||||
set -n;
|
||||
)
|
||||
end;
|
||||
|
||||
# If --record-env or --session: exit
|
||||
perl -e 'exit grep { /^(--record-env|--session)$/ } @ARGV' -- $argv; and parallel $argv;
|
||||
# If --record-env: exit
|
||||
perl -e 'exit grep { /^--record-env$/ } @ARGV' -- $argv; and parallel $argv;
|
||||
set _parallel_exit_CODE $status
|
||||
set -e PARALLEL_ENV
|
||||
return $_parallel_exit_CODE
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -743,7 +743,7 @@ Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
|
|||
|
||||
Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
|
||||
|
||||
Copyright (C) 2010-2018 Ole Tange, http://ole.tange.dk and Free
|
||||
Copyright (C) 2010-2019 Ole Tange, http://ole.tange.dk and Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016-2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016-2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# after which 'env_parallel' works
|
||||
#
|
||||
#
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Copyright (C) 2016-2019
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
|
13
src/niceload
13
src/niceload
|
@ -1,10 +1,9 @@
|
|||
#!/usr/bin/perl -w
|
||||
|
||||
# Copyright (C) 2004,2005,2006,2006,2008,2009,2010 Ole Tange,
|
||||
# http://ole.tange.dk
|
||||
# Copyright (C) 2004-2010 Ole Tange, http://ole.tange.dk
|
||||
#
|
||||
# Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole
|
||||
# Tange, http://ole.tange.dk and Free Software Foundation, Inc.
|
||||
# Copyright (C) 2010-2019 Ole Tange, http://ole.tange.dk and
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -24,11 +23,7 @@
|
|||
use strict;
|
||||
use Getopt::Long;
|
||||
$Global::progname="niceload";
|
||||
<<<<<<< HEAD
|
||||
$Global::version = 20180723;
|
||||
=======
|
||||
$Global::version = 20181124;
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
$Global::version = 20181223;
|
||||
Getopt::Long::Configure("bundling","require_order");
|
||||
get_options_from_array(\@ARGV) || die_usage();
|
||||
if($opt::version) {
|
||||
|
|
|
@ -305,13 +305,11 @@ Copyright (C) 2004-11-19 Ole Tange, http://ole.tange.dk
|
|||
|
||||
Copyright (C) 2005-2010 Ole Tange, http://ole.tange.dk
|
||||
|
||||
Copyright (C) 2010-2018 Ole Tange, http://ole.tange.dk and Free
|
||||
Copyright (C) 2010-2019 Ole Tange, http://ole.tange.dk and Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2010-2018 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
|
|
224
src/parallel
224
src/parallel
|
@ -1,6 +1,6 @@
|
|||
#!/usr/bin/env perl
|
||||
|
||||
# Copyright (C) 2007-2018 Ole Tange and Free Software Foundation, Inc.
|
||||
# Copyright (C) 2007-2019 Ole Tange and Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
@ -526,10 +526,16 @@ sub spreadstdin {
|
|||
# (?!negative lookahead) is needed to avoid backtracking
|
||||
# See: https://unix.stackexchange.com/questions/439356/
|
||||
while($buf =~
|
||||
/# From start up till recend
|
||||
^((?:(?!$recend$recstart).)*?$recend
|
||||
/(
|
||||
# Either recstart or at least one char from start
|
||||
^(?: $recstart | .)
|
||||
# followed something
|
||||
(?:(?!$recend$recstart).)*?
|
||||
# and then recend
|
||||
$recend
|
||||
# Then n-1 times recstart.*recend
|
||||
(?:$recstart(?:(?!$recend$recstart).)*?$recend){$read_n_lines})
|
||||
(?:$recstart(?:(?!$recend$recstart).)*?$recend){$read_n_lines}
|
||||
)
|
||||
# Followed by recstart
|
||||
(?=$recstart)/osx) {
|
||||
$anything_written +=
|
||||
|
@ -1066,7 +1072,7 @@ sub options_hash {
|
|||
"plain" => \$opt::plain,
|
||||
"profile|J=s" => \@opt::profile,
|
||||
"pipe|spreadstdin" => \$opt::pipe,
|
||||
"rr|robin|round-robin|roundrobin" => \$opt::roundrobin,
|
||||
"robin|round-robin|roundrobin" => \$opt::roundrobin,
|
||||
"recstart=s" => \$opt::recstart,
|
||||
"recend=s" => \$opt::recend,
|
||||
"regexp|regex" => \$opt::regexp,
|
||||
|
@ -1077,6 +1083,8 @@ sub options_hash {
|
|||
"gnu" => \$opt::gnu,
|
||||
"link|xapply" => \$opt::link,
|
||||
"linkinputsource|xapplyinputsource=i" => \@opt::linkinputsource,
|
||||
# Before changing this line, please read
|
||||
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
|
||||
"bibtex|citation" => \$opt::citation,
|
||||
"wc|willcite|will-cite|nn|nonotice|no-notice" => \$opt::willcite,
|
||||
# Termination and retries
|
||||
|
@ -1180,6 +1188,8 @@ sub parse_options {
|
|||
my @argv_before = @ARGV;
|
||||
@ARGV = read_options();
|
||||
|
||||
# Before changing this line, please read
|
||||
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
|
||||
if(defined $opt::citation) {
|
||||
citation(\@argv_before,\@ARGV);
|
||||
wait_and_exit(0);
|
||||
|
@ -1283,11 +1293,8 @@ sub parse_options {
|
|||
}
|
||||
$opt::memfree = multiply_binary_prefix($opt::memfree);
|
||||
check_invalid_option_combinations();
|
||||
if((defined $opt::fifo or defined $opt::cat
|
||||
or
|
||||
defined $opt::roundrobin)
|
||||
if((defined $opt::fifo or defined $opt::cat)
|
||||
and not $opt::pipepart) {
|
||||
# --fifo, --cat, and --round-robin => --pipe if not --pipepart
|
||||
$opt::pipe = 1;
|
||||
}
|
||||
if(defined $opt::minversion) {
|
||||
|
@ -1421,14 +1428,7 @@ sub parse_options {
|
|||
#
|
||||
# This problem has been covered by others - though no solution has
|
||||
# been found:
|
||||
#
|
||||
# "Is it alright to compromise or even deliberately ignore the
|
||||
# happiness of the maintainers so that we can enjoy free and open
|
||||
# source software?"
|
||||
# Slide 8 from:
|
||||
# https://www.slideshare.net/NadiaEghbal/consider-the-maintainer
|
||||
#
|
||||
# NumPy has long not had funding:
|
||||
# https://www.numfocus.org/blog/why-is-numpy-only-now-getting-funded/
|
||||
#
|
||||
# Before implementing the citation notice it was discussed with
|
||||
|
@ -1469,20 +1469,19 @@ sub parse_options {
|
|||
# runs. If that is too much trouble for you, why not use one of
|
||||
# the alternatives instead?
|
||||
# See a list in: 'man parallel_alternatives'
|
||||
#
|
||||
# Please read the above before changing this line.
|
||||
citation_notice();
|
||||
|
||||
parse_halt();
|
||||
|
||||
if(defined $ENV{'PARALLEL_ENV'}) {
|
||||
if($ENV{'PARALLEL_ENV'}) {
|
||||
# Read environment and set $Global::parallel_env
|
||||
# Must be done before is_acceptable_command_line_length()
|
||||
my $penv = $ENV{'PARALLEL_ENV'};
|
||||
if(not ($opt::onall or $opt::nonall)) {
|
||||
# unset $PARALLEL_ENV: It should not be given to children
|
||||
# because it takes up a lot of env space
|
||||
# Except when --(n)onall/nonall is set
|
||||
# delete $ENV{'PARALLEL_ENV'};
|
||||
}
|
||||
# unset $PARALLEL_ENV: It should not be given to children
|
||||
# because it takes up a lot of env space
|
||||
delete $ENV{'PARALLEL_ENV'};
|
||||
if(-e $penv) {
|
||||
# This is a file/fifo: Replace envvar with content of file
|
||||
open(my $parallel_env, "<", $penv) ||
|
||||
|
@ -1528,7 +1527,7 @@ sub check_invalid_option_combinations {
|
|||
::wait_and_exit(255);
|
||||
}
|
||||
if(defined $opt::retries and defined $opt::roundrobin) {
|
||||
::error("--retries cannot be combined with --round-robin.");
|
||||
::error("--retries cannot be combined with --roundrobin.");
|
||||
::wait_and_exit(255);
|
||||
}
|
||||
if(defined $opt::pipepart and
|
||||
|
@ -1572,11 +1571,7 @@ sub check_invalid_option_combinations {
|
|||
|
||||
sub init_globals {
|
||||
# Defaults:
|
||||
<<<<<<< HEAD
|
||||
$Global::version = 20180723;
|
||||
=======
|
||||
$Global::version = 20181124;
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
$Global::version = 20181223;
|
||||
$Global::progname = 'parallel';
|
||||
$Global::infinity = 2**31;
|
||||
$Global::debug = 0;
|
||||
|
@ -2180,6 +2175,8 @@ sub arrayindex {
|
|||
# Input:
|
||||
# $arr_ref1 = ref to @array1 to search in
|
||||
# $arr_ref2 = ref to @array2 to search for
|
||||
# Returns:
|
||||
# $pos = position of @array1 in @array2, -1 if not found
|
||||
my ($arr_ref1,$arr_ref2) = @_;
|
||||
my $array1_as_string = join "", map { "\0".$_ } @$arr_ref1;
|
||||
my $array2_as_string = join "", map { "\0".$_ } @$arr_ref2;
|
||||
|
@ -2299,8 +2296,8 @@ sub __QUOTING_ARGUMENTS_FOR_SHELL__ {}
|
|||
sub shell_quote {
|
||||
# Input:
|
||||
# @strings = strings to be quoted
|
||||
# Output:
|
||||
# @shell_quoted_strings = string quoted with \ as needed by the shell
|
||||
# Returns:
|
||||
# @shell_quoted_strings = string quoted as needed by the shell
|
||||
return wantarray ?
|
||||
(map { Q($_) } @_)
|
||||
: (join" ",map { Q($_) } @_);
|
||||
|
@ -2347,7 +2344,11 @@ sub shell_quote_scalar_csh {
|
|||
|
||||
sub shell_quote_scalar_default {
|
||||
# Quote for other shells (Bourne compatibles)
|
||||
my ($par) = $_[0];
|
||||
# Inputs:
|
||||
# $string = string to be quoted
|
||||
# Returns:
|
||||
# $shell_quoted = string quoted as needed by the shell
|
||||
my $par = $_[0];
|
||||
if($par =~ /[^-_.+a-z0-9\/]/i) {
|
||||
$par =~ s/'/'"'"'/g; # "-quote single quotes
|
||||
$par = "'$par'"; # '-quote entire string
|
||||
|
@ -2441,6 +2442,10 @@ sub pQ {
|
|||
|
||||
sub unquote_printf {
|
||||
# Convert \t \n \r \000 \0
|
||||
# Inputs:
|
||||
# $string = string with \t \n \r \num \0
|
||||
# Returns:
|
||||
# $replaced = string with TAB NEWLINE CR <ascii-num> NUL
|
||||
$_ = shift;
|
||||
s/\\t/\t/g;
|
||||
s/\\n/\n/g;
|
||||
|
@ -4276,6 +4281,8 @@ sub usage {
|
|||
" O. Tange (2018): GNU Parallel 2018, Mar 2018, ISBN 9781387509881,",
|
||||
" DOI https://doi.org/10.5281/zenodo.1146014",
|
||||
"",
|
||||
# Before changing this line, please read
|
||||
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
|
||||
"This helps funding further development; AND IT WON'T COST YOU A CENT.",
|
||||
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.",
|
||||
"",
|
||||
|
@ -4304,6 +4311,8 @@ sub citation_notice {
|
|||
" O. Tange (2018): GNU Parallel 2018, Mar 2018, ISBN 9781387509881,",
|
||||
" DOI https://doi.org/10.5281/zenodo.1146014",
|
||||
"",
|
||||
# Before changing this line, please read
|
||||
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
|
||||
"This helps funding further development; AND IT WON'T COST YOU A CENT.",
|
||||
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.",
|
||||
"",
|
||||
|
@ -4384,7 +4393,7 @@ sub version {
|
|||
print join
|
||||
("\n",
|
||||
"GNU $Global::progname $Global::version",
|
||||
"Copyright (C) 2007-2018 Ole Tange and Free Software Foundation, Inc.",
|
||||
"Copyright (C) 2007-2019 Ole Tange and Free Software Foundation, Inc.",
|
||||
"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>",
|
||||
"This is free software: you are free to change and redistribute it.",
|
||||
"GNU $Global::progname comes with no warranty.",
|
||||
|
@ -4424,6 +4433,8 @@ sub citation {
|
|||
"",
|
||||
"(Feel free to use \\nocite{tange_ole_2018_1146014})",
|
||||
"",
|
||||
# Before changing this line, please read
|
||||
# https://www.gnu.org/software/parallel/parallel_design.html#Citation-notice
|
||||
"This helps funding further development; AND IT WON'T COST YOU A CENT.",
|
||||
"If you pay 10000 EUR you should feel free to use GNU Parallel without citing.",
|
||||
"",
|
||||
|
@ -4504,7 +4515,7 @@ sub embed {
|
|||
}
|
||||
print "#!$Global::shell
|
||||
|
||||
# Copyright (C) 2007-2018 $user, Ole Tange and Free Software
|
||||
# Copyright (C) 2007-2019 $user, Ole Tange and Free Software
|
||||
# Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
|
@ -6582,28 +6593,38 @@ sub sct_gnu_linux() {
|
|||
# 'active' => #taskset_threads }
|
||||
my $cpu;
|
||||
local $/ = "\n"; # If delimiter is set, then $/ will be wrong
|
||||
if(-e "/proc/cpuinfo") {
|
||||
if($ENV{'PARALLEL_CPUINFO'} or -e "/proc/cpuinfo") {
|
||||
$cpu->{'sockets'} = 0;
|
||||
$cpu->{'cores'} = 0;
|
||||
$cpu->{'threads'} = 0;
|
||||
my %seen;
|
||||
my %phy_seen;
|
||||
my @cpuinfo;
|
||||
my $physicalid;
|
||||
if(open(my $in_fh, "<", "/proc/cpuinfo")) {
|
||||
while(<$in_fh>) {
|
||||
if(/^physical id.*[:](.*)/ and not $phy_seen{$1}++) {
|
||||
@cpuinfo = <$in_fh>;
|
||||
close $in_fh;
|
||||
}
|
||||
if($ENV{'PARALLEL_CPUINFO'}) {
|
||||
# Use CPUINFO from environment - used for testing only
|
||||
@cpuinfo = split/(?<=\n)/,$ENV{'PARALLEL_CPUINFO'};
|
||||
}
|
||||
for(@cpuinfo) {
|
||||
if(/^physical id.*[:](.*)/) {
|
||||
$physicalid=$1;
|
||||
if(not $phy_seen{$1}++) {
|
||||
$cpu->{'sockets'}++;
|
||||
}
|
||||
if(/^core id.*[:](.*)/ and not $seen{$1}++) {
|
||||
$cpu->{'cores'}++;
|
||||
}
|
||||
/^processor.*[:]/i and $cpu->{'threads'}++;
|
||||
}
|
||||
close $in_fh;
|
||||
if(/^core id.*[:](.*)/ and not $seen{$physicalid,$1}++) {
|
||||
$cpu->{'cores'}++;
|
||||
}
|
||||
/^processor.*[:]/i and $cpu->{'threads'}++;
|
||||
}
|
||||
$cpu->{'sockets'} ||= 1;
|
||||
$cpu->{'cores'} ||= $cpu->{'threads'};
|
||||
}
|
||||
if(-e "/proc/self/status") {
|
||||
if(-e "/proc/self/status" and not $ENV{'PARALLEL_CPUINFO'}) {
|
||||
# if 'taskset' is used to limit number of threads
|
||||
if(open(my $in_fh, "<", "/proc/self/status")) {
|
||||
while(<$in_fh>) {
|
||||
|
@ -8010,12 +8031,10 @@ sub wrapped {
|
|||
# --pipepart: prepend:
|
||||
# < /tmp/foo perl -e 'while(@ARGV) {
|
||||
# sysseek(STDIN,shift,0) || die; $left = shift;
|
||||
# while($read =
|
||||
# sysread(STDIN,$buf,
|
||||
# ($left > 131072 ? 131072 : $left))) {
|
||||
# while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){
|
||||
# $left -= $read; syswrite(STDOUT,$buf);
|
||||
# }
|
||||
# }' 0 0 0 11 |
|
||||
# }' 0 0 0 11 |
|
||||
#
|
||||
# --pipepart --tee: prepend:
|
||||
# < dash-a-file
|
||||
|
@ -8142,7 +8161,7 @@ sub base64_zip_eval {
|
|||
}
|
||||
wait;
|
||||
$SIG{CHLD} = $chld;
|
||||
eval $eval;
|
||||
eval $eval;
|
||||
});
|
||||
::debug("base64",$script,"\n");
|
||||
return $script;
|
||||
|
@ -8203,16 +8222,14 @@ sub sshlogin_wrap {
|
|||
if(not $monitor_parent_sshd_script) {
|
||||
$monitor_parent_sshd_script =
|
||||
# This will be packed in ', so only use "
|
||||
::spacefree(0,'$shell = "'.($ENV{'PARALLEL_SHELL'}
|
||||
|| '$ENV{SHELL}').'";'.
|
||||
'$tmpdir = "'.::pQ($ENV{'TMPDIR'}).'";'.
|
||||
::spacefree(0,'$shell = "'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'.
|
||||
'$tmpdir = "'.::perl_quote_scalar($ENV{'TMPDIR'}).'";'.
|
||||
'$nice = '.$opt::nice.';'.
|
||||
q{
|
||||
# Set $PARALLEL_TMP to a non-existent file name in $TMPDIR
|
||||
do {
|
||||
$ENV{PARALLEL_TMP} = $tmpdir."/par".
|
||||
join"", map
|
||||
{ (0..9,"a".."z","A".."Z")[rand(62)] } (1..5);
|
||||
join"", map { (0..9,"a".."z","A".."Z")[rand(62)] } (1..5);
|
||||
} while(-e $ENV{PARALLEL_TMP});
|
||||
$SIG{CHLD} = sub { $done = 1; };
|
||||
$pid = fork;
|
||||
|
@ -8259,8 +8276,7 @@ sub sshlogin_wrap {
|
|||
local $/ = "\n";
|
||||
# --env _
|
||||
# Include all vars that are not in a clean environment
|
||||
if(open(my $vars_fh,
|
||||
"<", $Global::config_dir . "/ignored_vars")) {
|
||||
if(open(my $vars_fh, "<", $Global::config_dir . "/ignored_vars")) {
|
||||
my @ignore = <$vars_fh>;
|
||||
chomp @ignore;
|
||||
my %ignore;
|
||||
|
@ -8274,10 +8290,8 @@ sub sshlogin_wrap {
|
|||
::wait_and_exit(255);
|
||||
}
|
||||
}
|
||||
# Duplicate vars as BASH functions to include
|
||||
# post-shellshock functions (v1+v2)
|
||||
# So --env myfunc should look for
|
||||
# BASH_FUNC_myfunc() and BASH_FUNC_myfunc%%
|
||||
# Duplicate vars as BASH functions to include post-shellshock functions (v1+v2)
|
||||
# So --env myfunc should look for BASH_FUNC_myfunc() and BASH_FUNC_myfunc%%
|
||||
push(@vars, "PARALLEL_PID", "PARALLEL_SEQ",
|
||||
map { ("BASH_FUNC_$_()", "BASH_FUNC_$_%%") } @vars);
|
||||
# Keep only defined variables
|
||||
|
@ -8308,19 +8322,17 @@ sub sshlogin_wrap {
|
|||
if(@bashfunc) {
|
||||
# Functions are not supported for all shells
|
||||
if($Global::shell !~ m:(bash|rbash|zsh|rzsh|dash|ksh):) {
|
||||
::warning("Shell functions may not be supported in ".
|
||||
"$Global::shell.");
|
||||
::warning("Shell functions may not be supported in $Global::shell.");
|
||||
}
|
||||
$bashfuncset =
|
||||
'@bash_functions=qw('."@bash_functions".");".
|
||||
::spacefree(1,'$shell="'.($ENV{'PARALLEL_SHELL'} ||
|
||||
'$ENV{SHELL}').'";'.q{
|
||||
::spacefree(1,'$shell="'.($ENV{'PARALLEL_SHELL'} || '$ENV{SHELL}').'";'.q{
|
||||
if($shell=~/csh/) {
|
||||
print STDERR "CSH/TCSH DO NOT SUPPORT newlines IN VARIABLES/FUNCTIONS. Unset @bash_functions\n";
|
||||
exec "false";
|
||||
}
|
||||
}).
|
||||
"\n".'$bashfunc = "'.::pQ("@bashfunc").'";';
|
||||
"\n".'$bashfunc = "'.::perl_quote_scalar("@bashfunc").'";';
|
||||
} else {
|
||||
$bashfuncset = '$bashfunc = "";'
|
||||
}
|
||||
|
@ -8352,13 +8364,11 @@ sub sshlogin_wrap {
|
|||
$command = "cd ".::Q($wd)." || exit 255; ".$command;
|
||||
}
|
||||
if(@opt::env) {
|
||||
# Prepend with environment setter,
|
||||
# which sets functions in zsh
|
||||
# Prepend with environment setter, which sets functions in zsh
|
||||
my ($csh_friendly,$envset,$bashfuncset) = env_as_eval();
|
||||
my $perl_code = $envset.$bashfuncset.
|
||||
('@ARGV="'.::pQ($command).'";'.
|
||||
'exec"'.$Global::shell.'",'.
|
||||
'"-c",($bashfunc."@ARGV");die"exec:$!\n";');
|
||||
'@ARGV="'.::perl_quote_scalar($command).'";'.
|
||||
"exec\"$Global::shell\",\"-c\",\(\$bashfunc.\"\@ARGV\"\)\;die\"exec:\$\!\\n\"\;";
|
||||
if(length $perl_code > 999
|
||||
or
|
||||
not $csh_friendly
|
||||
|
@ -8368,11 +8378,7 @@ sub sshlogin_wrap {
|
|||
# csh does not deal well with $ENV with \n
|
||||
$self->{'sshlogin_wrap'}{$command} = base64_wrap($perl_code);
|
||||
} else {
|
||||
<<<<<<< HEAD
|
||||
$self->{'sshlogin_wrap'} = "perl -e ".::Q($perl_code);
|
||||
=======
|
||||
$self->{'sshlogin_wrap'}{$command} = "perl -e ".::Q($perl_code);
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
}
|
||||
} else {
|
||||
$self->{'sshlogin_wrap'}{$command} = $command;
|
||||
|
@ -8383,17 +8389,12 @@ sub sshlogin_wrap {
|
|||
# Create remote workdir if needed. Then cd to it.
|
||||
my $wd = ::pQ($self->workdir());
|
||||
$pwd = qq{system("mkdir","-p","--","$wd"); chdir "$wd" ||}.
|
||||
qq{print(STDERR "parallel: Cannot chdir to $wd\\n") &&}.
|
||||
qq{exit 255;};
|
||||
qq{print(STDERR "parallel: Cannot chdir to $wd\\n") && exit 255;};
|
||||
}
|
||||
my ($csh_friendly,$envset,$bashfuncset) = env_as_eval();
|
||||
my $remote_command = $pwd.$envset.$bashfuncset.
|
||||
<<<<<<< HEAD
|
||||
'@ARGV="'.::pQ($command).'";'. monitor_parent_sshd_script();
|
||||
=======
|
||||
'@ARGV="'.::perl_quote_scalar($command).'";'.
|
||||
monitor_parent_sshd_script();
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
$quoted_remote_command = "perl -e ". ::Q($remote_command);
|
||||
my $dq_remote_command = ::Q($quoted_remote_command);
|
||||
if(length $dq_remote_command > 999
|
||||
|
@ -8405,11 +8406,7 @@ sub sshlogin_wrap {
|
|||
# csh does not deal well with $ENV with \n
|
||||
$quoted_remote_command =
|
||||
"perl -e ". ::Q(::Q(base64_zip_eval()))." ".
|
||||
<<<<<<< HEAD
|
||||
join" ", ::shell_quote(::shell_quote(string_zip_base64($remote_command)));
|
||||
=======
|
||||
join" ",::shell_quote(::shell_quote(string_zip_base64($remote_command)));
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
} else {
|
||||
$quoted_remote_command = $dq_remote_command;
|
||||
}
|
||||
|
@ -8523,24 +8520,17 @@ sub sshreturn {
|
|||
my $sshlogin = $self->sshlogin();
|
||||
my $sshcmd = $sshlogin->sshcommand();
|
||||
my $serverlogin = $sshlogin->serverlogin();
|
||||
<<<<<<< HEAD
|
||||
my $rsync_opts = $ENV{'PARALLEL_RSYNC_OPTS'}." -e".::Q($sshcmd);
|
||||
=======
|
||||
my $rsync_opts = $ENV{'PARALLEL_RSYNC_OPTS'}. " -e". ::Q($sshcmd);
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
my $pre = "";
|
||||
for my $file ($self->return()) {
|
||||
# Remove ./ if any
|
||||
$file =~ s:^\./::g;
|
||||
# Is the path relative or /./?
|
||||
my $relpath = ($file !~ m:^/:) || ($file =~ m:/\./:);
|
||||
$file =~ s:^\./::g; # Remove ./ if any
|
||||
my $relpath = ($file !~ m:^/:) || ($file =~ m:/\./:); # Is the path relative or /./?
|
||||
my $cd = "";
|
||||
my $wd = "";
|
||||
if($relpath) {
|
||||
# rsync -avR /foo/./bar/baz.c remote:/tmp/
|
||||
# == (on old systems)
|
||||
# rsync -avR --rsync-path="cd /foo; rsync"
|
||||
# remote:bar/baz.c /tmp/
|
||||
# rsync -avR --rsync-path="cd /foo; rsync" remote:bar/baz.c /tmp/
|
||||
$wd = ::shell_quote_file($self->workdir()."/");
|
||||
}
|
||||
# Only load File::Basename if actually needed
|
||||
|
@ -8552,12 +8542,7 @@ sub sshreturn {
|
|||
$nobasedir =~ s:.*/\./::;
|
||||
$cd = ::shell_quote_file(::dirname($nobasedir));
|
||||
my $rsync_cd = '--rsync-path='.::Q("cd $wd$cd; rsync");
|
||||
<<<<<<< HEAD
|
||||
my $basename =
|
||||
::shell_quote_scalar(::shell_quote_file(::basename($file)));
|
||||
=======
|
||||
my $basename = ::Q(::shell_quote_file(::basename($file)));
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
# --return
|
||||
# mkdir -p /home/tange/dir/subdir/;
|
||||
# rsync (--protocol 30) -rlDzR
|
||||
|
@ -8582,7 +8567,6 @@ sub sshcleanup {
|
|||
my $cleancmd = "";
|
||||
|
||||
for my $file ($self->remote_cleanup()) {
|
||||
# TODO @subworkdirs not used?
|
||||
my @subworkdirs = parentdirs_of($file);
|
||||
$cleancmd .= $sshlogin->cleanup_cmd($file,$workdir).";";
|
||||
}
|
||||
|
@ -8631,9 +8615,7 @@ sub workdir {
|
|||
$part eq "" and next;
|
||||
$parent .= "/".$part;
|
||||
my ($parent_dev, $parent_ino) = (stat($parent))[0,1];
|
||||
if($parent_dev == $home_dev
|
||||
and
|
||||
$parent_ino == $home_ino) {
|
||||
if($parent_dev == $home_dev and $parent_ino == $home_ino) {
|
||||
# dev and ino is the same: We found the homedir.
|
||||
$workdir = join("/",@dir_parts);
|
||||
last;
|
||||
|
@ -8698,8 +8680,7 @@ sub start {
|
|||
# The eval is needed to catch exception from open3
|
||||
eval {
|
||||
if(not $pid = ::open3($stdin_fh, ">&OUT", ">&ERR", "-")) {
|
||||
# Each child gets its own process group
|
||||
# to make it safe to killall
|
||||
# Each child gets its own process group to make it safe to killall
|
||||
eval{ setpgrp(0,0) };
|
||||
eval{ setpriority(0,0,$opt::nice) };
|
||||
exec($Global::shell,"-c",$command)
|
||||
|
@ -8731,8 +8712,7 @@ sub start {
|
|||
"exec '$Global::shell', '-c', \@ARGV");
|
||||
# The eval is needed to catch exception from open3
|
||||
eval {
|
||||
$pid = ::open3($stdin_fh, ">&OUT", ">&ERR",
|
||||
@setpgrp_wrap, $command)
|
||||
$pid = ::open3($stdin_fh, ">&OUT", ">&ERR", @setpgrp_wrap, $command)
|
||||
|| ::die_bug("open3-$stdin_fh");
|
||||
1;
|
||||
};
|
||||
|
@ -9075,7 +9055,7 @@ sub print {
|
|||
if($Global::joblog and defined $self->{'exitstatus'}) {
|
||||
# Add to joblog when finished
|
||||
$self->print_joblog();
|
||||
# Printing is only relevant for grouped/--line-buffer output
|
||||
# Printing is only relevant for grouped/--line-buffer output.
|
||||
$opt::ungroup and return;
|
||||
}
|
||||
}
|
||||
|
@ -9096,8 +9076,7 @@ sub print {
|
|||
}
|
||||
next;
|
||||
}
|
||||
::debug("print",
|
||||
"File descriptor $fdno (", $self->fh($fdno,"name"), "):\n");
|
||||
::debug("print", "File descriptor $fdno (", $self->fh($fdno,"name"), "):\n");
|
||||
if($opt::linebuffer) {
|
||||
# Line buffered print out
|
||||
$self->print_linebuffer($fdno,$in_fh,$out_fd);
|
||||
|
@ -9158,8 +9137,7 @@ sub print {
|
|||
print $Global::csv_fh
|
||||
(map { $$_ }
|
||||
combine_ref("Seq", "Host", "Starttime", "JobRuntime",
|
||||
"Send", "Receive", "Exitval", "Signal",
|
||||
"Command",
|
||||
"Send", "Receive", "Exitval", "Signal", "Command",
|
||||
@V,
|
||||
"Stdout","Stderr"
|
||||
)),"\n";
|
||||
|
@ -9565,8 +9543,7 @@ sub set_exitsignal {
|
|||
# --halt now,fail=X% or soon,fail=X%
|
||||
# --halt now,done=X% or soon,done=X%
|
||||
$Global::halt_exitstatus =
|
||||
::ceil($Global::total_failed / $total_jobs
|
||||
* 100);
|
||||
::ceil($Global::total_failed / $total_jobs * 100);
|
||||
} elsif($Global::halt_count) {
|
||||
# --halt now,fail=X or soon,fail=X
|
||||
# --halt now,done=X or soon,done=X
|
||||
|
@ -9580,8 +9557,7 @@ sub set_exitsignal {
|
|||
$Global::halt_exitstatus =
|
||||
($job->exitstatus()
|
||||
or
|
||||
$job->exitsignal() ?
|
||||
$job->exitsignal() + 128 : 0);
|
||||
$job->exitsignal() ? $job->exitsignal() + 128 : 0);
|
||||
}
|
||||
}
|
||||
::debug("halt","Pct: ",$Global::halt_pct,
|
||||
|
@ -9731,8 +9707,7 @@ sub slot {
|
|||
}
|
||||
|
||||
if(defined $self->{'max_number_of_args'}) {
|
||||
if($self->number_of_args() >=
|
||||
$self->{'max_number_of_args'}) {
|
||||
if($self->number_of_args() >= $self->{'max_number_of_args'}) {
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
@ -9744,13 +9719,11 @@ sub slot {
|
|||
$already_spread ||= 1;
|
||||
if($self->number_of_args() > 1) {
|
||||
$self->{'max_number_of_args'} =
|
||||
::ceil($self->number_of_args() /
|
||||
$Global::max_jobs_running);
|
||||
::ceil($self->number_of_args()/$Global::max_jobs_running);
|
||||
$Global::JobQueue->{'commandlinequeue'}->{'max_number_of_args'} =
|
||||
$self->{'max_number_of_args'};
|
||||
$self->{'arg_queue'}->unget($self->pop_all());
|
||||
while($self->number_of_args() <
|
||||
$self->{'max_number_of_args'}) {
|
||||
while($self->number_of_args() < $self->{'max_number_of_args'}) {
|
||||
$self->push($self->{'arg_queue'}->get());
|
||||
}
|
||||
}
|
||||
|
@ -9758,8 +9731,7 @@ sub slot {
|
|||
}
|
||||
|
||||
if($opt::sqlmaster) {
|
||||
# Insert the V1..Vn for this $seq in SQL table
|
||||
# instead of generating one
|
||||
# Insert the V1..Vn for this $seq in SQL table instead of generating one
|
||||
$Global::sql->insert_records($self->seq(), $self->{'command'},
|
||||
$self->{'arg_list_flat_orig'});
|
||||
}
|
||||
|
@ -10119,8 +10091,8 @@ sub replace_placeholders {
|
|||
# \257<...\257> or space
|
||||
$_
|
||||
} else {
|
||||
# Split each space into a token
|
||||
split /(?= )|(?<= )/
|
||||
# Split each space/tab into a token
|
||||
split /(?=\s)|(?<=\s)/
|
||||
}
|
||||
}
|
||||
# Split \257< ... \257> into own token
|
||||
|
@ -10157,7 +10129,7 @@ sub replace_placeholders {
|
|||
my @ctxgroup;
|
||||
for my $t (@tokens,"\0end") {
|
||||
# \0end = last token was end of tokens.
|
||||
if($t eq " " or $t eq "\0end" or $t eq "\0spc") {
|
||||
if($t eq "\t" or $t eq " " or $t eq "\0end" or $t eq "\0spc") {
|
||||
# Context group complete: Replace in it
|
||||
if(grep { /^\257</ } @ctxgroup) {
|
||||
# Context group contains a replacement string:
|
||||
|
|
|
@ -1054,7 +1054,7 @@ to see the difference:
|
|||
If used with B<--onall> or B<--nonall> the output will grouped by
|
||||
sshlogin in sorted order.
|
||||
|
||||
If used with B<--pipe --round-robin> and the same input, the jobslots
|
||||
If used with B<--pipe --roundrobin> and the same input, the jobslots
|
||||
will get the same blocks in the same order in every run.
|
||||
|
||||
|
||||
|
@ -1460,32 +1460,20 @@ on remote computers).
|
|||
Print the number of physical CPU cores and exit.
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
=item B<--number-of-cores> (beta testing)
|
||||
=======
|
||||
=item B<--number-of-cores>
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
|
||||
Print the number of physical CPU cores and exit (used by GNU B<parallel> itself
|
||||
to determine the number of physical CPU cores on remote computers).
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
=item B<--number-of-sockets> (beta testing)
|
||||
=======
|
||||
=item B<--number-of-sockets>
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
|
||||
Print the number of filled CPU sockets and exit (used by GNU
|
||||
B<parallel> itself to determine the number of filled CPU sockets on
|
||||
remote computers).
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
=item B<--number-of-threads> (beta testing)
|
||||
=======
|
||||
=item B<--number-of-threads>
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
|
||||
Print the number of hyperthreaded CPU cores and exit (used by GNU
|
||||
B<parallel> itself to determine the number of hyperthreaded CPU cores
|
||||
|
@ -1897,8 +1885,6 @@ with B<--sshlogin>.
|
|||
|
||||
=item B<--round>
|
||||
|
||||
=item B<--rr>
|
||||
|
||||
Normally B<--pipe> will give a single block to each instance of the
|
||||
command. With B<--round-robin> all blocks will at random be written to
|
||||
commands already running. This is useful if the command takes a long
|
||||
|
@ -2590,15 +2576,9 @@ Use the replacement string I<replace-str> instead of B<{.}> for input
|
|||
line without extension.
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
=item B<--use-sockets-instead-of-threads> (beta testing)
|
||||
|
||||
=item B<--use-cores-instead-of-threads> (beta testing)
|
||||
=======
|
||||
=item B<--use-sockets-instead-of-threads>
|
||||
|
||||
=item B<--use-cores-instead-of-threads>
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
|
||||
=item B<--use-cpus-instead-of-cores> (obsolete)
|
||||
|
||||
|
@ -4897,7 +4877,7 @@ Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
|
|||
|
||||
Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
|
||||
|
||||
Copyright (C) 2010-2018 Ole Tange,
|
||||
Copyright (C) 2010-2019 Ole Tange,
|
||||
http://ole.tange.dk and Free Software Foundation, Inc.
|
||||
|
||||
Parts of the manual concerning B<xargs> compatibility is inspired by
|
||||
|
@ -4906,8 +4886,6 @@ the manual of B<xargs> from GNU findutils 4.4.2.
|
|||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2007-2018 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
|
|
|
@ -1728,7 +1728,7 @@ https://github.com/john01dav/spp
|
|||
|
||||
Url for spread
|
||||
|
||||
|
||||
https://github.com/xuchenCN/go-pssh
|
||||
|
||||
https://github.com/amritb/with-this.git
|
||||
|
||||
|
@ -1951,7 +1951,7 @@ Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
|
|||
|
||||
Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
|
||||
|
||||
Copyright (C) 2010-2018 Ole Tange, http://ole.tange.dk and Free
|
||||
Copyright (C) 2010-2019 Ole Tange, http://ole.tange.dk and Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
Parts of the manual concerning B<xargs> compatibility is inspired by
|
||||
|
@ -1960,8 +1960,6 @@ the manual of B<xargs> from GNU findutils 4.4.2.
|
|||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2007-2018 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
|
|
|
@ -1235,6 +1235,11 @@ saying "Do not show this again". But if that is too much trouble for
|
|||
you, why not use one of the alternatives instead? See a list in:
|
||||
B<man parallel_alternatives>.
|
||||
|
||||
As the request for citation is not a legal requirement this is
|
||||
acceptable under GPLv3 and cleared with Richard M. Stallman
|
||||
himself. Thus it does not fall under this:
|
||||
https://www.gnu.org/licenses/gpl-faq.en.html#RequireCitation
|
||||
|
||||
|
||||
=head1 Ideas for new design
|
||||
|
||||
|
|
|
@ -3139,7 +3139,7 @@ https://my.fsf.org/donate/
|
|||
|
||||
=back
|
||||
|
||||
(C) 2013-2018 Ole Tange, GPLv3
|
||||
(C) 2013-2019 Ole Tange, FDLv1.3 (See fdl.txt)
|
||||
|
||||
|
||||
=cut
|
||||
|
|
|
@ -60,13 +60,11 @@ GNU B<parcat> is part of GNU B<parallel>. Report bugs to
|
|||
|
||||
=head1 AUTHOR
|
||||
|
||||
Copyright (C) 2016,2017,2018 Ole Tange, http://ole.tange.dk and Free
|
||||
Copyright (C) 2016-2019 Ole Tange, http://ole.tange.dk and Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2007,2008,2009,2010,2011 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (C) 2016,2017,2018
|
||||
# Ole Tange and Free Software Foundation, Inc.
|
||||
# Copyright (C) 2016-2019 Ole Tange, http://ole.tange.dk and
|
||||
# Free Software Foundation, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -182,14 +182,12 @@ Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
|
|||
|
||||
Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
|
||||
|
||||
Copyright (C) 2010-2018 Ole Tange,
|
||||
http://ole.tange.dk and Free Software Foundation, Inc.
|
||||
Copyright (C) 2010-2019 Ole Tange, http://ole.tange.dk and Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2016 Ole Tange and Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
|
|
|
@ -244,14 +244,12 @@ Report bugs to <bug-parallel@gnu.org>.
|
|||
|
||||
=head1 AUTHOR
|
||||
|
||||
Copyright (C) 2010-2018 Ole Tange,
|
||||
http://ole.tange.dk and Free Software Foundation, Inc.
|
||||
Copyright (C) 2010-2019 Ole Tange, http://ole.tange.dk and Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2010,2011,2012,2013 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
|
|
14
src/sql
14
src/sql
|
@ -339,15 +339,13 @@ When using GNU B<sql> for a publication please cite:
|
|||
O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different
|
||||
Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32.
|
||||
|
||||
Copyright (C) 2008,2009,2010 Ole Tange http://ole.tange.dk
|
||||
Copyright (C) 2008-2010 Ole Tange http://ole.tange.dk
|
||||
|
||||
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018 Ole Tange,
|
||||
http://ole.tange.dk and Free Software Foundation, Inc.
|
||||
Copyright (C) 2010-2019 Ole Tange, http://ole.tange.dk and Free
|
||||
Software Foundation, Inc.
|
||||
|
||||
=head1 LICENSE
|
||||
|
||||
Copyright (C) 2007,2008,2009,2010,2011 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
|
@ -576,11 +574,7 @@ $Global::Initfile && unlink $Global::Initfile;
|
|||
exit ($err);
|
||||
|
||||
sub parse_options {
|
||||
<<<<<<< HEAD
|
||||
$Global::version = 20180723;
|
||||
=======
|
||||
$Global::version = 20181124;
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
$Global::version = 20181223;
|
||||
$Global::progname = 'sql';
|
||||
|
||||
# This must be done first as this may exec myself
|
||||
|
|
|
@ -664,7 +664,9 @@ par_X_eta_div_zero() {
|
|||
# We do not care how long it took
|
||||
seq 2 | stdout parallel -X --eta echo |
|
||||
grep -E -v 'ETA:.*AVG' |
|
||||
perl -pe 's/\d+/0/g'
|
||||
perl -pe 's/\d+/0/g' |
|
||||
perl -pe 's/Comp.* to complete//' |
|
||||
perl -ne '/../ and print'
|
||||
}
|
||||
|
||||
par_parcat_args_stdin() {
|
||||
|
@ -777,7 +779,12 @@ par_slow_pipe_regexp() {
|
|||
echo "### bug #53718: --pipe --regexp -N blocks"
|
||||
echo This should take a few ms, but took more than 2 hours
|
||||
seq 54000 80000 |
|
||||
timeout -k 1 60 parallel -N1000 --regexp --pipe --recstart 4 --recend 5 -k wc
|
||||
parallel -N1000 --regexp --pipe --recstart 4 --recend 5 -k wc
|
||||
echo "### These should give same output"
|
||||
seq 54000 80000 |
|
||||
parallel -N1000 --regexp --pipe --recstart 4 --recend 5 -k cat |
|
||||
md5sum
|
||||
seq 54000 80000 | md5sum
|
||||
}
|
||||
|
||||
par_results() {
|
||||
|
@ -865,6 +872,15 @@ par_space_envvar() {
|
|||
export PARALLEL=" -v" && parallel echo ::: 'space in envvar OK'
|
||||
}
|
||||
|
||||
par_pipe_N1_regexp() {
|
||||
echo 'bug #55131: --regexp --recstart hangs'
|
||||
echo "These should give the same"
|
||||
printf 'begin\n%send\n' '' a b c |
|
||||
parallel -kN1 --recstart 'begin\n' --pipe --regexp echo JOB{#}\;cat\;echo END
|
||||
printf 'begin\n%send\n' '' a b c |
|
||||
parallel -kN1 --recstart 'begin\n' --pipe echo JOB{#}\;cat\;echo END
|
||||
}
|
||||
|
||||
export -f $(compgen -A function | grep par_)
|
||||
compgen -A function | grep par_ | LC_ALL=C sort |
|
||||
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'
|
||||
parallel --timeout 20 -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -147,11 +147,6 @@ par_no_table() {
|
|||
export -f $(compgen -A function | egrep 'p_|par_')
|
||||
# Tested that -j0 in parallel is fastest (up to 15 jobs)
|
||||
# more than 3 jobs: sqlite locks
|
||||
<<<<<<< HEAD
|
||||
compgen -A function | grep par_ | sort |
|
||||
stdout parallel --timeout 250 -vj40% -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \
|
||||
=======
|
||||
compgen -A function | grep par_ | LC_ALL=C sort |
|
||||
stdout parallel --timeout 200 -vj3 -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \
|
||||
>>>>>>> 8286e771ec57e60ee17aee87741fe96790880db7
|
||||
:::: - ::: \$MYSQL \$PG \$SQLITE
|
||||
|
|
|
@ -791,6 +791,7 @@ par_fish_underscore() {
|
|||
echo "### Testing of --env _"
|
||||
|
||||
# . `which env_parallel.fish`;
|
||||
true > ~/.parallel/ignored_vars;
|
||||
|
||||
alias not_copied_alias="echo BAD"
|
||||
function not_copied_func
|
||||
|
@ -818,7 +819,7 @@ par_fish_underscore() {
|
|||
env_parallel --env _ -S server echo \$not_copied_var ::: error=OK;
|
||||
env_parallel --env _ -S server echo \$not_copied_array ::: error=OK;
|
||||
|
||||
echo myvar >> ~/.parallel/ignored_vars;
|
||||
echo myvar > ~/.parallel/ignored_vars;
|
||||
env_parallel --env _ myfunc ::: work;
|
||||
env_parallel --env _ -S server myfunc ::: work;
|
||||
echo myarray >> ~/.parallel/ignored_vars;
|
||||
|
@ -1213,13 +1214,13 @@ _EOF
|
|||
|
||||
par_fish_funky() {
|
||||
myscript=$(cat <<'_EOF'
|
||||
echo "Fish is broken"
|
||||
env_parallel --session
|
||||
set myvar "myvar works"
|
||||
setenv myenvvar "myenvvar works"
|
||||
|
||||
set funky (perl -e "print pack \"c*\", 1..255")
|
||||
setenv funkyenv (perl -e "print pack \"c*\", 1..255")
|
||||
# 10 and 30 cause problems
|
||||
setenv funkyenv (perl -e "print pack \"c*\", 1..9,11..29,31..255")
|
||||
|
||||
set myarray "" array_val2 3 "" 5 " space 6 "
|
||||
|
||||
|
@ -1511,7 +1512,6 @@ _EOF
|
|||
|
||||
par_fish_env_parallel() {
|
||||
myscript=$(cat <<'_EOF'
|
||||
echo "Fish is broken"
|
||||
echo 'bug #50435: Remote fifo broke in 20150522'
|
||||
# Due to $PARALLEL_TMP being transferred
|
||||
set OK OK
|
||||
|
|
|
@ -81,6 +81,7 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/
|
|||
s{rsync: link_stat ".*/home/parallel/input_file.out" .*\n}{};
|
||||
s{rsync error: some files/attrs were not transferred .*\n}{};
|
||||
s{.* GtkDialog .*\n}{};
|
||||
s{tried 1}{};
|
||||
' |
|
||||
perl -ne '/GTK2_RC_FILES/ and next;
|
||||
/GTK_RC_FILES/ and next;
|
||||
|
|
|
@ -1251,7 +1251,6 @@ par_PARALLEL_ENV OK as file
|
|||
par_PARALLEL_ENV ### PARALLEL_ENV as fifo
|
||||
par_PARALLEL_ENV OK as fifo
|
||||
par_X_eta_div_zero ### bug #34422: parallel -X --eta crashes with div by zero
|
||||
par_X_eta_div_zero 0
|
||||
par_X_eta_div_zero Computers / CPU cores / Max jobs to run
|
||||
par_X_eta_div_zero 0:local / 0 / 0
|
||||
par_append_joblog ### can you append to a joblog using +
|
||||
|
@ -1391,6 +1390,40 @@ par_parcat_rm bug #51691: parcat --rm remove fifo when opened
|
|||
par_parcat_rm OK1
|
||||
par_parcat_rm OK file removed
|
||||
par_perlexpr_with_newline Perl expression spanning 2 lines
|
||||
par_pipe_N1_regexp bug #55131: --regexp --recstart hangs
|
||||
par_pipe_N1_regexp These should give the same
|
||||
par_pipe_N1_regexp JOB1
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp end
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_N1_regexp JOB2
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp aend
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_N1_regexp JOB3
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp bend
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_N1_regexp JOB4
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp cend
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_N1_regexp JOB1
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp end
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_N1_regexp JOB2
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp aend
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_N1_regexp JOB3
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp bend
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_N1_regexp JOB4
|
||||
par_pipe_N1_regexp begin
|
||||
par_pipe_N1_regexp cend
|
||||
par_pipe_N1_regexp END
|
||||
par_pipe_no_command ### --pipe without command
|
||||
par_pipe_no_command parallel: Error: --pipe/--pipepart must have a command to pipe into (e.g. 'cat').
|
||||
par_pipe_recend bug #54328: --pipe --recend blocks
|
||||
|
@ -1481,8 +1514,11 @@ par_retries_replacement_string 33
|
|||
par_retries_replacement_string 33
|
||||
par_slow_pipe_regexp ### bug #53718: --pipe --regexp -N blocks
|
||||
par_slow_pipe_regexp This should take a few ms, but took more than 2 hours
|
||||
par_slow_pipe_regexp 979 980 5875
|
||||
par_slow_pipe_regexp 25022 25022 150131
|
||||
par_slow_pipe_regexp 980 981 5881
|
||||
par_slow_pipe_regexp 25021 25021 150125
|
||||
par_slow_pipe_regexp ### These should give same output
|
||||
par_slow_pipe_regexp 6e72d7f86f6a423b9a7fa97630587815 -
|
||||
par_slow_pipe_regexp 6e72d7f86f6a423b9a7fa97630587815 -
|
||||
par_space_envvar ### bug: --gnu was ignored if env var started with space: PARALLEL=' --gnu'
|
||||
par_space_envvar echo 'space in envvar OK'
|
||||
par_space_envvar space in envvar OK
|
||||
|
|
|
@ -619,6 +619,12 @@ par_test_XI_mI a7 b1 2 3 4 5 6 7
|
|||
par_test_XI_mI a8 b1 2 3 4 5 6 7 8
|
||||
par_test_XI_mI a9 b1 2 3 4 5 6 7 8 9
|
||||
par_test_XI_mI a10 b1 2 3 4 5 6 7 8 9 10
|
||||
par_test_cpu_detection 2-8-8-8 2 8 8 8
|
||||
par_test_cpu_detection 1-4-8-4 1 4 8 4
|
||||
par_test_cpu_detection 1-2-4-2 1 2 4 2
|
||||
par_test_cpu_detection 1-2-2-2 1 2 2 2
|
||||
par_test_cpu_detection 2-24-48-24 2 24 48 24
|
||||
par_test_cpu_detection 1-2-2-2 1 2 2 2
|
||||
par_too_long_line_X bug #54869: Long lines break
|
||||
par_too_long_line_X 1 29302 131012
|
||||
par_too_long_line_X 1 12698 63490
|
||||
|
|
|
@ -4,7 +4,7 @@ par_pipe_retries 165668 165668 1048571
|
|||
par_pipe_retries localhost-:
|
||||
par_pipe_retries 134362 134362 940534
|
||||
par_pipe_retries localhost-:
|
||||
par_pipe_retries parallel: Error: --retries cannot be combined with --round-robin.
|
||||
par_pipe_retries parallel: Error: --retries cannot be combined with --roundrobin.
|
||||
par_lsh ### --ssh lsh
|
||||
par_lsh parallel: Warning: Could not figure out number of cpus on lo (). Using 1.
|
||||
par_lsh OK
|
||||
|
|
|
@ -61,7 +61,7 @@ echo '### Check that 4 processes are really used'
|
|||
echo '### --version must have higher priority than retired options'
|
||||
### --version must have higher priority than retired options
|
||||
$NICEPAR --version -g -Y -U -W -T | tail
|
||||
GNU parallel 20181124
|
||||
GNU parallel 20181202
|
||||
Copyright (C) 2007-2018 Ole Tange and Free Software Foundation, Inc.
|
||||
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
||||
This is free software: you are free to change and redistribute it.
|
||||
|
|
|
@ -654,9 +654,9 @@ echo X; exit X
|
|||
completed 1
|
||||
completed 2
|
||||
completed 0
|
||||
tried 1
|
||||
|
||||
tried 0
|
||||
tried 1
|
||||
|
||||
show_signals() {
|
||||
perl -e 'for(keys %SIG) {
|
||||
$SIG{$_} = eval "sub { print \"Got $_\\n\"; }";
|
||||
|
@ -1440,8 +1440,8 @@ Start 4
|
|||
Slow started
|
||||
Forced running after 1 sec
|
||||
Slow ended
|
||||
Give up after 2 secs
|
||||
parallel: Warning: Semaphore timed out. Stealing the semaphore.
|
||||
parallel: Warning: Semaphore timed out. Exiting.
|
||||
parallel --help
|
||||
Usage:
|
||||
|
||||
|
|
Loading…
Reference in a new issue