From c36cb46a231ebf450d6bcbd76d0fe14776dd3e01 Mon Sep 17 00:00:00 2001 From: Ole Tange Date: Sun, 14 Jul 2019 16:48:57 +0200 Subject: [PATCH] parallel: Fixed bug #56578: --lb --tag misses some lines. parallel: Experimental (buggy) --bin. --- README | 4 + doc/release_new_version | 4 +- src/env_parallel.ash | 32 ++- src/env_parallel.bash | 36 ++- src/env_parallel.csh | 3 +- src/env_parallel.dash | 32 ++- src/env_parallel.fish | 3 +- src/env_parallel.ksh | 32 ++- src/env_parallel.mksh | 32 ++- src/env_parallel.pdksh | 64 ++--- src/env_parallel.sh | 32 ++- src/env_parallel.tcsh | 3 +- src/env_parallel.zsh | 32 ++- src/parallel | 97 ++++++- src/parallel.pod | 31 +- testsuite/tests-to-run/parallel-local-0.3s.sh | 14 + .../tests-to-run/parallel-local-race02.sh | 2 +- testsuite/tests-to-run/parallel-local-ssh5.sh | 3 +- testsuite/tests-to-run/parallel-local-ssh7.sh | 3 +- testsuite/wanted-results/parallel-local-0.3s | 21 +- testsuite/wanted-results/parallel-local-10s | 40 +-- testsuite/wanted-results/parallel-local-3s | 6 +- testsuite/wanted-results/parallel-local-ssh7 | 270 +++++++++--------- 23 files changed, 471 insertions(+), 325 deletions(-) diff --git a/README b/README index 8268f145..fe0bf0a7 100644 --- a/README +++ b/README @@ -55,6 +55,8 @@ document. Full installation of GNU Parallel is as simple as: wget https://ftpmirror.gnu.org/parallel/parallel-20190622.tar.bz2 + wget https://ftpmirror.gnu.org/parallel/parallel-20190622.tar.bz2.sig + gpg parallel-20190622.tar.bz2.sig bzip2 -dc parallel-20190622.tar.bz2 | tar xvf - cd parallel-20190622 ./configure && make && sudo make install @@ -66,6 +68,8 @@ 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-20190622.tar.bz2 + wget https://ftpmirror.gnu.org/parallel/parallel-20190622.tar.bz2.sig + gpg parallel-20190622.tar.bz2.sig bzip2 -dc parallel-20190622.tar.bz2 | tar xvf - cd parallel-20190622 ./configure --prefix=$HOME && make && make install diff --git a/doc/release_new_version b/doc/release_new_version index 94b4deb8..2ac23396 100644 --- a/doc/release_new_version +++ b/doc/release_new_version @@ -206,7 +206,7 @@ from:tange@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org stable-bcc: Jesse Alama -Subject: GNU Parallel 20190722 ('') released <<[stable]>> +Subject: GNU Parallel 20190722 ('Ryugu') released <<[stable]>> GNU Parallel 20190722 ('') <<[stable]>> has been released. It is available for download at: http://ftpmirror.gnu.org/parallel/ @@ -230,6 +230,8 @@ New in this release: * Speedup of startup by 40%: Find the parent shell differerently on GNU/Linux, cache information about the CPU and which setpgrp method to use to make GNU Parallel start 40% faster. +https://zalinux.ru/?p=2623 + https://techieroop.com/how-to-run-multiple-bash-scripts-in-parallel/ https://blogs.oracle.com/solaris/announcing-oracle-solaris-114-sru10 diff --git a/src/env_parallel.ash b/src/env_parallel.ash index b842d7f9..86a4fb8b 100755 --- a/src/env_parallel.ash +++ b/src/env_parallel.ash @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -215,9 +214,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" + unset _get_ignored_VARS # --record-env if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then @@ -298,17 +299,22 @@ env_parallel() { $_list_variable_VALUES; `" export PARALLEL_ENV - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - unset _grep_REGEXP - unset _ignore_UNDERSCORE + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV # Test if environment is too big if `_which_PAR true` >/dev/null 2>/dev/null ; then - parallel "$@"; + parallel "$@" _parallel_exit_CODE=$? - unset PARALLEL_ENV; - return $_parallel_exit_CODE + # Clean up variables/functions + unset PARALLEL_ENV + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" else unset PARALLEL_ENV; _error_PAR "Your environment is too big." @@ -404,5 +410,7 @@ _parset_main() { perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" fi - return `cat "$_exit_FILE"; rm "$_exit_FILE"` + unset _parset_NAME _parset_PARALLEL_PRG _parallel_exit_CODE + # Unset _exit_FILE before return + eval "unset _exit_FILE; return \`cat $_exit_FILE; rm $_exit_FILE\`" } diff --git a/src/env_parallel.bash b/src/env_parallel.bash index 1accf187..6dc92b61 100755 --- a/src/env_parallel.bash +++ b/src/env_parallel.bash @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -207,9 +206,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" + unset _get_ignored_VARS # --record-env # Bash is broken in version 3.2.25 and 4.2.39 @@ -251,6 +252,8 @@ env_parallel() { export PARALLEL_IGNORED_NAMES return 0 fi + # Bash is broken in version 3.2.25 and 4.2.39 + # The crazy '[ "`...`" == 0 ]' is needed for the same reason if [ "`perl -e 'exit grep { /^--end.?session$/ } @ARGV' -- "$@"; echo $?`" == 0 ] ; then true skip else @@ -298,17 +301,22 @@ env_parallel() { $_list_variable_VALUES; `" export PARALLEL_ENV - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - unset _grep_REGEXP - unset _ignore_UNDERSCORE + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV # Test if environment is too big if [ "`_which_PAR true`" == "$_which_TRUE" ] ; then - parallel "$@"; + parallel "$@" _parallel_exit_CODE=$? - unset PARALLEL_ENV; - return $_parallel_exit_CODE + # Clean up variables/functions + unset PARALLEL_ENV + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" else unset PARALLEL_ENV; _error_PAR "Your environment is too big." @@ -401,8 +409,10 @@ _parset_main() { eval "$_parset_NAME=( $( # Compute results into files. Save exit value ($_parset_PARALLEL_PRG --files -k "$@"; echo $? > "$_exit_FILE") | - perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' + perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" fi - return `cat "$_exit_FILE"; rm "$_exit_FILE"` + unset _parset_NAME _parset_PARALLEL_PRG _parallel_exit_CODE + # Unset _exit_FILE before return + eval "unset _exit_FILE; return \`cat $_exit_FILE; rm $_exit_FILE\`" } diff --git a/src/env_parallel.csh b/src/env_parallel.csh index ae7a2562..83289093 100755 --- a/src/env_parallel.csh +++ b/src/env_parallel.csh @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 diff --git a/src/env_parallel.dash b/src/env_parallel.dash index 20a0f833..e9666991 100755 --- a/src/env_parallel.dash +++ b/src/env_parallel.dash @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -215,9 +214,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" + unset _get_ignored_VARS # --record-env if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then @@ -298,17 +299,22 @@ env_parallel() { $_list_variable_VALUES; `" export PARALLEL_ENV - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - unset _grep_REGEXP - unset _ignore_UNDERSCORE + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV # Test if environment is too big if `_which_PAR true` >/dev/null 2>/dev/null ; then - parallel "$@"; + parallel "$@" _parallel_exit_CODE=$? - unset PARALLEL_ENV; - return $_parallel_exit_CODE + # Clean up variables/functions + unset PARALLEL_ENV + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" else unset PARALLEL_ENV; _error_PAR "Your environment is too big." @@ -404,5 +410,7 @@ _parset_main() { perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" fi - return `cat "$_exit_FILE"; rm "$_exit_FILE"` + unset _parset_NAME _parset_PARALLEL_PRG _parallel_exit_CODE + # Unset _exit_FILE before return + eval "unset _exit_FILE; return \`cat $_exit_FILE; rm $_exit_FILE\`" } diff --git a/src/env_parallel.fish b/src/env_parallel.fish index 189b1023..1fe45e75 100755 --- a/src/env_parallel.fish +++ b/src/env_parallel.fish @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 diff --git a/src/env_parallel.ksh b/src/env_parallel.ksh index fecabfca..6a312047 100755 --- a/src/env_parallel.ksh +++ b/src/env_parallel.ksh @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -198,9 +197,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" + unset _get_ignored_VARS # --record-env if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then @@ -281,17 +282,22 @@ env_parallel() { $_list_variable_VALUES; `" export PARALLEL_ENV - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - unset _grep_REGEXP - unset _ignore_UNDERSCORE + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV # Test if environment is too big if `_which_PAR true` >/dev/null 2>/dev/null ; then - parallel "$@"; + parallel "$@" _parallel_exit_CODE=$? - unset PARALLEL_ENV; - return $_parallel_exit_CODE + # Clean up variables/functions + unset PARALLEL_ENV + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" else unset PARALLEL_ENV; _error_PAR "Your environment is too big." @@ -387,5 +393,7 @@ _parset_main() { perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" fi - return `cat "$_exit_FILE"; rm "$_exit_FILE"` + unset _parset_NAME _parset_PARALLEL_PRG _parallel_exit_CODE + # Unset _exit_FILE before return + eval "unset _exit_FILE; return \`cat $_exit_FILE; rm $_exit_FILE\`" } diff --git a/src/env_parallel.mksh b/src/env_parallel.mksh index fed2f8c6..5fe13e62 100644 --- a/src/env_parallel.mksh +++ b/src/env_parallel.mksh @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -201,9 +200,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" + unset _get_ignored_VARS # --record-env if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then @@ -284,17 +285,22 @@ env_parallel() { $_list_variable_VALUES; `" export PARALLEL_ENV - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - unset _grep_REGEXP - unset _ignore_UNDERSCORE + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV # Test if environment is too big if `_which_PAR true` >/dev/null 2>/dev/null ; then - parallel "$@"; + parallel "$@" _parallel_exit_CODE=$? - unset PARALLEL_ENV; - return $_parallel_exit_CODE + # Clean up variables/functions + unset PARALLEL_ENV + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" else unset PARALLEL_ENV; _error_PAR "Your environment is too big." @@ -390,5 +396,7 @@ _parset_main() { perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" fi - return `cat "$_exit_FILE"; rm "$_exit_FILE"` + unset _parset_NAME _parset_PARALLEL_PRG _parallel_exit_CODE + # Unset _exit_FILE before return + eval "unset _exit_FILE; return \`cat $_exit_FILE; rm $_exit_FILE\`" } diff --git a/src/env_parallel.pdksh b/src/env_parallel.pdksh index 33077f79..55ea2586 100755 --- a/src/env_parallel.pdksh +++ b/src/env_parallel.pdksh @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -114,44 +113,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" - - # Get the --env variables if set - # --env _ should be ignored - # and convert a b c to (a|b|c) - # If --env not set: Match everything (.*) - _grep_REGEXP="$( - perl -e ' - for(@ARGV){ - /^_$/ and $next_is_env = 0; - $next_is_env and push @envvar, split/,/, $_; - $next_is_env = /^--env$/; - } - $vars = join "|",map { quotemeta $_ } @envvar; - print $vars ? "($vars)" : "(.*)"; - ' -- "$@" - )" - # Deal with --env _ - _ignore_UNDERSCORE="$( - perl -e ' - for(@ARGV){ - $next_is_env and push @envvar, split/,/, $_; - $next_is_env=/^--env$/; - } - if(grep { /^_$/ } @envvar) { - if(not open(IN, "<", "$ENV{HOME}/.parallel/ignored_vars")) { - print STDERR "parallel: Error: ", - "Run \"parallel --record-env\" in a clean environment first.\n"; - } else { - chomp(@ignored_vars = ); - $vars = join "|",map { quotemeta $_ } "env_parallel", @ignored_vars; - print $vars ? "($vars)" : "(,,nO,,VaRs,,)"; - } - } - ' -- "$@" - )" + unset _get_ignored_VARS # --record-env if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then @@ -165,7 +131,7 @@ env_parallel() { fi # Grep alias names - _alias_NAMES="`_names_of_ALIASES | _remove_bad_NAMES`" + _alias_NAMES="`_names_of_ALIASES | _remove_bad_NAMES | xargs echo`" _list_alias_BODIES="_bodies_of_ALIASES $_alias_NAMES" if [ "$_alias_NAMES" = "" ] ; then # no aliases selected @@ -174,7 +140,7 @@ env_parallel() { unset _alias_NAMES # Grep function names - _function_NAMES="`_names_of_FUNCTIONS | _remove_bad_NAMES`" + _function_NAMES="`_names_of_FUNCTIONS | _remove_bad_NAMES | xargs echo`" _list_function_BODIES="_bodies_of_FUNCTIONS $_function_NAMES" if [ "$_function_NAMES" = "" ] ; then # no functions selected @@ -183,7 +149,7 @@ env_parallel() { unset _function_NAMES # Grep variable names - _variable_NAMES="`_names_of_VARIABLES | _remove_bad_NAMES`" + _variable_NAMES="`_names_of_VARIABLES | _remove_bad_NAMES | xargs echo`" _list_variable_VALUES="_bodies_of_VARIABLES $_variable_NAMES" if [ "$_variable_NAMES" = "" ] ; then # no variables selected @@ -197,11 +163,17 @@ env_parallel() { $_list_function_BODIES $_list_variable_VALUES; `"; - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - `which parallel` "$@"; + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV + `which parallel` "$@" _parallel_exit_CODE=$? unset PARALLEL_ENV; - return $_parallel_exit_CODE + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" } diff --git a/src/env_parallel.sh b/src/env_parallel.sh index 1da162c6..ab4d6e4f 100755 --- a/src/env_parallel.sh +++ b/src/env_parallel.sh @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -215,9 +214,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" + unset _get_ignored_VARS # --record-env if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then @@ -298,17 +299,22 @@ env_parallel() { $_list_variable_VALUES; `" export PARALLEL_ENV - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - unset _grep_REGEXP - unset _ignore_UNDERSCORE + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV # Test if environment is too big if `_which_PAR true` >/dev/null 2>/dev/null ; then - parallel "$@"; + parallel "$@" _parallel_exit_CODE=$? - unset PARALLEL_ENV; - return $_parallel_exit_CODE + # Clean up variables/functions + unset PARALLEL_ENV + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" else unset PARALLEL_ENV; _error_PAR "Your environment is too big." @@ -404,5 +410,7 @@ _parset_main() { perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" fi - return `cat "$_exit_FILE"; rm "$_exit_FILE"` + unset _parset_NAME _parset_PARALLEL_PRG _parallel_exit_CODE + # Unset _exit_FILE before return + eval "unset _exit_FILE; return \`cat $_exit_FILE; rm $_exit_FILE\`" } diff --git a/src/env_parallel.tcsh b/src/env_parallel.tcsh index 7fe1af83..01c7fa41 100755 --- a/src/env_parallel.tcsh +++ b/src/env_parallel.tcsh @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 diff --git a/src/env_parallel.zsh b/src/env_parallel.zsh index 6d5d6320..3a2972d0 100755 --- a/src/env_parallel.zsh +++ b/src/env_parallel.zsh @@ -7,8 +7,7 @@ # after which 'env_parallel' works # # -# Copyright (C) 2016-2019 -# Ole Tange and Free Software Foundation, Inc. +# Copyright (C) 2016-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 @@ -192,9 +191,11 @@ env_parallel() { # Grep regexp for vars given by --env _grep_REGEXP="`_make_grep_REGEXP \"$@\"`" - + unset _make_grep_REGEXP + # Deal with --env _ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`" + unset _get_ignored_VARS # --record-env if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then @@ -275,17 +276,22 @@ env_parallel() { eval $_list_variable_VALUES; `" export PARALLEL_ENV - unset _list_alias_BODIES - unset _list_variable_VALUES - unset _list_function_BODIES - unset _grep_REGEXP - unset _ignore_UNDERSCORE + unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES + unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS + unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS + unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE + unset _remove_bad_NAMES _grep_REGEXP + unset _prefix_PARALLEL_ENV # Test if environment is too big if `_which_PAR true` >/dev/null 2>/dev/null ; then - parallel "$@"; + parallel "$@" _parallel_exit_CODE=$? - unset PARALLEL_ENV; - return $_parallel_exit_CODE + # Clean up variables/functions + unset PARALLEL_ENV + unset _which_PAR _which_TRUE + unset _warning_PAR _error_PAR + # Unset _parallel_exit_CODE before return + eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE" else unset PARALLEL_ENV; _error_PAR "Your environment is too big." @@ -381,5 +387,7 @@ _parset_main() { perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )" fi - return `cat "$_exit_FILE"; rm "$_exit_FILE"` + unset _parset_NAME _parset_PARALLEL_PRG _parallel_exit_CODE + # Unset _exit_FILE before return + eval "unset _exit_FILE; return \`cat $_exit_FILE; rm $_exit_FILE\`" } diff --git a/src/parallel b/src/parallel index 9732bfe4..86b52b77 100755 --- a/src/parallel +++ b/src/parallel @@ -415,6 +415,55 @@ sub sharder_script() { return ::spacefree(1, $script); } +sub binner_script() { + my $script = q{ + use B; + # Column separator + my $sep = shift; + # Which columns to shard on (count from 1) + my $col = shift; + # Which columns to shard on (count from 0) + my $col0 = $col - 1; + # Perl expression + my $perlexpr = shift; + my $bins = @ARGV; + # Open fifos for writing, fh{0..$bins} + my $t = 0; + my %fh; + # Let the last output fifo be the 0'th + open $fh{$t++}, ">", pop @ARGV; + for(@ARGV) { + open $fh{$t++}, ">", $_; + # open blocks until it is opened by reader + # so unlink only happens when it is ready + unlink $_; + } + if($perlexpr) { + my $subref = eval("sub { no strict; no warnings; $perlexpr }"); + while() { + # Split into $col columns (no need to split into more) + @F = split $sep, $_, $col+1; + { + local $_ = $F[$col0]; + &$subref(); + $fh = $fh{ $_%$bins }; + } + print $fh $_; + } + } else { + while() { + # Split into $col columns (no need to split into more) + @F = split $sep, $_, $col+1; + $fh = $fh{ $F[$col0]%$bins }; + print $fh $_; + } + } + # Close all open fifos + close values %fh; + }; + return ::spacefree(1, $script); +} + sub pipe_shard_setup() { # Create temporary fifos # Run 'shard.pl sep col fifo1 fifo2 fifo3 ... fifoN' in the background @@ -435,10 +484,17 @@ sub pipe_shard_setup() { $parcatfifos[$n][$m] = $shardfifos[$m][$n] = tmpfifo(); } } - my $script = sharder_script(); + my $shardbin = ($opt::shard || $opt::bin); + my $script; + if($opt::bin) { + $script = binner_script(); + } else { + $script = sharder_script(); + } + # cat foo | sharder sep col fifo1 fifo2 fifo3 ... fifoN - if($opt::shard =~ /^[a-z_][a-z_0-9]*(\s|$)/i) { + if($shardbin =~ /^[a-z_][a-z_0-9]*(\s|$)/i) { # Group by column name # (Yes, this will also wrongly match a perlexpr like: chop) my($read,$char,@line); @@ -451,7 +507,7 @@ sub pipe_shard_setup() { $Global::header = join "", @line; } my ($col, $perlexpr, $subref) = - column_perlexpr($opt::shard, $Global::header, $opt::colsep); + column_perlexpr($shardbin, $Global::header, $opt::colsep); if(not fork()) { # Let the sharder inherit our stdin # and redirect stdout to null @@ -1515,6 +1571,7 @@ sub options_hash() { "pipepart|pipe-part" => \$opt::pipepart, "tee" => \$opt::tee, "shard=s" => \$opt::shard, + "bin=s" => \$opt::bin, "groupby|group-by=s" => \$opt::groupby, "hgrp|hostgrp|hostgroup|hostgroups" => \$opt::hostgroups, "embed" => \$opt::embed, @@ -9319,7 +9376,7 @@ sub start($) { ::set_fh_non_blocking($stdin_fh); } $job->set_fh(0,"w",$stdin_fh); - if($opt::tee or $opt::shard) { $job->set_virgin(0); } + if($opt::tee or $opt::shard or $opt::bin) { $job->set_virgin(0); } } elsif ($opt::tty and -c "/dev/tty" and open(my $devtty_fh, "<", "/dev/tty")) { # Give /dev/tty to the command if no one else is using it @@ -9818,7 +9875,7 @@ sub print_linebuffer($) { $outputlength += $rv; # TODO --recend # Treat both \n and \r as line end - $i = (rindex($buf,"\n")+1) || (rindex($buf,"\r")+1); + $i = ::max((rindex($buf,"\n")+1), (rindex($buf,"\r")+1)); if($i) { # One or more complete lines were found if($opt::tag or defined $opt::tagstring) { @@ -9828,15 +9885,15 @@ sub print_linebuffer($) { my $tag = $self->tag(); unshift @$halfline_ref, $tag; # TODO --recend that can be partially in @$halfline_ref - substr($buf,0,$i-1) =~ s/(?<=[\n\r])/$tag/gm; + substr($buf,0,$i-1) =~ s/(?<=[\n\r])(?=.|$)/$tag/gs; # The length changed, so find the new ending pos - $i = (rindex($buf,"\n")+1) || (rindex($buf,"\r")+1); + $i = ::max((rindex($buf,"\n")+1), (rindex($buf,"\r")+1)); } else { # Replace with freshly computed value of tag unshift @$halfline_ref, $self->tag(); - substr($buf,0,$i-1) =~ s/(?<=[\n\r])/$self->tag()/gme; + substr($buf,0,$i-1) =~ s/(?<=[\n\r])(?=.|$)/$self->tag()/gse; # The length changed, so find the new ending pos - $i = (rindex($buf,"\n")+1) || (rindex($buf,"\r")+1); + $i = ::max((rindex($buf,"\n")+1), (rindex($buf,"\r")+1)); } } # Print the partial line (halfline) and the last half @@ -9930,8 +9987,10 @@ sub print_normal($) { local $/ = "\n"; my $tag = $self->tag(); while(<$in_fh>) { - print $out_fd $tag,$_; $outputlength += length $_; + # Tag lines with \r, too + $_ =~ s/(?<=[\r])(?=.|$)/$tag/gs; + print $out_fd $tag,$_; if($Global::membuffer) { push @{$self->{'output'}{$fdno}}, $tag, $_; } @@ -12774,7 +12833,7 @@ sub main() { pipepart_setup(); } elsif($opt::pipe and $opt::tee) { pipe_tee_setup(); - } elsif($opt::pipe and $opt::shard) { + } elsif($opt::pipe and $opt::shard or $opt::bin) { pipe_shard_setup(); } @@ -12798,12 +12857,22 @@ sub main() { $SIG{TERM} = $Global::original_sig{TERM}; $SIG{HUP} = \&start_no_new_jobs; - if($opt::tee or $opt::shard) { - # All jobs must be running in parallel for --tee/--shard + if($opt::tee or $opt::shard or $opt::bin) { + # All jobs must be running in parallel for --tee/--shard/--bin while(start_more_jobs()) {} $Global::start_no_new_jobs = 1; if(not $Global::JobQueue->empty()) { - ::error("--tee requres --jobs to be higher. Try --jobs 0."); + if($opt::tee) { + ::error("--tee requires --jobs to be higher. Try --jobs 0."); + } elsif($opt::bin) { + ::error("--bin requires --jobs to be higher than the number of", + "arguments. Increase --jobs."); + } elsif($opt::shard) { + ::error("--shard requires --jobs to be higher than the number of", + "arguments. Increase --jobs."); + } else { + ::die_bug("--bin/--shard/--tee should not get here"); + } ::wait_and_exit(255); } } elsif($opt::pipe and not $opt::pipepart) { diff --git a/src/parallel.pod b/src/parallel.pod index 086f33a9..ac8effb2 100644 --- a/src/parallel.pod +++ b/src/parallel.pod @@ -4020,20 +4020,22 @@ See more B tricks on https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies =head1 EXAMPLE: Parallelizing rsync B is a great tool, but sometimes it will not fill up the -available bandwidth. This is often a problem when copying several big -files over high speed connections. +available bandwidth. Running multiple B in parallel can fix +this. -The following will start one B per big file in I to -I on the server I: + cd src-dir + find . -type f | + parallel -j10 -X rsync -zR -Ha ./{} fooserver:/dest-dir/ - cd src-dir; find . -type f -size +100000 | \ - parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \ - rsync -s -Havessh {} fooserver:/dest-dir/{} +Adjust B<-j10> until you find the optimal number. -The dirs created may end up with wrong permissions and smaller files -are not being transferred. To fix those run B a final time: +B will create the needed subdirectories, so all files are +not put into a single dir. The B<./> is needed so the resulting command +looks similar to: - rsync -Havessh src-dir/ fooserver:/dest-dir/ + rsync -zR ././sub/dir/file fooserver:/dest-dir/ + +The B is what B works on. If you are unable to push data, but need to pull them and the files are called digits.png (e.g. 000000.png) you might be able to do: @@ -4489,8 +4491,8 @@ files: =head1 SPREADING BLOCKS OF DATA -B<--round-robin>, B<--pipe-part>, B<--shard>, and B<--group-by> are -all specialized versions of B<--pipe>. +B<--round-robin>, B<--pipe-part>, B<--shard>, B<--bin> and +B<--group-by> are all specialized versions of B<--pipe>. In the following I is the number of jobslots given by B<--jobs>. A record starts with B<--recstart> and ends with B<--recend>. It is @@ -4518,6 +4520,11 @@ value in the given column. Based on this value the line is passed to one of the I jobs. All lines having this value will be given to the same jobslot. +B<--bin> works like B<--shard> but the value of the column is the +jobslot number it will be passed to. If the value is bigger than I, +then I will be subtracted from the value until the values is +smaller than or equal to I. + B<--group-by> starts one job per chunk. Record borders are not given by B<--recend>/B<--recstart>. Instead a record is defined by a number of lines having the same value in a given column. So the value of a diff --git a/testsuite/tests-to-run/parallel-local-0.3s.sh b/testsuite/tests-to-run/parallel-local-0.3s.sh index 6505e804..3fd5c280 100644 --- a/testsuite/tests-to-run/parallel-local-0.3s.sh +++ b/testsuite/tests-to-run/parallel-local-0.3s.sh @@ -765,6 +765,20 @@ par_profile() { rm ~/.parallel/testprofile_config } +par_bin() { + echo '### Test --bin' + seq 10 | parallel --pipe --bin 1 -j4 wc | sort + paste <(seq 10) <(seq 10 -1 1) | + parallel --pipe --colsep '\t' --bin 2 -j4 wc | sort + echo '### Test --bin with expression that gives 1..n' + paste <(seq 10) <(seq 10 -1 1) | + parallel --pipe --colsep '\t' --bin '2 $_=$_%2+1' -j4 wc | sort + echo '### Test --bin with expression that gives 0..n-1' + paste <(seq 10) <(seq 10 -1 1) | + parallel --pipe --colsep '\t' --bin '2 $_%=2' -j4 wc | sort + # Fails - blocks! + # paste <(seq 10000000) <(seq 10000000 -1 1) | parallel --pipe --colsep '\t' --bin 2 wc +} export -f $(compgen -A function | grep par_) compgen -A function | grep par_ | LC_ALL=C sort | diff --git a/testsuite/tests-to-run/parallel-local-race02.sh b/testsuite/tests-to-run/parallel-local-race02.sh index dc451555..64b65fbe 100644 --- a/testsuite/tests-to-run/parallel-local-race02.sh +++ b/testsuite/tests-to-run/parallel-local-race02.sh @@ -77,7 +77,7 @@ par_testhalt() { export -f testhalt_false; export -f testhalt_true; - stdout parallel -kj0 --delay 0.11 --tag testhalt_{4} {1},{2}={3} \ + stdout parallel -k --delay 0.11 --tag testhalt_{4} {1},{2}={3} \ ::: now soon ::: fail success done ::: 0 1 2 30% 70% ::: true false | # Remove lines that only show up now and then perl -ne '/Starting no more jobs./ or print' diff --git a/testsuite/tests-to-run/parallel-local-ssh5.sh b/testsuite/tests-to-run/parallel-local-ssh5.sh index f490d2e2..3778b556 100644 --- a/testsuite/tests-to-run/parallel-local-ssh5.sh +++ b/testsuite/tests-to-run/parallel-local-ssh5.sh @@ -77,4 +77,5 @@ par_command_len_shellquote() { export -f $(compgen -A function | grep par_) compgen -A function | grep par_ | sort -r | - parallel --joblog /tmp/jl-`basename $0` -j3 --tag -k --delay 0.1 --retries 3 '{} 2>&1' + # 2019-07-14 100% slowed down 4 threads/16GB + parallel -j75% --joblog /tmp/jl-`basename $0` -j3 --tag -k --delay 0.1 --retries 3 '{} 2>&1' diff --git a/testsuite/tests-to-run/parallel-local-ssh7.sh b/testsuite/tests-to-run/parallel-local-ssh7.sh index 4509917d..4247c4d5 100755 --- a/testsuite/tests-to-run/parallel-local-ssh7.sh +++ b/testsuite/tests-to-run/parallel-local-ssh7.sh @@ -3307,7 +3307,8 @@ export -f $(compgen -A function | grep par_) #compgen -A function | grep par_ | sort | compgen -A function | grep par_ | LC_ALL=C sort -r | # parallel --joblog /tmp/jl-`basename $0` --delay $D -j$P --tag -k '{} 2>&1' - parallel --joblog /tmp/jl-`basename $0` -j200% --retries 2 --tag -k '{} 2>&1' | + # 2019-07-14 200% too high for 16 GB/4 thread + parallel --joblog /tmp/jl-`basename $0` -j75% --retries 2 --tag -k '{} 2>&1' | perl -pe 's/line \d?\d\d:/line XXX:/g; s/\d+ >= \d+/XXX >= XXX/; s/sh:? \d?\d\d:/sh: XXX:/; diff --git a/testsuite/wanted-results/parallel-local-0.3s b/testsuite/wanted-results/parallel-local-0.3s index 3b54951e..8f3c86bd 100644 --- a/testsuite/wanted-results/parallel-local-0.3s +++ b/testsuite/wanted-results/parallel-local-0.3s @@ -44,6 +44,25 @@ par_basic_halt true par_basic_halt parallel: Error: --halt must have 'never', 'soon', or 'now'. par_basic_halt parallel: Error: --halt soon must be followed by ,success or ,fail. par_basic_halt parallel: Error: --halt now must be followed by ,success or ,fail. +par_bin ### Test --bin +par_bin 2 2 4 +par_bin 2 2 4 +par_bin 3 3 6 +par_bin 3 3 7 +par_bin 2 4 8 +par_bin 2 4 8 +par_bin 3 6 13 +par_bin 3 6 13 +par_bin ### Test --bin with expression that gives 1..n +par_bin 0 0 0 +par_bin 0 0 0 +par_bin 5 10 21 +par_bin 5 10 21 +par_bin ### Test --bin with expression that gives 0..n-1 +par_bin 0 0 0 +par_bin 0 0 0 +par_bin 5 10 21 +par_bin 5 10 21 par_blocking_redir 0 0 0 par_blocking_redir 0 0 0 par_blocking_redir 1 9 54 @@ -850,7 +869,7 @@ par_tee_too_many_args 1 11 par_tee_too_many_args 2 2 par_tee_too_many_args 3 3 par_tee_too_many_args 4 4 -par_tee_too_many_args parallel: Error: --tee requres --jobs to be higher. Try --jobs 0. +par_tee_too_many_args parallel: Error: --tee requires --jobs to be higher. Try --jobs 0. par_test_L_context_replace ### Test -N context replace par_test_L_context_replace a1b a2b a3b a4b a5b a6b a7b a8b a9b a10b par_test_L_context_replace a11b a12b a13b a14b a15b a16b a17b a18b a19b diff --git a/testsuite/wanted-results/parallel-local-10s b/testsuite/wanted-results/parallel-local-10s index 549d7a5d..881b9319 100644 --- a/testsuite/wanted-results/parallel-local-10s +++ b/testsuite/wanted-results/parallel-local-10s @@ -702,45 +702,45 @@ par_semaphore job3b 6 par_semaphore done par_shellquote ### Test --shellquote in all shells par_shellquote ash ' -par_shellquote ash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote ash par_shellquote ash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote bash ' -par_shellquote bash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote bash par_shellquote bash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote csh \\\\\\\\ "\ -par_shellquote csh "\ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +par_shellquote csh "\ \ \ par_shellquote csh \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ par_shellquote dash ' -par_shellquote dash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote dash par_shellquote dash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote fish ' -par_shellquote fish  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote fish par_shellquote fish  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote fizsh ' -par_shellquote fizsh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote fizsh par_shellquote fizsh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote ksh ' -par_shellquote ksh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote ksh par_shellquote ksh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote ksh93 ' -par_shellquote ksh93  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote ksh93 par_shellquote ksh93  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote lksh ' -par_shellquote lksh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote lksh par_shellquote lksh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote mksh ' -par_shellquote mksh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote mksh par_shellquote mksh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote posh ' -par_shellquote posh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote posh par_shellquote posh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote rzsh ' -par_shellquote rzsh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote rzsh par_shellquote rzsh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote sash ' -par_shellquote sash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote sash par_shellquote sash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote sh ' -par_shellquote sh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote sh par_shellquote sh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote static-sh ' -par_shellquote static-sh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote static-sh par_shellquote static-sh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote tcsh \\\\\\\\ "\ -par_shellquote tcsh "\ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +par_shellquote tcsh "\ \ \ par_shellquote tcsh \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ par_shellquote yash ' -par_shellquote yash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote yash par_shellquote yash  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote zsh ' -par_shellquote zsh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_shellquote zsh par_shellquote zsh  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_shellquote csh \\\\\\\\ "\ -par_shellquote csh "\ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +par_shellquote csh "\ \ \ par_shellquote csh \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ par_shellquote tcsh \\\\\\\\ "\ -par_shellquote tcsh "\ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +par_shellquote tcsh "\ \ \ par_shellquote tcsh \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ par_sockets_cores_threads ### Test --number-of-sockets/cores/threads par_sockets_cores_threads 1 par_sockets_cores_threads 2 diff --git a/testsuite/wanted-results/parallel-local-3s b/testsuite/wanted-results/parallel-local-3s index 423bf07d..2042d6be 100644 --- a/testsuite/wanted-results/parallel-local-3s +++ b/testsuite/wanted-results/parallel-local-3s @@ -1342,8 +1342,10 @@ par_shard 9 8 par_shard 9 9 par_shard 2 c2 par_shard *** broken -par_shard parallel: Error: --tee requres --jobs to be higher. Try --jobs 0. -par_shard parallel: Error: --tee requres --jobs to be higher. Try --jobs 0. +par_shard parallel: Error: --shard requires --jobs to be higher than the number of +par_shard parallel: Error: arguments. Increase --jobs. +par_shard parallel: Error: --shard requires --jobs to be higher than the number of +par_shard parallel: Error: arguments. Increase --jobs. par_slow_args_generation ### Test slow arguments generation - https://savannah.gnu.org/bugs/?32834 par_slow_args_generation 1 par_slow_args_generation 2 diff --git a/testsuite/wanted-results/parallel-local-ssh7 b/testsuite/wanted-results/parallel-local-ssh7 index b92f6030..9711e600 100644 --- a/testsuite/wanted-results/parallel-local-ssh7 +++ b/testsuite/wanted-results/parallel-local-ssh7 @@ -127,12 +127,12 @@ par_zsh_man exit value 2 should be 2 par_zsh_man Unknown option: no-such-option par_zsh_man exit value 255 should be 255 par_zsh_funky -par_zsh_funky C-] !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~M-M-]-funky -par_zsh_funky C-] !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~M-M-]-funky +par_zsh_funky par_zsh_funky C-] !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~M-M-]-funky +par_zsh_funky par_zsh_funky C-] !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~M-M-]-funky par_zsh_funky space 6 par_zsh_funky space 6 par_zsh_funky ' ' -par_zsh_funky '  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_zsh_funky ' par_zsh_funky  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_zsh_funky 3 arg alias_works par_zsh_funky 3 arg alias_works_over_ssh par_zsh_funky Funky- @@ -359,108 +359,108 @@ par_zsh_env_parallel bug #52534: Tail of multiline alias is ignored par_zsh_env_parallel data from stdin par_zsh_env_parallel data from stdin par_tcsh_underscore ### tcsh -par_tcsh_underscore ### Testing of --env _ -par_tcsh_underscore #: Command not found. -par_tcsh_underscore variables and arrays in aliases work -par_tcsh_underscore variables and arrays in aliases work -par_tcsh_underscore variables and arrays in aliases work -par_tcsh_underscore variables and arrays in aliases work -par_tcsh_underscore variables and arrays in aliases work -par_tcsh_underscore variables and arrays in aliases work -par_tcsh_underscore myvar: Undefined variable. -par_tcsh_underscore myvar: Undefined variable. -par_tcsh_underscore myarray: Undefined variable. -par_tcsh_underscore myarray: Undefined variable. -par_tcsh_underscore myecho: Command not found. -par_tcsh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho -par_tcsh_underscore myecho: Command not found. -par_tcsh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho -par_tcsh_underscore Connection to lo closed. +par_tcsh_underscore ### Testing of --env _ par_tcsh_underscore +par_tcsh_underscore #: Command not found. par_tcsh_underscore +par_tcsh_underscore variables and arrays in aliases work par_tcsh_underscore +par_tcsh_underscore variables and arrays in aliases work par_tcsh_underscore +par_tcsh_underscore variables and arrays in aliases work par_tcsh_underscore +par_tcsh_underscore variables and arrays in aliases work par_tcsh_underscore +par_tcsh_underscore variables and arrays in aliases work par_tcsh_underscore +par_tcsh_underscore variables and arrays in aliases work par_tcsh_underscore +par_tcsh_underscore myvar: Undefined variable. par_tcsh_underscore +par_tcsh_underscore myvar: Undefined variable. par_tcsh_underscore +par_tcsh_underscore myarray: Undefined variable. par_tcsh_underscore +par_tcsh_underscore myarray: Undefined variable. par_tcsh_underscore +par_tcsh_underscore myecho: Command not found. par_tcsh_underscore +par_tcsh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho par_tcsh_underscore +par_tcsh_underscore myecho: Command not found. par_tcsh_underscore +par_tcsh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho par_tcsh_underscore +par_tcsh_underscore Connection to lo closed. par_tcsh_underscore par_tcsh_parset Not implemented par_tcsh_man ### tcsh -par_tcsh_man ### From man env_parallel -par_tcsh_man #: Command not found. -par_tcsh_man aliases with = & " work -par_tcsh_man aliases with = & " work -par_tcsh_man aliases with = & " work -par_tcsh_man aliases with = & " work -par_tcsh_man Functions not supported -par_tcsh_man #: Command not found. -par_tcsh_man #: Command not found. -par_tcsh_man variables with = & " work -par_tcsh_man variables with = & " work -par_tcsh_man variables with = & " work -par_tcsh_man variables with = & " work -par_tcsh_man #: Command not found. -par_tcsh_man arrays -par_tcsh_man with=&"' -par_tcsh_man work, -par_tcsh_man too -par_tcsh_man arrays -par_tcsh_man with=&"' -par_tcsh_man work, -par_tcsh_man too -par_tcsh_man arrays -par_tcsh_man with=&"' -par_tcsh_man work, -par_tcsh_man too -par_tcsh_man arrays -par_tcsh_man with=&"' -par_tcsh_man work, -par_tcsh_man too -par_tcsh_man Segmentation faults? Are you running bsd-csh version 20110502-3? -par_tcsh_man multi -par_tcsh_man level -par_tcsh_man env_parallel -par_tcsh_man exit value 2 should be 2 -par_tcsh_man Unknown option: no-such-option -par_tcsh_man Usage: -par_tcsh_man -par_tcsh_man parallel [options] [command [arguments]] < list_of_arguments -par_tcsh_man parallel [options] [command [arguments]] (::: arguments|:::: argfile(s))... -par_tcsh_man cat ... | parallel --pipe [options] [command [arguments]] -par_tcsh_man -par_tcsh_man -j n Run n jobs in parallel -par_tcsh_man -k Keep same order -par_tcsh_man -X Multiple arguments with context replace -par_tcsh_man --colsep regexp Split input on regexp for positional replacements -par_tcsh_man {} {.} {/} {/.} {#} {%} {= perl code =} Replacement strings -par_tcsh_man {3} {3.} {3/} {3/.} {=3 perl code =} Positional replacement strings -par_tcsh_man With --plus: {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} = -par_tcsh_man {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...} -par_tcsh_man -par_tcsh_man -S sshlogin Example: foo@server.example.com -par_tcsh_man --slf .. Use ~/.parallel/sshloginfile as the list of sshlogins -par_tcsh_man --trc {}.bar Shorthand for --transfer --return {}.bar --cleanup -par_tcsh_man --onall Run the given command with argument on all sshlogins -par_tcsh_man --nonall Run the given command with no arguments on all sshlogins -par_tcsh_man -par_tcsh_man --pipe Split stdin (standard input) to multiple jobs. -par_tcsh_man --recend str Record end separator for --pipe. -par_tcsh_man --recstart str Record start separator for --pipe. -par_tcsh_man -par_tcsh_man See 'man parallel' for details -par_tcsh_man -par_tcsh_man Academic tradition requires you to cite works you base your article on. -par_tcsh_man If you use programs that use GNU Parallel to process data for an article in a -par_tcsh_man scientific publication, please cite: -par_tcsh_man -par_tcsh_man O. Tange (2018): GNU Parallel 2018, Mar 2018, ISBN 9781387509881, -par_tcsh_man DOI https://doi.org/10.5281/zenodo.1146014 -par_tcsh_man -par_tcsh_man This helps funding further development; AND IT WON'T COST YOU A CENT. -par_tcsh_man If you pay 10000 EUR you should feel free to use GNU Parallel without citing. -par_tcsh_man -par_tcsh_man exit value 255 should be 255 -par_tcsh_man Connection to lo closed. +par_tcsh_man ### From man env_parallel par_tcsh_man +par_tcsh_man #: Command not found. par_tcsh_man +par_tcsh_man aliases with = & " work par_tcsh_man +par_tcsh_man aliases with = & " work par_tcsh_man +par_tcsh_man aliases with = & " work par_tcsh_man +par_tcsh_man aliases with = & " work par_tcsh_man +par_tcsh_man Functions not supported par_tcsh_man +par_tcsh_man #: Command not found. par_tcsh_man +par_tcsh_man #: Command not found. par_tcsh_man +par_tcsh_man variables with = & " work par_tcsh_man +par_tcsh_man variables with = & " work par_tcsh_man +par_tcsh_man variables with = & " work par_tcsh_man +par_tcsh_man variables with = & " work par_tcsh_man +par_tcsh_man #: Command not found. par_tcsh_man +par_tcsh_man arrays par_tcsh_man +par_tcsh_man with=&"' par_tcsh_man +par_tcsh_man work, par_tcsh_man +par_tcsh_man too par_tcsh_man +par_tcsh_man arrays par_tcsh_man +par_tcsh_man with=&"' par_tcsh_man +par_tcsh_man work, par_tcsh_man +par_tcsh_man too par_tcsh_man +par_tcsh_man arrays par_tcsh_man +par_tcsh_man with=&"' par_tcsh_man +par_tcsh_man work, par_tcsh_man +par_tcsh_man too par_tcsh_man +par_tcsh_man arrays par_tcsh_man +par_tcsh_man with=&"' par_tcsh_man +par_tcsh_man work, par_tcsh_man +par_tcsh_man too par_tcsh_man +par_tcsh_man Segmentation faults? Are you running bsd-csh version 20110502-3? par_tcsh_man +par_tcsh_man multi par_tcsh_man +par_tcsh_man level par_tcsh_man +par_tcsh_man env_parallel par_tcsh_man +par_tcsh_man exit value 2 should be 2 par_tcsh_man +par_tcsh_man Unknown option: no-such-option par_tcsh_man +par_tcsh_man Usage: par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man parallel [options] [command [arguments]] < list_of_arguments par_tcsh_man +par_tcsh_man parallel [options] [command [arguments]] (::: arguments|:::: argfile(s))... par_tcsh_man +par_tcsh_man cat ... | parallel --pipe [options] [command [arguments]] par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man -j n Run n jobs in parallel par_tcsh_man +par_tcsh_man -k Keep same order par_tcsh_man +par_tcsh_man -X Multiple arguments with context replace par_tcsh_man +par_tcsh_man --colsep regexp Split input on regexp for positional replacements par_tcsh_man +par_tcsh_man {} {.} {/} {/.} {#} {%} {= perl code =} Replacement strings par_tcsh_man +par_tcsh_man {3} {3.} {3/} {3/.} {=3 perl code =} Positional replacement strings par_tcsh_man +par_tcsh_man With --plus: {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} = par_tcsh_man +par_tcsh_man {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...} par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man -S sshlogin Example: foo@server.example.com par_tcsh_man +par_tcsh_man --slf .. Use ~/.parallel/sshloginfile as the list of sshlogins par_tcsh_man +par_tcsh_man --trc {}.bar Shorthand for --transfer --return {}.bar --cleanup par_tcsh_man +par_tcsh_man --onall Run the given command with argument on all sshlogins par_tcsh_man +par_tcsh_man --nonall Run the given command with no arguments on all sshlogins par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man --pipe Split stdin (standard input) to multiple jobs. par_tcsh_man +par_tcsh_man --recend str Record end separator for --pipe. par_tcsh_man +par_tcsh_man --recstart str Record start separator for --pipe. par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man See 'man parallel' for details par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man Academic tradition requires you to cite works you base your article on. par_tcsh_man +par_tcsh_man If you use programs that use GNU Parallel to process data for an article in a par_tcsh_man +par_tcsh_man scientific publication, please cite: par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man O. Tange (2018): GNU Parallel 2018, Mar 2018, ISBN 9781387509881, par_tcsh_man +par_tcsh_man DOI https://doi.org/10.5281/zenodo.1146014 par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man This helps funding further development; AND IT WON'T COST YOU A CENT. par_tcsh_man +par_tcsh_man If you pay 10000 EUR you should feel free to use GNU Parallel without citing. par_tcsh_man +par_tcsh_man par_tcsh_man +par_tcsh_man exit value 255 should be 255 par_tcsh_man +par_tcsh_man Connection to lo closed. par_tcsh_man par_tcsh_funky par_tcsh_funky par_tcsh_funky par_tcsh_funky 3 arg alias_works par_tcsh_funky 3 arg alias_works_over_ssh -par_tcsh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky alias_var_works -par_tcsh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky alias_var_works_over_ssh -par_tcsh_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +par_tcsh_funky Funky- par_tcsh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky alias_var_works +par_tcsh_funky Funky- par_tcsh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky alias_var_works_over_ssh +par_tcsh_funky \\\\\\\\ \ \ \ \ par_tcsh_funky \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ par_tcsh_funky func_echo: Command not found. par_tcsh_funky func_echo: Command not found. par_tcsh_funky myvar works @@ -568,7 +568,7 @@ par_sh_man Unknown option: no-such-option par_sh_man exit value 255 should be 255 par_sh_funky par_sh_funky ' ' -par_sh_funky '  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_sh_funky ' par_sh_funky  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_sh_funky 3 arg alias_works par_sh_funky 3 arg alias_works_over_ssh par_sh_environment_too_big bug #50815: env_parallel should warn if the environment is too big @@ -862,12 +862,12 @@ par_mksh_man exit value 2 should be 2 par_mksh_man Unknown option: no-such-option par_mksh_man exit value 255 should be 255 par_mksh_funky -par_mksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky -par_mksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky +par_mksh_funky par_mksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky +par_mksh_funky par_mksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky par_mksh_funky space 6 par_mksh_funky space 6 par_mksh_funky ' ' -par_mksh_funky '  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_mksh_funky ' par_mksh_funky  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_mksh_funky 3 arg alias_works par_mksh_funky 3 arg alias_works_over_ssh par_mksh_funky Funky- @@ -1203,12 +1203,12 @@ par_ksh_man exit value 2 should be 2 par_ksh_man Unknown option: no-such-option par_ksh_man exit value 255 should be 255 par_ksh_funky -par_ksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky -par_ksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky +par_ksh_funky par_ksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky +par_ksh_funky par_ksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky par_ksh_funky space 6 par_ksh_funky space 6 par_ksh_funky ' ' -par_ksh_funky '  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_ksh_funky ' par_ksh_funky  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_ksh_funky 3 arg alias_works par_ksh_funky 3 arg alias_works_over_ssh par_ksh_funky Funky- @@ -1517,8 +1517,8 @@ par_fish_funky space 6 par_fish_funky par_fish_funky par_fish_funky -par_fish_funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky -par_fish_funky Funkyenv-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyenv +par_fish_funky Funky- par_fish_funky   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky +par_fish_funky Funkyenv- par_fish_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyenv par_fish_funky par_fish_funky par_fish_funky @@ -1532,13 +1532,13 @@ par_fish_funky space 6 par_fish_funky par_fish_funky par_fish_funky -par_fish_funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky -par_fish_funky Funkyenv-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyenv +par_fish_funky Funky- par_fish_funky   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky +par_fish_funky Funkyenv- par_fish_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyenv par_fish_funky par_fish_funky par_fish_funky par_fish_funky -par_fish_funky '   !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_fish_funky ' par_fish_funky   !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_fish_environment_too_big Not implemented par_fish_env_parallel_session ### Test env_parallel --session par_fish_env_parallel_session fish: Unknown command 'aliasbefore must_fail' @@ -1653,7 +1653,7 @@ par_dash_man Unknown option: no-such-option par_dash_man exit value 255 should be 255 par_dash_funky par_dash_funky ' ' -par_dash_funky '  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_dash_funky ' par_dash_funky  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_dash_funky 3 arg alias_works par_dash_funky 3 arg alias_works_over_ssh par_dash_environment_too_big bug #50815: env_parallel should warn if the environment is too big @@ -1810,23 +1810,23 @@ par_dash_env_parallel bug #52534: Tail of multiline alias is ignored par_dash_env_parallel data from stdin par_dash_env_parallel data from stdin par_csh_underscore ### csh -par_csh_underscore ### Testing of --env _ -par_csh_underscore #: Command not found. -par_csh_underscore variables and arrays in aliases work -par_csh_underscore variables and arrays in aliases work -par_csh_underscore variables and arrays in aliases work -par_csh_underscore variables and arrays in aliases work -par_csh_underscore variables and arrays in aliases work -par_csh_underscore variables and arrays in aliases work -par_csh_underscore myvar: Undefined variable. -par_csh_underscore myvar: Undefined variable. -par_csh_underscore myarray: Undefined variable. -par_csh_underscore myarray: Undefined variable. -par_csh_underscore myecho: Command not found. -par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho -par_csh_underscore myecho: Command not found. -par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho -par_csh_underscore Connection to lo closed. +par_csh_underscore ### Testing of --env _ par_csh_underscore +par_csh_underscore #: Command not found. par_csh_underscore +par_csh_underscore variables and arrays in aliases work par_csh_underscore +par_csh_underscore variables and arrays in aliases work par_csh_underscore +par_csh_underscore variables and arrays in aliases work par_csh_underscore +par_csh_underscore variables and arrays in aliases work par_csh_underscore +par_csh_underscore variables and arrays in aliases work par_csh_underscore +par_csh_underscore variables and arrays in aliases work par_csh_underscore +par_csh_underscore myvar: Undefined variable. par_csh_underscore +par_csh_underscore myvar: Undefined variable. par_csh_underscore +par_csh_underscore myarray: Undefined variable. par_csh_underscore +par_csh_underscore myarray: Undefined variable. par_csh_underscore +par_csh_underscore myecho: Command not found. par_csh_underscore +par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho par_csh_underscore +par_csh_underscore myecho: Command not found. par_csh_underscore +par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho par_csh_underscore +par_csh_underscore Connection to lo closed. par_csh_underscore par_csh_parset Not implemented par_csh_man ### csh par_csh_man @@ -1901,16 +1901,16 @@ par_csh_funky 3 arg alias_works par_csh_funky par_csh_funky myvar works par_csh_funky space special chars problem -par_csh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€Â‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-funky alias_var_works +par_csh_funky Funky- par_csh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€Â‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-funky alias_var_works par_csh_funky func_echo: Command not found. par_csh_funky 3 arg alias_works_over_ssh par_csh_funky par_csh_funky myvar works par_csh_funky space special chars problem -par_csh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€Â‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-funky alias_var_works_over_ssh +par_csh_funky Funky- par_csh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€Â‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-funky alias_var_works_over_ssh par_csh_funky func_echo: Command not found. par_csh_funky -par_csh_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\€\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\À\Á\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +par_csh_funky \\\\\\\\ \ \ \ \ par_csh_funky \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\€\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\À\Á\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ par_csh_environment_too_big Not implemented par_csh_env_parallel_session Not implemented par_csh_env_parallel bug #50435: Remote fifo broke in 20150522 @@ -2064,11 +2064,11 @@ par_bash_funky space 6 par_bash_funky space 6 par_bash_funky ' ' par_bash_funky ' ' -par_bash_funky '  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_bash_funky ' par_bash_funky  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_bash_funky 3 arg alias_works par_bash_funky 3 arg alias_works_over_ssh -par_bash_funky Funkyline-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyline -par_bash_funky Funkyline-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyline +par_bash_funky Funkyline- par_bash_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyline +par_bash_funky Funkyline- par_bash_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funkyline par_bash_funky Funkymultiline- par_bash_funky Funkymultiline- par_bash_funky assoc_val_a @@ -2349,7 +2349,7 @@ par_ash_man Unknown option: no-such-option par_ash_man exit value 255 should be 255 par_ash_funky par_ash_funky ' ' -par_ash_funky '  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' +par_ash_funky ' par_ash_funky  !"#$%&'"'"'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~' par_ash_funky 3 arg alias_works par_ash_funky 3 arg alias_works_over_ssh par_ash_environment_too_big bug #50815: env_parallel should warn if the environment is too big