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

This commit is contained in:
Ole Tange 2016-07-22 18:10:37 +02:00
commit 2ae423ad88
21 changed files with 3051 additions and 1089 deletions

View file

@ -25,45 +25,67 @@
# or write to the Free Software Foundation, Inc., 51 Franklin St,
# Fifth Floor, Boston, MA 02110-1301 USA
# Supports env of 127426 bytes
env_parallel() {
# env_parallel.bash
# 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 (.*)
local grep_REGEXP="$(
perl -e 'for(@ARGV){
local _grep_REGEXP="$(
perl -e '
for(@ARGV){
/^_$/ and $next_is_env = 0;
$next_is_env and push @envvar, split/,/, $_;
$next_is_env=/^--env$/;
$next_is_env = /^--env$/;
}
$vars = join "|",map { quotemeta $_ } @envvar;
print $vars ? "($vars)" : "(.*)";
' -- "$@"
)"
# Deal with --env _
local _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 = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
}
}
' -- "$@"
)"
# Grep alias names
local _alias_NAMES="$(compgen -a |
egrep "^${grep_REGEXP}\$")"
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
local _list_alias_BODIES="alias $_alias_NAMES"
if [[ "$_alias_NAMES" = "" ]] ; then
# no aliases selected
_list_alias_BODIES="true"
fi
unset _alias_NAMES
# Grep function names
local _function_NAMES="$(compgen -A function |
egrep "^${grep_REGEXP}\$")"
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
local _list_function_BODIES="typeset -f $_function_NAMES"
if [[ "$_function_NAMES" = "" ]] ; then
# no functions selected
_list_function_BODIES="true"
fi
unset _function_NAMES
# Grep variable names
local _variable_NAMES="$(compgen -A variable |
egrep "^${grep_REGEXP}\$" |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ |
grep -vFf <(readonly) |
egrep -v '^(BASHOPTS|BASHPID|EUID|GROUPS|FUNCNAME|DIRSTACK|_|PIPESTATUS|PPID|SHELLOPTS|UID|USERNAME|BASH_[A-Z_]+)$')"
local _list_variable_VALUES="typeset -p $_variable_NAMES"
@ -71,6 +93,7 @@ env_parallel() {
# no variables selected
_list_variable_VALUES="true"
fi
unset _variable_NAMES
# Copy shopt (so e.g. extended globbing works)
# But force expand_aliases as aliases otherwise do not work
@ -82,20 +105,9 @@ env_parallel() {
$_list_alias_BODIES;
$_list_variable_VALUES;
$_list_function_BODIES)";
unset _list_alias_BODIES
unset _list_variable_VALUES
unset _list_function_BODIES
`which parallel` "$@";
unset PARALLEL_ENV;
}
# Supports env of 127375 bytes
#
# _env_parallel() {
# # Saving to a tempfile
# export PARALLEL_ENV=`tempfile`;
# (echo "shopt -s expand_aliases 2>/dev/null"; alias;typeset -p |
# grep -vFf <(readonly) |
# grep -v 'declare .. (GROUPS|FUNCNAME|DIRSTACK|_|PIPESTATUS|USERNAME|BASH_[A-Z_]+) ';
# typeset -f) > $PARALLEL_ENV
# `which parallel` "$@";
# rm "$PARALLEL_ENV"
# unset PARALLEL_ENV;
# }

View file

@ -29,28 +29,69 @@ if ("`alias env_parallel`" == '') then
# Activate alias
alias env_parallel 'setenv PARALLEL "\!*"; source `which env_parallel.csh`'
else
# 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 (.*)
set _tMpscRIpt=`tempfile`
cat <<'EOF' > $_tMpscRIpt
#!/usr/bin/perl
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)" : "(.*)";
'EOF'
set _grep_REGEXP="`perl $_tMpscRIpt -- $PARALLEL`"
# Deal with --env _
cat <<'EOF' > $_tMpscRIpt
#!/usr/bin/perl
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 = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
}
}
'EOF'
set _ignore_UNDERSCORE="`perl $_tMpscRIpt -- $PARALLEL`"
rm $_tMpscRIpt
# Get the scalar and array variable names
set _vARnAmES=(`set | awk -e '{print $1}' |grep -v prompt2`)
set _vARnAmES=(`set | awk -e '{print $1}' |grep -vE '^(#|_|killring|prompt2|command)$' | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$`)
# Make a tmpfile for the variable definitions
set _tMpvARfILe=`tempfile`
# Make a tmpfile for the variable definitions + alias
set _tMpaLLfILe=`tempfile`
foreach _vARnAmE ($_vARnAmES);
# if $?myvar && $#myvar <= 1 echo scalar_myvar=$var
eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} <= 1) echo scalar_'$_vARnAmE'="$'$_vARnAmE'"' >> $_tMpvARfILe;
# if $?myvar && $#myvar > 1 echo array_myvar=$var
eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} > 1) echo array_'$_vARnAmE'="$'$_vARnAmE'"' >> $_tMpvARfILe;
# if not defined: next
eval if'(! $?'$_vARnAmE') continue'
# if $#myvar <= 1 echo scalar_myvar=$var
eval if'(${#'$_vARnAmE'} <= 1) echo scalar_'$_vARnAmE'='\"\$$_vARnAmE\" >> $_tMpvARfILe;
# if $#myvar > 1 echo array_myvar=$var
eval if'(${#'$_vARnAmE'} > 1) echo array_'$_vARnAmE'="$'$_vARnAmE'"' >> $_tMpvARfILe;
end
unset _vARnAmE _vARnAmES
# shell quote variables (--plain needed due to $PARALLEL abuse)
# Convert 'scalar_myvar=...' to 'set myvar=...'
# Convert 'array_myvar=...' to 'set array=(...)'
cat $_tMpvARfILe | parallel --plain --shellquote | perl -pe 's/^scalar_(\S+).=/set $1=/ or s/^array_(\S+).=(.*)/set $1=($2)/ && s/\\ / /g;' > $_tMpaLLfILe
# Cleanup
rm $_tMpvARfILe; unset _tMpvARfILe _vARnAmE _vARnAmES
rm $_tMpvARfILe; unset _tMpvARfILe
# ALIAS TO EXPORT ALIASES:
@ -61,8 +102,6 @@ else
# Quoted: s/\\047/\\047\\042\\047\\042\\047/g\;
# Remove () from second column
# s/^(\S+)(\s+)\((.*)\)/\1\2\3/
# \047 => '
# s/^(\S+)(\s+)\((.*)\)/\1\2\3/;
# Quoted: s/\^\(\\S+\)\(\\s+\)\\\(\(.\*\)\\\)/\\1\\2\\3/\;
@ -79,7 +118,10 @@ else
# Prepend with "\nalias "
# s/^/\001alias /;
# Quoted: s/\^/\\001alias\ /\;
alias | perl -pe s/\\047/\\047\\042\\047\\042\\047/g\;s/\^\(\\S+\)\(\\s+\)\\\(\(.\*\)\\\)/\\1\\2\\3/\;s/\^\(\\S+\)\(\\s+\)\(.\*\)/\\1\\2\\047\\3\\047/\;s/\^/\\001alias\ /\;s/\\\!/\\\\\\\!/g >> $_tMpaLLfILe
alias | \
grep -E "^$_grep_REGEXP" | \
grep -vE "^$_ignore_UNDERSCORE""[^_a-zA-Z]" | \
perl -pe s/\\047/\\047\\042\\047\\042\\047/g\;s/\^\(\\S+\)\(\\s+\)\\\(\(.\*\)\\\)/\\1\\2\\3/\;s/\^\(\\S+\)\(\\s+\)\(.\*\)/\\1\\2\\047\\3\\047/\;s/\^/\\001alias\ /\;s/\\\!/\\\\\\\!/g >> $_tMpaLLfILe
setenv PARALLEL_ENV "`cat $_tMpaLLfILe; rm $_tMpaLLfILe`";
unset _tMpaLLfILe;

View file

@ -44,10 +44,44 @@ function env_parallel
# env_parallel.fish
setenv PARALLEL_ENV (
begin;
set _grep_REGEXP (
begin;
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)" : "(.*)";
' -- $argv;
end;
)
# Deal with --env _
set _ignore_UNDERSCORE (
begin;
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 = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(nO,VaRs)";
}
}
' -- $argv;
end;
)
# Export function definitions
functions -n | perl -pe 's/,/\n/g' | while read d; functions $d; end;
functions -n | perl -pe 's/,/\n/g' | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ | while read d; functions $d; end;
# Convert scalar vars to fish \XX quoting
eval (set -L | perl -ne 'chomp;
eval (set -L | grep -E "^$_grep_REGEXP " | grep -vE "^$_ignore_UNDERSCORE " | perl -ne 'chomp;
($name,$val)=split(/ /,$_,2);
$name=~/^(HOME|USER|COLUMNS|FISH_VERSION|LINES|PWD|SHLVL|_|history|status|version)$/ and next;
if($val=~/^'"'"'/) { next; }
@ -55,7 +89,7 @@ function env_parallel
')
# Generate commands to set scalar variables
begin;
for v in (set -n);
for v in (set -n | grep -E "^$_grep_REGEXP\$" | grep -vE "^$_ignore_UNDERSCORE\$");
# Separate variables with the string: \000
eval "for i in \$$v;
echo -n $v \$i;

View file

@ -26,8 +26,82 @@
# Fifth Floor, Boston, MA 02110-1301 USA
env_parallel() {
# env_parallel.ksh
export PARALLEL_ENV="$(alias | perl -pe 's/^/alias /';typeset -p|egrep -v 'typeset( -i)? -r|PIPESTATUS';typeset -f)";
`which parallel` "$@";
unset PARALLEL_ENV;
# env_parallel.ksh
# 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 = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
}
}
' -- "$@"
)"
# Grep alias names
_alias_NAMES="$(alias | perl -pe 's/=.*//' |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
_list_alias_BODIES="alias $_alias_NAMES | perl -pe 's/^/alias /'"
if [[ "$_alias_NAMES" = "" ]] ; then
# no aliases selected
_list_alias_BODIES="true"
fi
unset _alias_NAMES
# Grep function names
_function_NAMES="$(typeset +p -f | perl -pe 's/\(\).*//' |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
_list_function_BODIES="typeset -f $_function_NAMES"
if [[ "$_function_NAMES" = "" ]] ; then
# no functions selected
_list_function_BODIES="true"
fi
unset _function_NAMES
# Grep variable names
_variable_NAMES="$(typeset +p | perl -pe 's/^typeset .. //' |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ |
egrep -v '^(PIPESTATUS)$')"
_list_variable_VALUES="typeset -p $_variable_NAMES"
if [[ "$_variable_NAMES" = "" ]] ; then
# no variables selected
_list_variable_VALUES="true"
fi
unset _variable_NAMES
# eval is needed for aliases - cannot explain why
export PARALLEL_ENV="$(
eval $_list_alias_BODIES;
$_list_variable_VALUES;
$_list_function_BODIES)";
unset _list_alias_BODIES
unset _list_variable_VALUES
unset _list_function_BODIES
`which parallel` "$@";
unset PARALLEL_ENV;
}

View file

@ -1,8 +1,8 @@
#!/bin/pdksh
# This file must be sourced in ksh:
# This file must be sourced in pdksh:
#
# source `which env_parallel.ksh`
# source `which env_parallel.pdksh`
#
# after which 'env_parallel' works
#
@ -26,8 +26,87 @@
# Fifth Floor, Boston, MA 02110-1301 USA
env_parallel() {
# env_parallel.pdksh
export PARALLEL_ENV="$(alias | perl -pe 's/^/alias /';typeset -p|egrep -v 'typeset( -i)? -r|PIPESTATUS';typeset -f)";
`which parallel` "$@";
unset PARALLEL_ENV;
# env_parallel.pdksh
# 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 = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
}
}
' -- "$@"
)"
# Grep alias names
_alias_NAMES="$(alias | perl -pe 's/=.*//' |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
_list_alias_BODIES="alias $_alias_NAMES | perl -pe 's/^/alias /'"
if [[ "$_alias_NAMES" = "" ]] ; then
# no aliases selected
_list_alias_BODIES="true"
fi
unset _alias_NAMES
# Grep function names
_function_NAMES=$(typeset +p -f | perl -pe 's/\(\).*//' |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )
_list_function_BODIES="typeset -f $_function_NAMES"
if [[ "$_function_NAMES" = "" ]] ; then
# no functions selected
_list_function_BODIES="true"
fi
unset _function_NAMES
# Grep variable names
_tmp_READONLY="$(mktemp)"
readonly > "$_tmp_READONLY"
_variable_NAMES="$(typeset | perl -pe 's/^(type)?set( -.)* //' |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ |
grep -vFf $_tmp_READONLY |
grep -Ev '^(PIPESTATUS)')"
rm $_tmp_READONLY
unset _tmp_READONLY
_list_variable_VALUES="typeset -p $_variable_NAMES"
if [[ "$_variable_NAMES" = "" ]] ; then
# no variables selected
_list_variable_VALUES="true"
fi
unset _variable_NAMES
# eval is needed for aliases - cannot explain why
export PARALLEL_ENV="$(
eval $_list_alias_BODIES;
$_list_variable_VALUES;
$_list_function_BODIES)";
unset _list_alias_BODIES
unset _list_variable_VALUES
unset _list_function_BODIES
`which parallel` "$@";
unset PARALLEL_ENV;
}

View file

@ -160,29 +160,37 @@ E.g. by doing:
=item aliases
alias myecho=echo
env_parallel myecho ::: test
env_parallel -S server myecho ::: test
alias myecho 'echo aliases'
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
=item functions
function myfunc
echo $argv
echo functions $argv
end
env_parallel myfunc ::: test
env_parallel -S server myfunc ::: test
env_parallel myfunc ::: work
env_parallel -S server myfunc ::: work
env_parallel --env myfunc myfunc ::: work
env_parallel --env myfunc -S server myfunc ::: work
=item variables
set myvar test
env_parallel echo '$myvar' ::: test
env_parallel -S server echo '$myvar' ::: test
set myvar variables
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
=item arrays
set myarray foo bar baz
env_parallel echo '$myarray[{}]' ::: 1 2 3
env_parallel -S server echo '$myarray[{}]' ::: 1 2 3
set myarray arrays work, too
env_parallel -k echo '$myarray[{}]' ::: 1 2 3
env_parallel -k -S server echo '$myarray[{}]' ::: 1 2 3
env_parallel -k --env myarray echo '$myarray[{}]' ::: 1 2 3
env_parallel -k --env myarray -S server echo '$myarray[{}]' ::: 1 2 3
=back
@ -202,27 +210,35 @@ E.g. by doing:
=item aliases
alias myecho=echo
env_parallel myecho ::: test
env_parallel -S server myecho ::: test
alias myecho='echo aliases'
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
=item functions
myfunc() { echo $*; }
env_parallel myfunc ::: test
env_parallel -S server myfunc ::: test
myfunc() { echo functions $*; }
env_parallel myfunc ::: work
env_parallel -S server myfunc ::: work
env_parallel --env myfunc myfunc ::: work
env_parallel --env myfunc -S server myfunc ::: work
=item variables
myvar=test
env_parallel echo '$myvar' ::: test
env_parallel -S server echo '$myvar' ::: test
myvar=variables
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
=item arrays
myarray=(foo bar baz)
env_parallel echo '${myarray[{}]}' ::: 0 1 2
env_parallel -S server echo '${myarray[{}]}' ::: 0 1 2
myarray=(arrays work, too)
env_parallel -k echo '${myarray[{}]}' ::: 0 1 2
env_parallel -k -S server echo '${myarray[{}]}' ::: 0 1 2
env_parallel -k --env myarray echo '${myarray[{}]}' ::: 0 1 2
env_parallel -k --env myarray -S server echo '${myarray[{}]}' ::: 0 1 2
=back
@ -242,27 +258,35 @@ E.g. by doing:
=item aliases
alias myecho=echo
env_parallel myecho ::: test
env_parallel -S server myecho ::: test
alias myecho="echo aliases";
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
=item functions
myfunc() { echo $*; }
env_parallel myfunc ::: test
env_parallel -S server myfunc ::: test
myfunc() { echo functions $*; };
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
=item variables
myvar=test
env_parallel echo '$myvar' ::: test
env_parallel -S server echo '$myvar' ::: test
myvar=variables;
env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo "\$myvar" ::: work;
env_parallel --env myvar echo "\$myvar" ::: work;
env_parallel --env myvar -S server echo "\$myvar" ::: work
=item arrays
myarray=(foo bar baz)
env_parallel echo '${myarray[{}]}' ::: 0 1 2
env_parallel -S server echo '${myarray[{}]}' ::: 0 1 2
myarray=(arrays work, too);
env_parallel -k echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k -S server echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 0 1 2
=back
@ -288,6 +312,8 @@ E.g. by doing:
alias myecho echo
env_parallel myecho ::: test
env_parallel -S server myecho ::: test
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
=item functions
@ -298,6 +324,8 @@ Not supported by B<csh>.
set myvar=test
env_parallel echo "\$myvar" ::: test
env_parallel -S csh@server echo "\$myvar" ::: test
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
=item arrays with no special chars
@ -305,6 +333,8 @@ Not supported by B<csh>.
set myarray=(foo bar baz)
env_parallel echo "\${myarray\[\{\}\]}" ::: 1 2 3
env_parallel -S csh@server echo "\${myarray\[\{\}\]}" ::: 1 2 3
env_parallel -k --env myarray echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k --env myarray -S server echo \$'{myarray[{}]}' ::: 1 2 3
=back
@ -327,9 +357,11 @@ E.g. by doing:
=item aliases
alias myecho echo
env_parallel myecho ::: test
env_parallel -S server myecho ::: test
alias myecho 'echo aliases'
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
=item functions
@ -337,16 +369,19 @@ Not supported by B<tcsh>.
=item variables
set myvar=test
env_parallel echo "\$myvar" ::: test
env_parallel -S tcsh@server echo "\$myvar" ::: test
set myvar=variables
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
=item arrays with no special chars
set myarray=(foo bar baz)
env_parallel echo "\${myarray\[\{\}\]}" ::: 1 2 3
env_parallel -S tcsh@server echo "\${myarray\[\{\}\]}" ::: 1 2 3
set myarray=(arrays work, too)
env_parallel -k echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k -S server echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k --env myarray echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k --env myarray -S server echo \$'{myarray[{}]}' ::: 1 2 3
=back

View file

@ -29,8 +29,48 @@ if ("`alias env_parallel`" == '') then
# Activate alias
alias env_parallel 'setenv PARALLEL "\!*"; source `which env_parallel.tcsh`'
else
# 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 (.*)
set _tMpscRIpt=`tempfile`
cat <<'EOF' > $_tMpscRIpt
#!/usr/bin/perl
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)" : "(.*)";
'EOF'
set _grep_REGEXP="`perl $_tMpscRIpt -- $PARALLEL`"
# Deal with --env _
cat <<'EOF' > $_tMpscRIpt
#!/usr/bin/perl
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 = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
}
}
'EOF'
set _ignore_UNDERSCORE="`perl $_tMpscRIpt -- $PARALLEL`"
rm $_tMpscRIpt
# Get the scalar and array variable names
set _vARnAmES=(`set | awk -e '{print $1}' |grep -vE '^(_|killring|prompt2)$'`)
set _vARnAmES=(`set | awk -e '{print $1}' |grep -vE '^(#|_|killring|prompt2|command)$' | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$`)
# Make a tmpfile for the variable definitions
set _tMpvARfILe=`tempfile`
@ -38,18 +78,20 @@ else
# Make a tmpfile for the variable definitions + alias
set _tMpaLLfILe=`tempfile`
foreach _vARnAmE ($_vARnAmES);
# if $?myvar && $#myvar <= 1 echo scalar_myvar=$var
eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} <= 1) echo scalar_'$_vARnAmE'='\"\$$_vARnAmE\" >> $_tMpvARfILe;
# if $?myvar && $#myvar > 1 echo array_myvar=$var
eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} > 1) echo array_'$_vARnAmE'="$'$_vARnAmE'"' >> $_tMpvARfILe;
# if not defined: next
eval if'(! $?'$_vARnAmE') continue'
# if $#myvar <= 1 echo scalar_myvar=$var
eval if'(${#'$_vARnAmE'} <= 1) echo scalar_'$_vARnAmE'='\"\$$_vARnAmE\" >> $_tMpvARfILe;
# if $#myvar > 1 echo array_myvar=$var
eval if'(${#'$_vARnAmE'} > 1) echo array_'$_vARnAmE'="$'$_vARnAmE'"' >> $_tMpvARfILe;
end
unset _vARnAmE _vARnAmES
# shell quote variables (--plain needed due to $PARALLEL abuse)
# Convert 'scalar_myvar=...' to 'set myvar=...'
# Convert 'array_myvar=...' to 'set array=(...)'
cat $_tMpvARfILe | parallel --plain --shellquote | perl -pe 's/^scalar_(\S+).=/set $1=/ or s/^array_(\S+).=(.*)/set $1=($2)/ && s/\\ / /g;' > $_tMpaLLfILe
# Cleanup
rm $_tMpvARfILe; unset _tMpvARfILe _vARnAmE _vARnAmES
rm $_tMpvARfILe; unset _tMpvARfILe
# ALIAS TO EXPORT ALIASES:
@ -76,7 +118,10 @@ else
# Prepend with "\nalias "
# s/^/\001alias /;
# Quoted: s/\^/\\001alias\ /\;
alias | perl -pe s/\\047/\\047\\042\\047\\042\\047/g\;s/\^\(\\S+\)\(\\s+\)\\\(\(.\*\)\\\)/\\1\\2\\3/\;s/\^\(\\S+\)\(\\s+\)\(.\*\)/\\1\\2\\047\\3\\047/\;s/\^/\\001alias\ /\;s/\\\!/\\\\\\\!/g >> $_tMpaLLfILe
alias | \
grep -E "^$_grep_REGEXP" | \
grep -vE "^$_ignore_UNDERSCORE""[^_a-zA-Z]" | \
perl -pe s/\\047/\\047\\042\\047\\042\\047/g\;s/\^\(\\S+\)\(\\s+\)\\\(\(.\*\)\\\)/\\1\\2\\3/\;s/\^\(\\S+\)\(\\s+\)\(.\*\)/\\1\\2\\047\\3\\047/\;s/\^/\\001alias\ /\;s/\\\!/\\\\\\\!/g >> $_tMpaLLfILe
setenv PARALLEL_ENV "`cat $_tMpaLLfILe; rm $_tMpaLLfILe`";
unset _tMpaLLfILe;

View file

@ -29,30 +29,53 @@ env_parallel() {
# env_parallel.zsh
# 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){
_grep_REGEXP="$(
perl -e '
for(@ARGV){
/^_$/ and $next_is_env = 0;
$next_is_env and push @envvar, split/,/, $_;
$next_is_env=/^--env$/;
$next_is_env = /^--env$/;
}
$vars = join "|",map { quotemeta $_ } @envvar;
print $vars ? "($vars)" : "(.*)";
' -- "$@"
)"
# Deal with --env _
local _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 = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
}
}
' -- "$@"
)"
# Grep alias names
_alias_NAMES="$(print -l ${(k)aliases} |
egrep "^${grep_REGEXP}\$")"
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
_list_alias_BODIES="alias "$(echo $_alias_NAMES|xargs)" | perl -pe 's/^/alias /'"
if [[ "$_alias_NAMES" = "" ]] ; then
# no aliases selected
_list_alias_BODIES="true"
fi
unset _alias_NAMES
# Grep function names
_function_NAMES="$(print -l ${(k)functions} |
egrep "^${grep_REGEXP}\$" |
grep -E "^$_grep_REGEXP\$" | grep -vE "^$_ignore_UNDERSCORE\$" |
grep -v '='
)"
_list_function_BODIES="typeset -f "$(echo $_function_NAMES|xargs)
@ -60,11 +83,12 @@ env_parallel() {
# no functions selected
_list_function_BODIES="true"
fi
unset _function_NAMES
# Grep variable names
# The egrep -v is crap and should be better
_variable_NAMES="$(print -l ${(k)parameters} |
egrep "^${grep_REGEXP}\$" |
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ |
egrep -v '^([-?#!$*@_0]|zsh_eval_context|ZSH_EVAL_CONTEXT|LINENO|IFS|commands|functions|options|aliases|EUID|EGID|UID|GID)$' |
egrep -v 'terminfo|funcstack|galiases|keymaps|parameters|jobdirs|dirstack|functrace|funcsourcetrace|zsh_scheduled_events|dis_aliases|dis_reswords|dis_saliases|modules|reswords|saliases|widgets|userdirs|historywords|nameddirs|termcap|dis_builtins|dis_functions|jobtexts|funcfiletrace|dis_galiases|builtins|history|jobstates'
)"
@ -75,24 +99,17 @@ env_parallel() {
# no variables selected
_list_variable_VALUES="true"
fi
unset _variable_NAMES
export PARALLEL_ENV="$(
eval $_list_alias_BODIES;
eval $_list_function_BODIES;
eval $_list_variable_VALUES;
)";
unset _list_alias_BODIES
unset _list_variable_VALUES
unset _list_function_BODIES
`which parallel` "$@";
unset PARALLEL_ENV;
}
_old_env_parallel() {
# env_parallel.zsh
export PARALLEL_ENV="$(alias | perl -pe 's/^/alias /'; typeset -p |
grep -aFvf <(typeset -pr) |
egrep -iav 'ZSH_EVAL_CONTEXT|LINENO=| _=|aliases|^typeset [a-z_]+$'|
egrep -av '^(typeset -A (commands|functions|options)|typeset IFS=|..$)|cyan';
typeset -f)";
parallel "$@";
unset PARALLEL_ENV;
}

View file

@ -191,10 +191,10 @@ reaper();
::debug("init", "Done reaping\n");
if($opt::pipe and @opt::a) {
for my $job (@Global::tee_jobs) {
unlink $job->fh(2,"name");
::rm($job->fh(2,"name"));
$job->set_fh(2,"name","");
$job->print();
unlink $job->fh(1,"name");
::rm($job->fh(1,"name"));
}
}
::debug("init", "Cleaning\n");
@ -1208,7 +1208,7 @@ sub check_invalid_option_combinations {
sub init_globals {
# Defaults:
$Global::version = 20160627;
$Global::version = 20160704;
$Global::progname = 'parallel';
$Global::infinity = 2**31;
$Global::debug = 0;
@ -1953,7 +1953,7 @@ sub save_stdin_stdout_stderr {
# $Global::original_stderr
# $Global::original_stdin
# Returns: N/A
# TODO Disabled until we have an open3 that will take n filehandles
# for my $fdno (1..61) {
# # /dev/fd/62 and above are used by bash for <(cmd)
@ -3181,7 +3181,7 @@ sub parallelized_host_filtering {
::debug("init", $cmd, "\n");
my @out;
my $prepend = "";
my ($host_fh,$in,$err);
open3($in, $host_fh, $err, $cmd) || ::die_bug("parallel host check: $cmd");
if(not fork()) {
@ -3488,6 +3488,7 @@ sub reaper {
::wait_and_exit($Global::halt_exitstatus);
}
}
$job->cleanup();
start_more_jobs();
if($opt::progress) {
my %progress = progress();
@ -3814,6 +3815,7 @@ sub tmpfile {
sub tmpname {
# Select a name that does not exist
# Do not create the file as it may be used for creating a socket (by tmux)
# Remember the name in $Global::unlink to avoid hitting the same name twice
my $name = shift;
my($tmpname);
if(not -w $ENV{'TMPDIR'}) {
@ -3832,13 +3834,21 @@ sub tmpname {
}
sub tmpfifo {
# Securely make a fifo by securely making a dir with a fifo in it
# Find an unused name and mkfifo on it
use POSIX qw(mkfifo);
my $tmpfifo = tmpname("fif",@_);
mkfifo($tmpfifo,0600);
return $tmpfifo;
}
sub rm {
# Remove file and remove it from %Global::unlink
# Uses:
# %Global::unlink
delete @Global::unlink{@_};
unlink @_;
}
sub size_of_block_dev {
# Like -s but for block devices
# Input:
@ -4452,8 +4462,8 @@ sub new {
sub DESTROY {
my $self = shift;
# Remove temporary files if they are created.
unlink $self->{'loadavg_file'};
unlink $self->{'swap_activity_file'};
::rm($self->{'loadavg_file'});
::rm($self->{'swap_activity_file'});
}
sub string {
@ -6158,6 +6168,8 @@ sub new {
# filehandle for stdin (used for --pipe)
# filename for writing stdout to (used for --files)
# remaining data not sent to stdin (used for --pipe)
# tmpfiles to cleanup when job is done
'unlink' => [],
# amount of data sent via stdin (used for --pipe)
'transfersize' => 0, # size of files using --transfer
'returnsize' => 0, # size of files using --return
@ -6381,6 +6393,25 @@ sub openoutputfiles {
}
}
sub add_rm {
# Files to remove when job is done
my $self = shift;
push $self->{'unlink'}, @_;
}
sub get_rm {
# Files to remove when job is done
my $self = shift;
return @{$self->{'unlink'}};
}
sub cleanup {
# Remove files when job is done
my $self = shift;
unlink $self->get_rm();
delete @Global::unlink{$self->get_rm()};
}
sub grouped {
my $self = shift;
# Set reading FD if using --group (--ungroup does not need)
@ -6392,7 +6423,7 @@ sub grouped {
::die_bug("fdr: Cannot open ".$self->fh($fdno,'name'));
$self->set_fh($fdno,'r',$fdr);
# Unlink if required
$Global::debug or unlink $self->fh($fdno,"unlink");
$Global::debug or ::rm($self->fh($fdno,"unlink"));
}
}
@ -7402,7 +7433,7 @@ sub sshcleanup {
my $workdir = $self->workdir();
my $cleancmd = "";
for my $file ($self->cleanup()) {
for my $file ($self->remote_cleanup()) {
my @subworkdirs = parentdirs_of($file);
$cleancmd .= $sshlogin->cleanup_cmd($file,$workdir).";";
}
@ -7412,7 +7443,7 @@ sub sshcleanup {
return $cleancmd;
}
sub cleanup {
sub remote_cleanup {
# Returns:
# Files to remove at cleanup
my $self = shift;
@ -7602,6 +7633,7 @@ sub start {
$ENV{'PARALLEL_SEQ'} = $job->seq();
$ENV{'PARALLEL_PID'} = $$;
$ENV{'PARALLEL_TMP'} = ::tmpname("par");
$job->add_rm($ENV{'PARALLEL_TMP'});
::debug("run", $Global::total_running, " processes . Starting (",
$job->seq(), "): $command\n");
if($opt::pipe) {
@ -7721,6 +7753,7 @@ sub print_dryrun_and_verbose {
my $actual_command = shift;
# Temporary file name. Used for fifo to communicate exit val
my $tmpfifo=::tmpname("tmx");
$self->add_rm($tmpfifo);
if(length($tmpfifo) >=100) {
::error("tmux does not support sockets with path > 100.");
@ -7882,7 +7915,7 @@ sub print {
if($opt::dryrun) {
# Nothing was printed to this job:
# cleanup tmp files if --files was set
unlink $self->fh(1,"name");
::rm($self->fh(1,"name"));
}
if($opt::pipe and $self->virgin()) {
# Skip --joblog, --dryrun, --verbose
@ -7973,8 +8006,8 @@ sub files_print {
# Nothing was printed to this job:
# cleanup unused tmp files if --files was set
for my $fdno (1,2) {
unlink $self->fh($fdno,"name");
unlink $self->fh($fdno,"unlink");
::rm($self->fh($fdno,"name"));
::rm($self->fh($fdno,"unlink"));
}
} elsif($fdno == 1 and $self->fh($fdno,"name")) {
print $out_fd $self->tag(),$self->fh($fdno,"name"),"\n";
@ -8000,7 +8033,6 @@ sub linebuffer_print {
}
if($opt::compress) {
# Blocked reading in final round
$Global::use{"Fcntl"} ||= eval "use Fcntl qw(:DEFAULT :flock); 1;";
for my $fdno (1,2) {
::set_fh_blocking($self->fh($fdno,'r'));
}
@ -8051,7 +8083,28 @@ sub linebuffer_print {
if($self->fh($fdno,"rpid") and CORE::kill 0, $self->fh($fdno,"rpid")) {
# decompress still running
} else {
# decompress done: close fh
# decompress done:
# copy to sql (if needed)
# then close fh
if($opt::sqlworker) {
my @output;
my $tag = $self->tag();
seek $in_fh, 0, 0;
while(<$in_fh>) {
push @output, $tag,$_;
}
if($fdno == 1) {
if(not $opt::results) {
$Global::sql->update("SET Stdout = ? WHERE Seq = ".$self->seq(),
join("",@output));
}
} else {
if(not $opt::results) {
$Global::sql->update("SET Stderr = ? WHERE Seq = ".$self->seq(),
join("",@output));
}
}
}
close $in_fh;
if($? and $opt::compress) {
::error($opt::decompress_program." failed.");
@ -8075,12 +8128,25 @@ sub tag_print {
# $in_fh is now ready for reading at position 0
my $tag = $self->tag();
my $outputlength = 0;
my @output;
while(<$in_fh>) {
print $out_fd $tag,$_;
$outputlength += length $_;
if($opt::sqlworker) {
push @output, $tag,$_;
}
}
if($fdno == 1) {
$self->add_returnsize($outputlength);
if($opt::sqlworker and not $opt::results) {
$Global::sql->update("SET Stdout = ? WHERE Seq = ".$self->seq(),
join("",@output));
}
} else {
if($opt::sqlworker and not $opt::results) {
$Global::sql->update("SET Stderr = ? WHERE Seq = ".$self->seq(),
join("",@output));
}
}
close $in_fh;
if($? and $opt::compress) {
@ -8149,13 +8215,13 @@ sub print_joblog {
sub tag {
my $self = shift;
if($opt::tag or defined $opt::tagstring) {
if(not defined $self->{'tag'}) {
if(not defined $self->{'tag'}) {
if($opt::tag or defined $opt::tagstring) {
$self->{'tag'} = $self->{'commandline'}->
replace_placeholders([$opt::tagstring],0,0)."\t";
} else {
$self->{'tag'} = "";
}
} else {
return "";
}
return $self->{'tag'};
}
@ -9223,7 +9289,7 @@ sub tmux_length {
my $tmuxcmd = $ENV{'TMUX'}." -S $tmpfile new-session -d -n echo $l".
("x"x$l). " && echo $l; rm -f $tmpfile";
push @out, ::qqx($tmuxcmd);
unlink $tmpfile;
::rm($tmpfile);
}
::debug("tmux","tmux-out ",@out);
chomp @out;
@ -9904,6 +9970,13 @@ sub new {
my $dbh = DBI->connect($dsn, $userid, $password,
{ RaiseError => 1, AutoInactiveDestroy => 1 })
or die $DBI::errstr;
$dbh->{'PrintWarn'} = $Global::debug || 0;
$dbh->{'PrintError'} = $Global::debug || 0;
$dbh->{'RaiseError'} = 1;
$dbh->{'ShowErrorStatement'} = 1;
$dbh->{'HandleError'} = sub {};
return bless {
'dbh' => $dbh,
'driver' => $driver,
@ -10079,19 +10152,40 @@ sub run {
my $lockretry = 0;
while($lockretry < 10) {
$sth = $dbh->prepare($stmt);
if($rv = $sth->execute(@_)) {
if($sth
and
eval { $rv = $sth->execute(@_) }) {
last;
} else {
if($@ =~ /no such table|Table .* doesn.t exist|relation ".*" does not exist/
or
$DBI::errstr =~ /no such table|Table .* doesn.t exist|relation ".*" does not exist/) {
# This is fine:
# It is just a worker that reported back too late -
# another worker had finished the job first
# and the table was then dropped
$rv = $sth = 0;
last;
}
if($DBI::errstr =~ /locked/) {
::debug("sql","Lock retry: $lockretry");
$lockretry++;
::usleep(rand()*300);
} elsif(not $sth) {
# Try again
$lockretry++;
} else {
::error($DBI::errstr);
::wait_and_exit(255);
}
}
}
if($lockretry >= 10) {
::die_bug("retry > 10: $DBI::errstr");
}
if($rv < 0){
print $DBI::errstr;
::error($DBI::errstr);
::wait_and_exit(255);
}
return $sth;
}
@ -10100,7 +10194,8 @@ sub get {
my $self = shift;
my $sth = $self->run(@_);
my @retval;
while(1) {
# If $sth = 0 it means the table was dropped by another process
while($sth) {
my @row = $sth->fetchrow_array();
@row or last;
push @retval, \@row;
@ -10269,7 +10364,7 @@ sub remove_dead_locks {
if($host eq ::hostname()) {
if(not kill 0, $pid) {
::debug("sem", "Dead: $d\n");
unlink $d;
::rm($d);
} else {
::debug("sem", "Alive: $d\n");
}
@ -10318,12 +10413,12 @@ sub acquire {
sub release {
my $self = shift;
unlink $self->{'pidfile'};
::rm($self->{'pidfile'});
if($self->nlinks() == 1) {
# This is the last link, so atomic cleanup
$self->lock();
if($self->nlinks() == 1) {
unlink $self->{'idfile'};
::rm($self->{'idfile'});
rmdir $self->{'lockdir'};
}
$self->unlock();
@ -10341,7 +10436,7 @@ sub pid_change {
$self->{'pidfile'} = $self->{'lockdir'}."/".$$.'@'.::hostname();
my $retval = link $self->{'idfile'}, $self->{'pidfile'};
::debug("sem","link($self->{'idfile'},$self->{'pidfile'})=$retval\n");
unlink $old_pidfile;
::rm($old_pidfile);
}
sub atomic_link_if_count_less_than {
@ -10439,7 +10534,7 @@ sub lock {
sub unlock {
my $self = shift;
unlink $self->{'lockfile'};
::rm($self->{'lockfile'});
close $self->{'lockfh'};
::debug("run", "unlocked\n");
}

View file

@ -2902,30 +2902,87 @@ Or if the regexps are fixed strings:
grep -F -f regexps.txt bigfile
There are 2 limiting factors: CPU and disk I/O. CPU is easy to
measure: If the B<grep> takes >90% CPU (e.g. when running top), then the
CPU is a limiting factor, and parallelization will speed this up. If
not, then disk I/O is the limiting factor, and depending on the disk
system it may be faster or slower to parallelize. The only way to know
for certain is to measure.
There are 3 limiting factors: CPU, RAM, and disk I/O.
If the CPU is the limiting factor parallelization should be done on the regexps:
RAM is easy to measure: If the B<grep> process takes up most of your
free memory (e.g. when running B<top>), then RAM is a limiting factor.
cat regexp.txt | parallel --pipe -L1000 --round-robin grep -f - bigfile
CPU is also easy to measure: If the B<grep> takes >90% CPU in B<top>,
then the CPU is a limiting factor, and parallelization will speed this
up.
If a line matches multiple regexps, the line may be duplicated. The
command will start one B<grep> per CPU and read I<bigfile> one time
per CPU, but as that is done in parallel, all reads except the first
will be cached in RAM. Depending on the size of I<regexp.txt> it may
be faster to use B<--block 10m> instead of B<-L1000>. If I<regexp.txt>
is too big to fit in RAM, remove B<--round-robin> and adjust
B<-L1000>. This will cause I<bigfile> to be read more times.
It is harder to see if disk I/O is the limiting factor, and depending
on the disk system it may be faster or slower to parallelize. The only
way to know for certain is to test and measure.
=head2 Limiting factor: RAM
The normal B<grep -f regexs.txt bigfile> works no matter the size of
bigfile, but if regexps.txt is so big it cannot fit into memory, then
you need to split this.
B<grep -F> takes around 100 bytes of RAM and B<grep> takes about 500
bytes of RAM per 1 byte of regexp. So if regexps.txt is 1% of your
RAM, then it may be too big.
If you can convert your regexps into fixed strings do that. E.g. if
the lines you are looking for in bigfile all looks like:
ID1 foo bar baz Identifier1 quux
fubar ID2 foo bar baz Identifier2
then your regexps.txt can be converted from:
ID1.*Identifier1
ID2.*Identifier2
into:
ID1 foo bar baz Identifier1
ID2 foo bar baz Identifier2
This way you can use B<grep -F> which takes around 80% less memory and
is much faster.
If it still does not fit in memory you can do this:
parallel --pipepart -a regexps.txt --block 1M grep -F -f - -n bigfile |
sort -un | perl -pe 's/^\d+://'
The 1M should be your free memory divided by the number of cores and
divided by 200 for B<grep -F> and by 1000 for normal B<grep>. On
GNU/Linux you can do:
free=$(awk '/^((Swap)?Cached|MemFree|Buffers):/ { sum += $2 }
END { print sum }' /proc/meminfo)
percpu=$((free / 200 / $(parallel --number-of-cores)))k
parallel --pipepart -a regexps.txt --block $percpu --compress grep -F -f - -n bigfile |
sort -un | perl -pe 's/^\d+://'
If you can live with duplicated lines and wrong order, it is faster to do:
parallel --pipepart -a regexps.txt --block $percpu --compress grep -F -f - bigfile
=head2 Limiting factor: CPU
If the CPU is the limiting factor parallelization should be done on
the regexps:
cat regexp.txt | parallel --pipe -L1000 --round-robin --compress grep -f - -n bigfile |
sort -un | perl -pe 's/^\d+://'
The command will start one B<grep> per CPU and read I<bigfile> one
time per CPU, but as that is done in parallel, all reads except the
first will be cached in RAM. Depending on the size of I<regexp.txt> it
may be faster to use B<--block 10m> instead of B<-L1000>.
Some storage systems perform better when reading multiple chunks in
parallel. This is true for some RAID systems and for some network file
systems. To parallelize the reading of I<bigfile>:
parallel --pipepart --block 100M -a bigfile -k grep -f regexp.txt
parallel --pipepart --block 100M -a bigfile -k --compress grep -f regexp.txt
This will split I<bigfile> into 100MB chunks and run B<grep> on each of
these chunks. To parallelize both reading of I<bigfile> and I<regexp.txt>
@ -2936,6 +2993,11 @@ combine the two using B<--fifo>:
If a line matches multiple regexps, the line may be duplicated.
=head2 Bigger problem
If the problem is too big to be solved by this, you are probably ready
for Lucene.
=head1 EXAMPLE: Using remote computers

0
testsuite/Start.sh Normal file → Executable file
View file

View file

@ -8,45 +8,23 @@
TMP5G=${TMP5G:-/dev/shm}
export TMP5G
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
echo '### Test of --retries on unreachable host'
par_retries_unreachable() {
echo '### Test of --retries on unreachable host'
seq 2 | stdout parallel -k --retries 2 -v -S 4.3.2.1,: echo
}
echo '**'
par_outside_file_handle_limit() {
echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error"
(echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) |
stdout parallel -uj 0 | egrep -v 'processes took|adjusting'
}
echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error"
(echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) | stdout parallel -uj 0 | egrep -v 'processes took|adjusting'
par_over_4GB() {
echo '### Test if we can deal with output > 4 GB'
echo |
nice parallel --tmpdir $TMP5G -q perl -e '$a="x"x1000000;for(0..4300){print $a}' |
nice md5sum
}
echo '**'
echo '### Test if we can deal with output > 4 GB'
echo | nice parallel --tmpdir $TMP5G -q perl -e '$a="x"x1000000;for(0..4300){print $a}' | nice md5sum
echo '**'
echo 'bug #41613: --compress --line-buffer no --tagstring';
diff
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
nice parallel -N10 -L1 --pipe -j6 --block 20M --compress
pv -qL 1000000 | perl -pe 's/(....).*/$1/')
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
nice parallel -N10 -L1 --pipe -j6 --block 20M --compress --line-buffer
pv -qL 1000000 | perl -pe 's/(....).*/$1/')
>/dev/null
|| (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
echo 'bug #41613: --compress --line-buffer with --tagstring';
diff
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
nice parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#}
pv -qL 1000000 | perl -pe 's/(....).*/$1/')
<(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'|
nice parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} --line-buffer
pv -qL 1000000 | perl -pe 's/(....).*/$1/')
>/dev/null
|| (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
echo '**'
EOF
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | parallel -vj0 -k --tag --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -4,27 +4,94 @@
# Each should be taking 30-100s and be possible to run in parallel
# I.e.: No race conditions, no logins
# Assume /tmp/shm is easy to fill up
export SHM=/tmp/shm/parallel
mkdir -p $SHM
sudo umount -l $SHM
sudo mount -t tmpfs -o size=10% none $SHM
par_race_condition1() {
echo '### Test race condition on 8 CPU (my laptop)'
seq 1 5000000 > /tmp/parallel_race_cond
seq 1 10 | parallel -k "cat /tmp/parallel_race_cond | parallel --pipe --recend '' -k gzip >/dev/null; echo {}"
rm /tmp/parallel_race_cond
}
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj4 -k --joblog /tmp/jl-`basename $0` -L1
echo '### Test race condition on 8 CPU (my laptop)';
seq 1 5000000 > /tmp/parallel_test;
seq 1 10 | parallel -k "cat /tmp/parallel_test | parallel --pipe --recend '' -k gzip >/dev/null; echo {}";
rm /tmp/parallel_test
par_tmp_full() {
# Assume /tmp/shm is easy to fill up
export SHM=/tmp/shm/parallel
mkdir -p $SHM
sudo umount -l $SHM
sudo mount -t tmpfs -o size=10% none $SHM
echo '**'
echo "### Test --tmpdir running full. bug #40733 was caused by this"
stdout parallel -j1 --tmpdir $SHM cat /dev/zero ::: dummy
}
echo "### Test --tmpdir running full. bug #40733 was caused by this"
stdout parallel -j1 --tmpdir $SHM cat /dev/zero ::: dummy
par_bug_48290() {
echo "### bug #48290: round-robin does not distribute data based on business"
echo "Jobslot 1 is 256 times slower than jobslot 4 and should get much less data"
yes "$(seq 1000|xargs)" | head -c 30M |
parallel --tagstring {%} --linebuffer --compress -j4 --roundrobin --pipe --block 10k \
pv -qL '{= $_=int( $job->slot()**4/2+1) =}'0000 |
perl -ne '/^\d+/ and $s{$&}++; END { print map { "$_\n" } sort { $s{$b} <=> $s{$a} } keys %s}'
}
echo '**'
par_memory_leak() {
a_run() {
seq $1 |time -v parallel true 2>&1 |
grep 'Maximum resident' |
field 6;
}
export -f a_run
echo "### Test for memory leaks"
echo "Of 10 runs of 1 job at least one should be bigger than a 3000 job run"
small_max=$(seq 10 | parallel a_run 1 | jq -s max)
big=$(a_run 3000)
if [ $small_max -lt $big ] ; then
echo "Bad: Memleak likely."
else
echo "Good: No memleak detected."
fi
}
echo "### bug #48290: round-robin does not distribute data based on business"
echo "Jobslot 1 is 8 times slower than jobslot 8 and should get much less data"
seq 10000000 | parallel --tagstring {%} --linebuffer --compress -j8 --roundrobin --pipe --block 300k 'pv -qL {%}00000'| perl -ne '/^\d+/ and $s{$&}++; END { print map { "$_\n" } sort { $s{$a} <=> $s{$b} } keys %s}'
par_linebuffer_matters_compress_tag() {
echo "### (--linebuffer) --compress --tag should give different output"
random_data_with_id_prepended() {
perl -pe 's/^/'$1'/' /dev/urandom |
pv -qL 300000 | head -c 1000000
}
export -f random_data_with_id_prepended
EOF
nolb=$(seq 10 |
parallel -j0 --compress --tag random_data_with_id_prepended {#} |
field 1 | uniq)
lb=$(seq 10 |
parallel -j0 --linebuffer --compress --tag random_data_with_id_prepended {#} |
field 1 | uniq)
if [ "$lb" == "$nolb" ] ; then
echo "BAD: --linebuffer makes no difference"
else
echo "OK: --linebuffer makes a difference"
fi
}
par_linebuffer_matters_compress() {
echo "### (--linebuffer) --compress --tag should give different output"
random_data_with_id_prepended() {
perl -pe 's/^/'$1'/' /dev/urandom |
pv -qL 300000 | head -c 1000000
}
export -f random_data_with_id_prepended
nolb=$(seq 10 |
parallel -j0 --compress random_data_with_id_prepended {#} |
field 1 | uniq)
lb=$(seq 10 |
parallel -j0 --linebuffer --compress random_data_with_id_prepended {#} |
field 1 | uniq)
if [ "$lb" == "$nolb" ] ; then
echo "BAD: --linebuffer makes no difference"
else
echo "OK: --linebuffer makes a difference"
fi
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort | parallel -j6 --tag -k '{} 2>&1'

126
testsuite/tests-to-run/parallel-local-sql.sh Normal file → Executable file
View file

@ -1,75 +1,75 @@
#!/bin/bash
export SQLITE=sqlite3:///%2Frun%2Fshm%2Fparallel.db
export SQLITETBL=$SQLITE/parsql
export PG=pg://tange:tange@lo/tange
export PGTBL=$PG/parsql
export MYSQL=mysql://`whoami`:`whoami`@lo/tange
export MYSQLTBL=$MYSQL/parsql
export PGTBL2=${PGTBL}2
export PGTBL3=${PGTBL}3
export PGTBL4=${PGTBL}4
export PGTBL5=${PGTBL}5
export T1=$(tempfile)
export T2=$(tempfile)
export T3=$(tempfile)
export T4=$(tempfile)
export T5=$(tempfile)
export T6=$(tempfile)
export T7=$(tempfile)
export T8=$(tempfile)
export T9=$(tempfile)
export T10=$(tempfile)
export T11=$(tempfile)
export T12=$(tempfile)
export T13=$(tempfile)
export T14=$(tempfile)
export PG=pg://`whoami`:`whoami`@lo/`whoami`
export MYSQL=mysql://`whoami`:`whoami`@lo/`whoami`
#sql mysql://tange:tange@lo/ 'create database tange;';
cat <<'EOF' | sed -e 's/;$/; /;' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 | perl -pe 's/\s*\d+\.?\d+\s*/999/g;s/999e+999.\s+.\s+/999e+999|999/g;'
echo '### --sqlandworker mysql'
(sleep 2; parallel --sqlworker $MYSQLTBL sleep .3\;echo >$T1) &
parallel --sqlandworker $MYSQLTBL sleep .3\;echo ::: {1..5} ::: {a..e} >$T2;
true sort -u $T1 $T2;
sleep 1; sql $MYSQL 'select * from parsql order by seq;'
export DEBUG=false
echo '### --sqlandworker postgresql'
(sleep 2; parallel --sqlworker $PGTBL sleep .3\;echo >$T3) &
parallel --sqlandworker $PGTBL sleep .3\;echo ::: {1..5} ::: {a..e} >$T4;
true sort -u $T3 $T4;
sleep 1; sql $PG 'select * from parsql order by seq;'
p_showsqlresult() {
SERVERURL=$1
TABLE=$2
sql $SERVERURL "select Host,Command,V1,V2,Stdout,Stderr from $TABLE order by seq;"
}
echo '### --sqlandworker sqlite'
(sleep 2; parallel --sqlworker $SQLITETBL sleep .3\;echo >$T5) &
parallel --sqlandworker $SQLITETBL sleep .3\;echo ::: {1..5} ::: {a..e} >$T6;
true sort -u $T5 $T6;
sleep 1; sql $SQLITE 'select * from parsql order by seq;'
p_wrapper() {
INNER=$1
SERVERURL=$(eval echo $2)
TABLE=TBL$RANDOM
DBURL=$SERVERURL/$TABLE
T1=$(tempfile)
T2=$(tempfile)
eval "$INNER"
echo Exit=$?
wait
echo Exit=$?
$DEBUG && sort -u $T1 $T2;
rm $T1 $T2
p_showsqlresult $SERVERURL $TABLE
$DEBUG || sql $SERVERURL "drop table $TABLE;" >/dev/null
}
echo '### --sqlandworker postgresql -S lo'
(sleep 2; parallel -S lo --sqlworker $PGTBL2 sleep .3\;echo >$T7) &
parallel -S lo --sqlandworker $PGTBL2 sleep .3\;echo ::: {1..5} ::: {a..e} >$T8;
true sort -u $T7 $T8;
sleep 1; sql $PG 'select * from parsql2 order by seq;'
p_template() {
(sleep 2; parallel "$@" --sqlworker $DBURL sleep .3\;echo >$T1) &
parallel "$@" --sqlandworker $DBURL sleep .3\;echo ::: {1..5} ::: {a..e} >$T2;
}
export -f p_template
echo '### --sqlandworker postgresql --results'
mkdir -p /tmp/out--sql
(sleep 2; parallel --results /tmp/out--sql --sqlworker $PGTBL3 sleep .3\;echo >$T9) &
parallel --results /tmp/out--sql --sqlandworker $PGTBL3 sleep .3\;echo ::: {1..5} ::: {a..e} >$T10;
true sort -u $T9 $T10;
sleep 1; sql $PG 'select * from parsql3 order by seq;'
par_sqlandworker() {
p_template
}
echo '### --sqlandworker postgresql --linebuffer'
(sleep 2; parallel --linebuffer --sqlworker $PGTBL4 sleep .3\;echo >$T11) &
parallel --linebuffer --sqlandworker $PGTBL4 sleep .3\;echo ::: {1..5} ::: {a..e} >$T12;
true sort -u $T11 $T12;
sleep 1; sql $PG 'select * from parsql4 order by seq;'
par_sqlandworker_lo() {
p_template -S lo
}
echo '### --sqlandworker postgresql -u'
(sleep 2; parallel -u --sqlworker $PGTBL5 sleep .3\;echo >$T13) &
parallel -u --sqlandworker $PGTBL5 sleep .3\;echo ::: {1..5} ::: {a..e} >$T14;
true sort -u $T13 $T14;
sleep 1; sql $PG 'select * from parsql5 order by seq;'
par_sqlandworker_results() {
p_template --results /tmp/out--sql
}
EOF
par_sqlandworker_linebuffer() {
p_template --linebuffer
}
eval rm '$T'{1..14}
par_sqlandworker_tag() {
p_template --tag
}
par_sqlandworker_linebuffer_tag() {
p_template --linebuffer --tag
}
par_sqlandworker_compress_linebuffer_tag() {
p_template --compress --linebuffer --tag
}
par_sqlandworker_unbuffer() {
p_template -u
}
export -f $(compgen -A function | egrep 'p_|par_')
# Tested that -j0 in parallel is fastest (up to 15 jobs)
compgen -A function | grep par_ | sort |
stdout parallel -vj5 -k --tag --joblog /tmp/jl-`basename $0` p_wrapper \
:::: - ::: \$MYSQL \$PG \$SQLITE

View file

@ -1,80 +1,10 @@
#!/bin/bash
# TODO ksh fish
unset run_test
# SSH only allowed to localhost/lo
# --retries if ssh dies
cat <<'EOF' | sed -e s/\$SERVER1/$SERVER1/\;s/\$SERVER2/$SERVER2/ | parallel -vj4 --retries 2 -k --joblog /tmp/jl-`basename $0` -L1
echo '### --env from man env_parallel'
echo '### bash'
ssh bash@lo '
alias myecho="echo aliases";
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
'
ssh bash@lo '
myfunc() { echo functions $*; };
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
'
ssh bash@lo '
myvar=variables;
env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo "\$myvar" ::: work;
env_parallel --env myvar echo "\$myvar" ::: work;
env_parallel --env myvar -S server echo "\$myvar" ::: work
'
ssh bash@lo '
myarray=(arrays work, too);
env_parallel -k echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k -S server echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 0 1 2
'
echo '### zsh'
ssh zsh@lo '
alias myecho="echo aliases";
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
'
ssh zsh@lo '
myfunc() { echo functions $*; };
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
'
ssh zsh@lo '
myvar=variables;
env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo "\$myvar" ::: work;
env_parallel --env myvar echo "\$myvar" ::: work;
env_parallel --env myvar -S server echo "\$myvar" ::: work
'
ssh zsh@lo '
myarray=(arrays work, too);
env_parallel -k echo "\${myarray[{}]}" ::: 1 2 3;
env_parallel -k -S server echo "\${myarray[{}]}" ::: 1 2 3;
env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 1 2 3;
env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 1 2 3
'
echo '### --env _'
fUbAr="OK FUBAR" parallel -S parallel@lo --env _ echo '$fUbAr $DEBEMAIL' ::: test
fUbAr="OK FUBAR" parallel -S csh@lo --env _ echo '$fUbAr $DEBEMAIL' ::: test
@ -87,13 +17,6 @@ echo 'bug #40137: SHELL not bash: Warning when exporting funcs'
. <(printf 'myfunc() {\necho $1\n}'); export -f myfunc; parallel --env myfunc -S lo myfunc ::: no_warning
. <(printf 'myfunc() {\necho $1\n}'); export -f myfunc; SHELL=/bin/sh parallel --env myfunc -S lo myfunc ::: warning
echo 'env_parallel from man page - transfer non-exported var'
source $(which env_parallel.bash);
var=nonexported env_parallel -S parallel@lo echo '$var' ::: variable
echo 'compared to parallel - no transfer non-exported var'
var=nonexported parallel -S parallel@lo echo '$var' ::: variable
echo '### zsh'
echo 'env in zsh'
@ -189,161 +112,3 @@ echo '### bug #45575: -m and multiple hosts repeats first args'
seq 1 3 | parallel -X -S 2/lo,2/: -k echo
EOF
echo
echo Test env_parallel:
echo + for each shell
echo + remote, locally
echo + variables, variables with funky content, arrays, assoc array, functions, aliases
echo
echo "### Bash environment"
#stdout ssh -t lo <<'EOS'
myvar="myvar works"
funky=$(perl -e 'print pack "c*", 1..255')
myarray=('' array_val2 3 '' 5 ' space 6 ')
declare -A assocarr
assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
func_echo() {
echo $*;
echo "$myvar"
echo "${myarray[5]}"
echo ${assocarr[a]}
echo Funky-"$funky"-funky
}
. `which env_parallel.bash`
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S lo alias_echo ::: alias_works_over_ssh
env_parallel -S lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
#EOS
echo
echo "### Zsh environment"
stdout ssh -q zsh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates'
myvar="myvar works"
funky=$(perl -e 'print pack "c*", 1..255')
myarray=('' array_val2 3 '' 5 ' space 6 ')
declare -A assocarr
assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
func_echo() {
echo $*;
echo "$myvar"
echo "$myarray[6]"
echo ${assocarr[a]}
echo Funky-"$funky"-funky
}
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S zsh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S zsh@lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
EOS
echo
echo "### Ksh environment"
stdout ssh -q ksh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates'
myvar="myvar works"
funky=$(perl -e 'print pack "c*", 1..255')
myarray=('' array_val2 3 '' 5 ' space 6 ')
typeset -A assocarr
assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
func_echo() {
echo $*;
echo "$myvar"
echo "${myarray[5]}"
echo ${assocarr[a]}
echo Funky-"$funky"-funky
}
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S ksh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S ksh@lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
EOS
echo
echo "### Fish environment"
stdout ssh -q fish@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates'
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')
set myarray '' array_val2 3 '' 5 ' space 6 '
# Assoc arrays do not exist
#typeset -A assocarr
#assocarr[a]=assoc_val_a
#assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
function func_echo
echo $argv;
echo "$myvar"
echo "$myenvvar"
echo "$myarray[6]"
# Assoc arrays do not exist in fish
# echo ${assocarr[a]}
echo
echo
echo
echo Funky-"$funky"-funky
echo Funkyenv-"$funkyenv"-funkyenv
echo
echo
echo
end
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S fish@lo alias_echo ::: alias_works_over_ssh
env_parallel -S fish@lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
EOS
echo
echo "### csh environment"
stdout ssh -q csh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates'
set myvar = "myvar works"
set funky = "`perl -e 'print pack q(c*), 2..255'`"
set myarray = ('' 'array_val2' '3' '' '5' ' space 6 ')
#declare -A assocarr
#assocarr[a]=assoc_val_a
#assocarr[b]=assoc_val_b
alias alias_echo echo 3 arg;
alias alias_echo_var 'echo $argv; echo "$myvar"; echo "${myarray[4]} special chars problem"; echo Funky-"$funky"-funky'
#function func_echo
# echo $argv;
# echo $myvar;
# echo ${myarray[2]}
# #echo ${assocarr[a]}
# echo Funky-"$funky"-funky
#end
env_parallel alias_echo ::: alias_works
env_parallel alias_echo_var ::: alias_var_works
env_parallel func_echo ::: function_does_not_work
env_parallel -S csh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S csh@lo alias_echo_var ::: alias_var_works_over_ssh
env_parallel -S csh@lo func_echo ::: function_does_not_work_over_ssh
echo
echo "$funky" | parallel --shellquote
EOS

View file

@ -0,0 +1,746 @@
#!/bin/bash
echo '### test --env _'
echo 'Both test that variables are copied,'
echo 'but also that they are NOT copied, if ignored'
par_bash_man() {
echo '### bash'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
alias myecho="echo aliases";
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
myfunc() { echo functions $*; };
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
myvar=variables;
env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo "\$myvar" ::: work;
env_parallel --env myvar echo "\$myvar" ::: work;
env_parallel --env myvar -S server echo "\$myvar" ::: work
myarray=(arrays work, too);
env_parallel -k echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k -S server echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 0 1 2
_EOF
)
ssh bash@lo "$myscript"
}
par_zsh_man() {
echo '### zsh'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
alias myecho="echo aliases";
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
myfunc() { echo functions $*; };
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
myvar=variables;
env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo "\$myvar" ::: work;
env_parallel --env myvar echo "\$myvar" ::: work;
env_parallel --env myvar -S server echo "\$myvar" ::: work
myarray=(arrays work, too);
env_parallel -k echo "\${myarray[{}]}" ::: 1 2 3;
env_parallel -k -S server echo "\${myarray[{}]}" ::: 1 2 3;
env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 1 2 3;
env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 1 2 3
_EOF
)
ssh zsh@lo "$myscript"
}
par_ksh_man() {
echo '### ksh'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
. `which env_parallel.ksh`;
alias myecho="echo aliases";
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
. `which env_parallel.ksh`;
myfunc() { echo functions $*; };
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
. `which env_parallel.ksh`;
myvar=variables;
env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo "\$myvar" ::: work;
env_parallel --env myvar echo "\$myvar" ::: work;
env_parallel --env myvar -S server echo "\$myvar" ::: work
. `which env_parallel.ksh`;
myarray=(arrays work, too);
env_parallel -k echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k -S server echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 0 1 2
_EOF
)
ssh ksh@lo "$myscript"
}
par_pdksh_man() {
echo '### pdksh'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
. `which env_parallel.pdksh`;
alias myecho="echo aliases";
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
. `which env_parallel.pdksh`;
myfunc() { echo functions $*; };
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
. `which env_parallel.pdksh`;
myvar=variables;
env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo "\$myvar" ::: work;
env_parallel --env myvar echo "\$myvar" ::: work;
env_parallel --env myvar -S server echo "\$myvar" ::: work
. `which env_parallel.pdksh`;
myarray=(arrays work, too);
env_parallel -k echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k -S server echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 0 1 2
_EOF
)
ssh pdksh@lo "$myscript"
}
par_tcsh_man() {
echo '### tcsh'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
alias myecho 'echo aliases'
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
echo Functions not supported
set myvar=variables
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
set myarray=(arrays work, too)
env_parallel -k echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k -S server echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k --env myarray echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k --env myarray -S server echo \$'{myarray[{}]}' ::: 1 2 3
_EOF
)
ssh -tt tcsh@lo "$myscript"
}
par_csh_man() {
echo '### csh'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
# source `which env_parallel.csh`;
alias myecho 'echo aliases'
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
# Functions not supported
set myvar=variables
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
set myarray=(arrays work, too)
env_parallel -k echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k -S server echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k --env myarray echo \$'{myarray[{}]}' ::: 1 2 3
env_parallel -k --env myarray -S server echo \$'{myarray[{}]}' ::: 1 2 3
_EOF
)
ssh csh@lo "$myscript"
}
par_fish_man() {
echo '### fish'
myscript=$(cat <<'_EOF'
echo "### From man env_parallel"
alias myecho 'echo aliases'
env_parallel myecho ::: work
env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
function myfunc
echo functions $argv
end
env_parallel myfunc ::: work
env_parallel -S server myfunc ::: work
env_parallel --env myfunc myfunc ::: work
env_parallel --env myfunc -S server myfunc ::: work
set myvar variables
env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: work
env_parallel --env myvar echo '$myvar' ::: work
env_parallel --env myvar -S server echo '$myvar' ::: work
set myarray arrays work, too
env_parallel -k echo '$myarray[{}]' ::: 1 2 3
env_parallel -k -S server echo '$myarray[{}]' ::: 1 2 3
env_parallel -k --env myarray echo '$myarray[{}]' ::: 1 2 3
env_parallel -k --env myarray -S server echo '$myarray[{}]' ::: 1 2 3
_EOF
)
ssh fish@lo "$myscript"
}
par_bash_underscore() {
echo '### bash'
myscript=$(cat <<'_EOF'
echo "### Testing of --env _"
env_parallel --record-env;
alias myecho="echo \$myvar aliases in";
myfunc() { myecho ${myarray[@]} functions $*; };
myvar="variables in";
myarray=(and arrays in);
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho -S server myfunc ::: work;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myvar >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myarray >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myecho >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2;
echo myfunc >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2;
_EOF
)
ssh bash@lo "$myscript"
}
par_zsh_underscore() {
echo '### zsh'
myscript=$(cat <<'_EOF'
echo "### Testing of --env _"
. `which env_parallel.zsh`;
env_parallel --record-env;
alias myecho="echo \$myvar aliases in";
eval `cat <<"_EOS";
myfunc() { myecho ${myarray[@]} functions $*; };
myvar="variables in";
myarray=(and arrays in);
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho -S server myfunc ::: work;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myvar >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myarray >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myecho >> ~/.parallel/ignored_vars;
: Not using the function, because aliases are expanded in functions;
env_parallel --env _ myecho ::: work;
echo OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myecho >&2;
env_parallel --env _ -S server myecho ::: work;
echo OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myecho >&2;
echo myfunc >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myfunc >&2;
env_parallel --env _ -S server myfunc ::: work;
echo OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myfunc >&2;
_EOS`
_EOF
)
ssh zsh@lo "$myscript"
}
par_ksh_underscore() {
echo '### ksh'
myscript=$(cat <<'_EOF'
echo "### Testing of --env _"
. `which env_parallel.ksh`;
env_parallel --record-env;
alias myecho="echo \$myvar aliases in";
myfunc() { myecho ${myarray[@]} functions $*; };
myvar="variables in";
myarray=(and arrays in);
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho -S server myfunc ::: work;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myvar >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myarray >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myecho >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if no myecho ^^^^^^^^^^^^^^^^^" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if no myecho ^^^^^^^^^^^^^^^^^" >&2;
echo myfunc >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if no myfunc ^^^^^^^^^^^^^^^^^" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if no myfunc ^^^^^^^^^^^^^^^^^" >&2;
_EOF
)
ssh ksh@lo "$myscript"
}
par_pdksh_underscore() {
echo '### pdksh'
myscript=$(cat <<'_EOF'
echo "### Testing of --env _"
. `which env_parallel.pdksh`;
env_parallel --record-env;
alias myecho="echo \$myvar aliases in";
myfunc() { myecho ${myarray[@]} functions $*; };
myvar="variables in";
myarray=(and arrays in);
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho -S server myfunc ::: work;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myvar >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myarray >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myecho >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if no myecho ^^^^^^^^^^^^^^^^^" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if no myecho ^^^^^^^^^^^^^^^^^" >&2;
echo myfunc >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if no myfunc ^^^^^^^^^^^^^^^^^" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if no myfunc ^^^^^^^^^^^^^^^^^" >&2;
_EOF
)
ssh pdksh@lo "$myscript"
}
par_tcsh_underscore() {
echo '### tcsh'
myscript=$(cat <<'_EOF'
echo "### Testing of --env _"
# . `which env_parallel.tcsh`;
env_parallel --record-env;
alias myecho "echo "\$"myvar "\$'myarray'" aliases";
set myvar="variables";
set myarray=(and arrays in);
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myvar,myarray,myecho myecho ::: work;
env_parallel --env myvar,myarray,myecho -S server myecho ::: work;
env_parallel --env _ myecho ::: work;
env_parallel --env _ -S server myecho ::: work;
echo myvar >> ~/.parallel/ignored_vars;
env_parallel --env _ myecho ::: work;
env_parallel --env _ -S server myecho ::: work;
alias myecho "echo "\$'myarray'" aliases";
echo myarray >> ~/.parallel/ignored_vars;
env_parallel --env _ myecho ::: work;
env_parallel --env _ -S server myecho ::: work;
echo myecho >> ~/.parallel/ignored_vars;
env_parallel --env _ myecho ::: work;
echo "OK ^^^^^^^^^^^^^^^^^ if no myecho" >/dev/stderr;
env_parallel --env _ -S server myecho ::: work;
echo "OK ^^^^^^^^^^^^^^^^^ if no myecho" >/dev/stderr;
_EOF
)
ssh -tt tcsh@lo "$myscript"
}
par_csh_underscore() {
echo '### csh'
myscript=$(cat <<'_EOF'
echo "### Testing of --env _"
# . `which env_parallel.csh`;
env_parallel --record-env;
alias myecho "echo "\$"myvar "\$'myarray'" aliases";
set myvar="variables";
set myarray=(and arrays in);
env_parallel myecho ::: work;
env_parallel -S server myecho ::: work;
env_parallel --env myvar,myarray,myecho myecho ::: work;
env_parallel --env myvar,myarray,myecho -S server myecho ::: work;
env_parallel --env _ myecho ::: work;
env_parallel --env _ -S server myecho ::: work;
echo myvar >> ~/.parallel/ignored_vars;
env_parallel --env _ myecho ::: work;
env_parallel --env _ -S server myecho ::: work;
alias myecho "echo "\$'myarray'" aliases";
echo myarray >> ~/.parallel/ignored_vars;
env_parallel --env _ myecho ::: work;
env_parallel --env _ -S server myecho ::: work;
echo myecho >> ~/.parallel/ignored_vars;
env_parallel --env _ myecho ::: work;
echo "OK ^^^^^^^^^^^^^^^^^ if no myecho" >/dev/stderr;
env_parallel --env _ -S server myecho ::: work;
echo "OK ^^^^^^^^^^^^^^^^^ if no myecho" >/dev/stderr;
_EOF
)
ssh -tt csh@lo "$myscript"
}
par_fish_underscore() {
echo '### fish'
myscript=$(cat <<'_EOF'
echo "### Testing of --env _"
# . `which env_parallel.fish`;
env_parallel --record-env;
alias myecho="echo \$myvar aliases";
function myfunc
myecho $myarray functions $argv
end
set myvar "variables in";
set myarray and arrays in;
env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho myfunc ::: work;
env_parallel --env myfunc,myvar,myarray,myecho -S server myfunc ::: work;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myvar >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myarray >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
env_parallel --env _ -S server myfunc ::: work;
echo myecho >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if ^^^^^^^^^^^^^^^^^ no myecho" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if ^^^^^^^^^^^^^^^^^ no myecho" >&2;
echo myfunc >> ~/.parallel/ignored_vars;
env_parallel --env _ myfunc ::: work;
echo "OK if ^^^^^^^^^^^^^^^^^ no myfunc" >&2;
env_parallel --env _ -S server myfunc ::: work;
echo "OK if ^^^^^^^^^^^^^^^^^ no myfunc" >&2;
_EOF
)
ssh fish@lo "$myscript"
}
# Test env_parallel:
# + for each shell
# + remote, locally
# + variables, variables with funky content, arrays, assoc array, functions, aliases
par_bash_funky() {
myscript=$(cat <<'_EOF'
myvar="myvar works"
funky=$(perl -e "print pack \"c*\", 1..255")
myarray=("" array_val2 3 "" 5 " space 6 ")
declare -A assocarr
assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
func_echo() {
echo $*;
echo "$myvar"
echo "${myarray[5]}"
echo ${assocarr[a]}
echo Funky-"$funky"-funky
}
. `which env_parallel.bash`
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S lo alias_echo ::: alias_works_over_ssh
env_parallel -S lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh bash@lo "$myscript"
}
par_zsh_funky() {
myscript=$(cat <<'_EOF'
myvar="myvar works"
funky=$(perl -e "print pack \"c*\", 1..255")
myarray=("" array_val2 3 "" 5 " space 6 ")
declare -A assocarr
assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
func_echo() {
echo $*;
echo "$myvar"
echo "$myarray[6]"
echo ${assocarr[a]}
echo Funky-"$funky"-funky
}
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S zsh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S zsh@lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh zsh@lo "$myscript"
}
par_ksh_funky() {
myscript=$(cat <<'_EOF'
. `which env_parallel.ksh`;
myvar="myvar works"
funky=$(perl -e "print pack \"c*\", 1..255")
myarray=("" array_val2 3 "" 5 " space 6 ")
typeset -A assocarr
assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
func_echo() {
echo $*;
echo "$myvar"
echo "${myarray[5]}"
echo ${assocarr[a]}
echo Funky-"$funky"-funky
}
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S ksh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S ksh@lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh ksh@lo "$myscript"
}
par_pdksh_funky() {
myscript=$(cat <<'_EOF'
. `which env_parallel.pdksh`;
myvar="myvar works"
funky=$(perl -e "print pack \"c*\", 1..255")
myarray=("" array_val2 3 "" 5 " space 6 ")
assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
func_echo() {
echo $*;
echo "$myvar"
echo "${myarray[5]}"
echo ${assocarr[a]}
echo Funky-"$funky"-funky
}
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S lo alias_echo ::: alias_works_over_ssh
env_parallel -S lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh pdksh@lo "$myscript"
}
par_fish_funky() {
myscript=$(cat <<'_EOF'
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")
set myarray "" array_val2 3 "" 5 " space 6 "
# Assoc arrays do not exist
#typeset -A assocarr
#assocarr[a]=assoc_val_a
#assocarr[b]=assoc_val_b
alias alias_echo="echo 3 arg";
function func_echo
echo $argv;
echo "$myvar"
echo "$myenvvar"
echo "$myarray[6]"
# Assoc arrays do not exist in fish
# echo ${assocarr[a]}
echo
echo
echo
echo Funky-"$funky"-funky
echo Funkyenv-"$funkyenv"-funkyenv
echo
echo
echo
end
env_parallel alias_echo ::: alias_works
env_parallel func_echo ::: function_works
env_parallel -S fish@lo alias_echo ::: alias_works_over_ssh
env_parallel -S fish@lo func_echo ::: function_works_over_ssh
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh fish@lo "$myscript"
}
par_csh_funky() {
myscript=$(cat <<'_EOF'
set myvar = "myvar works"
set funky = "`perl -e 'print pack q(c*), 2..255'`"
set myarray = ('' 'array_val2' '3' '' '5' ' space 6 ')
#declare -A assocarr
#assocarr[a]=assoc_val_a
#assocarr[b]=assoc_val_b
alias alias_echo echo 3 arg;
alias alias_echo_var 'echo $argv; echo "$myvar"; echo "${myarray[4]} special chars problem"; echo Funky-"$funky"-funky'
#function func_echo
# echo $argv;
# echo $myvar;
# echo ${myarray[2]}
# #echo ${assocarr[a]}
# echo Funky-"$funky"-funky
#end
env_parallel alias_echo ::: alias_works
env_parallel alias_echo_var ::: alias_var_works
env_parallel func_echo ::: function_does_not_work
env_parallel -S csh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S csh@lo alias_echo_var ::: alias_var_works_over_ssh
env_parallel -S csh@lo func_echo ::: function_does_not_work_over_ssh
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh csh@lo "$myscript"
}
par_tcsh_funky() {
myscript=$(cat <<'_EOF'
set myvar = "myvar works"
set funky = "`perl -e 'print pack q(c*), 2..255'`"
set myarray = ('' 'array_val2' '3' '' '5' ' space 6 ')
# declare -A assocarr
# assocarr[a]=assoc_val_a
# assocarr[b]=assoc_val_b
alias alias_echo echo 3 arg;
alias alias_echo_var 'echo $argv; echo "$myvar"; echo "${myarray[4]} special chars problem"; echo Funky-"$funky"-funky'
# function func_echo
# echo $argv;
# echo $myvar;
# echo ${myarray[2]}
# #echo ${assocarr[a]}
# echo Funky-"$funky"-funky
# end
env_parallel alias_echo ::: alias_works
env_parallel alias_echo_var ::: alias_var_works
env_parallel func_echo ::: function_does_not_work
env_parallel -S tcsh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S tcsh@lo alias_echo_var ::: alias_var_works_over_ssh
env_parallel -S tcsh@lo func_echo ::: function_does_not_work_over_ssh
echo
echo "$funky" | parallel --shellquote
_EOF
)
ssh tcsh@lo "$myscript"
}
export -f $(compgen -A function | grep par_)
# Tested with -j1..8
# -j6 was fastest
compgen -A function | grep par_ | sort | parallel -j6 --tag -k '{} 2>&1'

View file

@ -1,34 +1,17 @@
echo '### Test of --retries on unreachable host'
### Test of --retries on unreachable host
seq 2 | stdout parallel -k --retries 2 -v -S 4.3.2.1,: echo
parallel: Warning: Could not figure out number of cpus on 4.3.2.1 (). Using 1.
echo 1
1
echo 2
2
echo '**'
**
echo "### Test Force outside the file handle limit, 2009-02-17 Gave fork error"
### Test Force outside the file handle limit, 2009-02-17 Gave fork error
(echo echo Start; seq 1 20000 | perl -pe 's/^/true /'; echo echo end) | stdout parallel -uj 0 | egrep -v 'processes took|adjusting'
parallel: Warning: Only enough file handles to run 252 jobs in parallel.
parallel: Warning: Running 'parallel -j0 -N 252 --pipe parallel -j0' or
parallel: Warning: raising ulimit -n or /etc/security/limits.conf may help.
Start
end
echo '**'
**
echo '### Test if we can deal with output > 4 GB'
### Test if we can deal with output > 4 GB
echo | nice parallel --tmpdir $TMP5G -q perl -e '$a="x"x1000000;for(0..4300){print $a}' | nice md5sum
46a318993dfc8e2afd71ff2bc6f605f1 -
echo '**'
**
echo 'bug #41613: --compress --line-buffer no --tagstring'; diff <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| nice parallel -N10 -L1 --pipe -j6 --block 20M --compress pv -qL 1000000 | perl -pe 's/(....).*/$1/') <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| nice parallel -N10 -L1 --pipe -j6 --block 20M --compress --line-buffer pv -qL 1000000 | perl -pe 's/(....).*/$1/') >/dev/null || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
bug #41613: --compress --line-buffer no --tagstring
Good: --line-buffer matters
echo 'bug #41613: --compress --line-buffer with --tagstring'; diff <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| nice parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} pv -qL 1000000 | perl -pe 's/(....).*/$1/') <(nice perl -e 'for("x011".."x110"){print "$_\t", ("\n", map { rand } (1..100000)) }'| nice parallel -N10 -L1 --pipe -j6 --block 20M --compress --tagstring {#} --line-buffer pv -qL 1000000 | perl -pe 's/(....).*/$1/') >/dev/null || (echo 'Good: --line-buffer matters'; false) && echo 'Bad: --line-buffer not working'
bug #41613: --compress --line-buffer with --tagstring
Good: --line-buffer matters
echo '**'
**
par_outside_file_handle_limit 2>&1
par_outside_file_handle_limit ### Test Force outside the file handle limit, 2009-02-17 Gave fork error
par_outside_file_handle_limit parallel: Warning: Only enough file handles to run 252 jobs in parallel.
par_outside_file_handle_limit parallel: Warning: Running 'parallel -j0 -N 252 --pipe parallel -j0' or
par_outside_file_handle_limit parallel: Warning: raising ulimit -n or /etc/security/limits.conf may help.
par_outside_file_handle_limit Start
par_outside_file_handle_limit end
par_over_4GB 2>&1
par_over_4GB ### Test if we can deal with output > 4 GB
par_over_4GB 46a318993dfc8e2afd71ff2bc6f605f1 -
par_retries_unreachable 2>&1
par_retries_unreachable ### Test of --retries on unreachable host
par_retries_unreachable parallel: Warning: Could not figure out number of cpus on 4.3.2.1 (). Using 1.
par_retries_unreachable echo 1
par_retries_unreachable 1
par_retries_unreachable echo 2
par_retries_unreachable 2

View file

@ -1,34 +1,27 @@
echo '### Test race condition on 8 CPU (my laptop)'; seq 1 5000000 > /tmp/parallel_test; seq 1 10 | parallel -k "cat /tmp/parallel_test | parallel --pipe --recend '' -k gzip >/dev/null; echo {}"; rm /tmp/parallel_test
### Test race condition on 8 CPU (my laptop)
1
2
3
4
5
6
7
8
9
10
echo '**'
**
echo "### Test --tmpdir running full. bug #40733 was caused by this"
### Test --tmpdir running full. bug #40733 was caused by this
stdout parallel -j1 --tmpdir $SHM cat /dev/zero ::: dummy
parallel: Error: Output is incomplete. Cannot append to buffer file in /tmp/shm/parallel. Is the disk full?
parallel: Error: Change $TMPDIR with --tmpdir or use --compress.
echo '**'
**
echo "### bug #48290: round-robin does not distribute data based on business"
### bug #48290: round-robin does not distribute data based on business
echo "Jobslot 1 is 8 times slower than jobslot 8 and should get much less data"
Jobslot 1 is 8 times slower than jobslot 8 and should get much less data
seq 10000000 | parallel --tagstring {%} --linebuffer --compress -j8 --roundrobin --pipe --block 300k 'pv -qL {%}00000'| perl -ne '/^\d+/ and $s{$&}++; END { print map { "$_\n" } sort { $s{$a} <=> $s{$b} } keys %s}'
1
2
3
5
4
7
6
8
par_bug_48290 ### bug #48290: round-robin does not distribute data based on business
par_bug_48290 Jobslot 1 is 256 times slower than jobslot 4 and should get much less data
par_bug_48290 4
par_bug_48290 3
par_bug_48290 2
par_bug_48290 1
par_linebuffer_matters_compress ### (--linebuffer) --compress --tag should give different output
par_linebuffer_matters_compress OK: --linebuffer makes a difference
par_linebuffer_matters_compress_tag ### (--linebuffer) --compress --tag should give different output
par_linebuffer_matters_compress_tag OK: --linebuffer makes a difference
par_memory_leak ### Test for memory leaks
par_memory_leak Of 10 runs of 1 job at least one should be bigger than a 3000 job run
par_memory_leak Good: No memleak detected.
par_race_condition1 ### Test race condition on 8 CPU (my laptop)
par_race_condition1 1
par_race_condition1 2
par_race_condition1 3
par_race_condition1 4
par_race_condition1 5
par_race_condition1 6
par_race_condition1 7
par_race_condition1 8
par_race_condition1 9
par_race_condition1 10
par_tmp_full ### Test --tmpdir running full. bug #40733 was caused by this
par_tmp_full parallel: Error: Output is incomplete. Cannot append to buffer file in /tmp/shm/parallel. Is the disk full?
par_tmp_full parallel: Error: Change $TMPDIR with --tmpdir or use --compress.

File diff suppressed because it is too large Load diff

View file

@ -1,65 +1,3 @@
echo '### --env from man env_parallel'
### --env from man env_parallel
echo '### bash'
### bash
ssh bash@lo ' alias myecho="echo aliases"; env_parallel myecho ::: work; env_parallel -S server myecho ::: work; env_parallel --env myecho myecho ::: work; env_parallel --env myecho -S server myecho ::: work '
aliases work
aliases work
aliases work
aliases work
ssh bash@lo ' myfunc() { echo functions $*; }; env_parallel myfunc ::: work; env_parallel -S server myfunc ::: work; env_parallel --env myfunc myfunc ::: work; env_parallel --env myfunc -S server myfunc ::: work '
functions work
functions work
functions work
functions work
ssh bash@lo ' myvar=variables; env_parallel echo "\$myvar" ::: work; env_parallel -S server echo "\$myvar" ::: work; env_parallel --env myvar echo "\$myvar" ::: work; env_parallel --env myvar -S server echo "\$myvar" ::: work '
variables work
variables work
variables work
variables work
ssh bash@lo ' myarray=(arrays work, too); env_parallel -k echo "\${myarray[{}]}" ::: 0 1 2; env_parallel -k -S server echo "\${myarray[{}]}" ::: 0 1 2; env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 0 1 2; env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 0 1 2 '
arrays
work,
too
arrays
work,
too
arrays
work,
too
arrays
work,
too
echo '### zsh'
### zsh
ssh zsh@lo ' alias myecho="echo aliases"; env_parallel myecho ::: work; env_parallel -S server myecho ::: work; env_parallel --env myecho myecho ::: work; env_parallel --env myecho -S server myecho ::: work '
aliases work
aliases work
aliases work
aliases work
ssh zsh@lo ' myfunc() { echo functions $*; }; env_parallel myfunc ::: work; env_parallel -S server myfunc ::: work; env_parallel --env myfunc myfunc ::: work; env_parallel --env myfunc -S server myfunc ::: work '
functions work
functions work
functions work
functions work
ssh zsh@lo ' myvar=variables; env_parallel echo "\$myvar" ::: work; env_parallel -S server echo "\$myvar" ::: work; env_parallel --env myvar echo "\$myvar" ::: work; env_parallel --env myvar -S server echo "\$myvar" ::: work '
variables work
variables work
variables work
variables work
ssh zsh@lo ' myarray=(arrays work, too); env_parallel -k echo "\${myarray[{}]}" ::: 1 2 3; env_parallel -k -S server echo "\${myarray[{}]}" ::: 1 2 3; env_parallel -k --env myarray echo "\${myarray[{}]}" ::: 1 2 3; env_parallel -k --env myarray -S server echo "\${myarray[{}]}" ::: 1 2 3 '
arrays
work,
too
arrays
work,
too
arrays
work,
too
arrays
work,
too
echo '### --env _'
### --env _
fUbAr="OK FUBAR" parallel -S parallel@lo --env _ echo '$fUbAr $DEBEMAIL' ::: test
@ -77,14 +15,6 @@ bug #40137: SHELL not bash: Warning when exporting funcs
no_warning
. <(printf 'myfunc() {\necho $1\n}'); export -f myfunc; SHELL=/bin/sh parallel --env myfunc -S lo myfunc ::: warning
warning
echo 'env_parallel from man page - transfer non-exported var'
env_parallel from man page - transfer non-exported var
source $(which env_parallel.bash); var=nonexported env_parallel -S parallel@lo echo '$var' ::: variable
nonexported variable
echo 'compared to parallel - no transfer non-exported var'
compared to parallel - no transfer non-exported var
var=nonexported parallel -S parallel@lo echo '$var' ::: variable
variable
echo '### zsh'
### zsh
echo 'env in zsh'
@ -194,135 +124,3 @@ echo '### bug #45575: -m and multiple hosts repeats first args'
1
2
3
Test env_parallel:
+ for each shell
+ remote, locally
+ variables, variables with funky content, arrays, assoc array, functions, aliases
### Bash environment
3 arg alias_works
function_works
myvar works
space 6
assoc_val_a
Funky-

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<EFBFBD><EFBFBD><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>-funky
3 arg alias_works_over_ssh
function_works_over_ssh
myvar works
space 6
assoc_val_a
Funky-

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<EFBFBD><EFBFBD><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>-funky
\\\\\\\\
\ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
### Zsh environment
* Documentation: http://www.linuxmint.com
3 arg alias_works
function_works
myvar works
space 6
assoc_val_a
Funky-

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
3 arg alias_works_over_ssh
function_works_over_ssh
myvar works
space 6
assoc_val_a
Funky-

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
\\\\\\\\
\ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
### Ksh environment
* Documentation: http://www.linuxmint.com
3 arg alias_works
function_works
myvar works
space 6
assoc_val_a
Funky-
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
3 arg alias_works_over_ssh
function_works_over_ssh
myvar works
space 6
assoc_val_a
Funky-
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
\\\\\\\\
\ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
### Fish environment
* Documentation: http://www.linuxmint.com
env_parallel: Warning: ASCII value 1 in variables is not supported
env_parallel: Warning: ASCII value 1 in variables is not supported
3 arg alias_works
env_parallel: Warning: ASCII value 1 in variables is not supported
env_parallel: Warning: ASCII value 1 in variables is not supported
function_works
myvar works
myenvvar works
space 6
Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
env_parallel: Warning: ASCII value 1 in variables is not supported
env_parallel: Warning: ASCII value 1 in variables is not supported
3 arg alias_works_over_ssh
env_parallel: Warning: ASCII value 1 in variables is not supported
env_parallel: Warning: ASCII value 1 in variables is not supported
function_works_over_ssh
myvar works
myenvvar works
space 6
Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
\\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
### csh environment
* Documentation: http://www.linuxmint.com
Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell.
3 arg alias_works
myvar works
space special chars problem
Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky alias_var_works
func_echo: Command not found.
3 arg alias_works_over_ssh
myvar works
space special chars problem
Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky alias_var_works_over_ssh
func_echo: Command not found.
\\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>

View file

@ -0,0 +1,468 @@
### test --env _
Both test that variables are copied,
but also that they are NOT copied, if ignored
par_bash_funky 3 arg alias_works
par_bash_funky function_works
par_bash_funky myvar works
par_bash_funky space 6
par_bash_funky assoc_val_a
par_bash_funky Funky-
par_bash_funky
par_bash_funky 
par_bash_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
par_bash_funky €亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_bash_funky 3 arg alias_works_over_ssh
par_bash_funky function_works_over_ssh
par_bash_funky myvar works
par_bash_funky space 6
par_bash_funky assoc_val_a
par_bash_funky Funky-
par_bash_funky
par_bash_funky 
par_bash_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
par_bash_funky €亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_bash_funky
par_bash_funky \\\\\\\\
par_bash_funky \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
par_bash_man ### bash
par_bash_man ### From man env_parallel
par_bash_man aliases work
par_bash_man aliases work
par_bash_man aliases work
par_bash_man aliases work
par_bash_man functions work
par_bash_man functions work
par_bash_man functions work
par_bash_man functions work
par_bash_man variables work
par_bash_man variables work
par_bash_man variables work
par_bash_man variables work
par_bash_man arrays
par_bash_man work,
par_bash_man too
par_bash_man arrays
par_bash_man work,
par_bash_man too
par_bash_man arrays
par_bash_man work,
par_bash_man too
par_bash_man arrays
par_bash_man work,
par_bash_man too
par_bash_underscore ### bash
par_bash_underscore ### Testing of --env _
par_bash_underscore variables in aliases in and arrays in functions work
par_bash_underscore variables in aliases in and arrays in functions work
par_bash_underscore variables in aliases in and arrays in functions work
par_bash_underscore variables in aliases in and arrays in functions work
par_bash_underscore variables in aliases in and arrays in functions work
par_bash_underscore variables in aliases in and arrays in functions work
par_bash_underscore aliases in and arrays in functions work
par_bash_underscore aliases in and arrays in functions work
par_bash_underscore aliases in functions work
par_bash_underscore aliases in functions work
par_bash_underscore /bin/bash: line 139: myecho: command not found
par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^
par_bash_underscore /bin/bash: line 139: myecho: command not found
par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^
par_bash_underscore /bin/bash: line 136: myfunc: command not found
par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^
par_bash_underscore /bin/bash: line 136: myfunc: command not found
par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^
par_csh_funky 3 arg alias_works
par_csh_funky myvar works
par_csh_funky space special chars problem
par_csh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky alias_var_works
par_csh_funky func_echo: Command not found.
par_csh_funky 3 arg alias_works_over_ssh
par_csh_funky myvar works
par_csh_funky space special chars problem
par_csh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky alias_var_works_over_ssh
par_csh_funky func_echo: Command not found.
par_csh_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
par_csh_man ### csh
par_csh_man ### From man env_parallel
par_csh_man aliases work
par_csh_man aliases work
par_csh_man aliases work
par_csh_man aliases work
par_csh_man variables work
par_csh_man variables work
par_csh_man variables work
par_csh_man variables work
par_csh_man arrays
par_csh_man work,
par_csh_man too
par_csh_man arrays
par_csh_man work,
par_csh_man too
par_csh_man arrays
par_csh_man work,
par_csh_man too
par_csh_man arrays
par_csh_man work,
par_csh_man too
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_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky 3 arg alias_works
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky function_works
par_fish_funky myvar works
par_fish_funky myenvvar works
par_fish_funky space 6
par_fish_funky
par_fish_funky
par_fish_funky
par_fish_funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_fish_funky Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_fish_funky
par_fish_funky
par_fish_funky
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky 3 arg alias_works_over_ssh
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky env_parallel: Warning: ASCII value 1 in variables is not supported
par_fish_funky function_works_over_ssh
par_fish_funky myvar works
par_fish_funky myenvvar works
par_fish_funky space 6
par_fish_funky
par_fish_funky
par_fish_funky
par_fish_funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_fish_funky Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
par_fish_funky
par_fish_funky
par_fish_funky
par_fish_funky
par_fish_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
par_fish_man ### fish
par_fish_man ### From man env_parallel
par_fish_man aliases work
par_fish_man aliases work
par_fish_man aliases work
par_fish_man aliases work
par_fish_man functions work
par_fish_man functions work
par_fish_man functions work
par_fish_man functions work
par_fish_man variables work
par_fish_man variables work
par_fish_man variables work
par_fish_man variables work
par_fish_man arrays
par_fish_man work,
par_fish_man too
par_fish_man arrays
par_fish_man work,
par_fish_man too
par_fish_man arrays
par_fish_man work,
par_fish_man too
par_fish_man arrays
par_fish_man work,
par_fish_man too
par_fish_underscore ### fish
par_fish_underscore ### Testing of --env _
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore variables in aliases and arrays in functions work
par_fish_underscore aliases and arrays in functions work
par_fish_underscore aliases and arrays in functions work
par_fish_underscore aliases functions work
par_fish_underscore aliases functions work
par_fish_underscore fish: Unknown command 鈥渕yecho鈥<6F>
par_fish_underscore Standard input: myecho $myarray functions $argv
par_fish_underscore ^
par_fish_underscore in function 鈥渕yfunc鈥<63>,
par_fish_underscore called on standard input,
par_fish_underscore with parameter list 鈥渨ork鈥<6B>
par_fish_underscore
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho
par_fish_underscore fish: Unknown command 鈥渕yecho鈥<6F>
par_fish_underscore Standard input: myecho $myarray functions $argv
par_fish_underscore ^
par_fish_underscore in function 鈥渕yfunc鈥<63>,
par_fish_underscore called on standard input,
par_fish_underscore with parameter list 鈥渨ork鈥<6B>
par_fish_underscore
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho
par_fish_underscore fish: Unknown command 鈥渕yfunc鈥<63>
par_fish_underscore Standard input: myfunc work
par_fish_underscore ^
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_fish_underscore fish: Unknown command 鈥渕yfunc鈥<63>
par_fish_underscore Standard input: myfunc work
par_fish_underscore ^
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_ksh_funky 3 arg alias_works
par_ksh_funky function_works
par_ksh_funky myvar works
par_ksh_funky space 6
par_ksh_funky assoc_val_a
par_ksh_funky Funky-
par_ksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_ksh_funky 3 arg alias_works_over_ssh
par_ksh_funky function_works_over_ssh
par_ksh_funky myvar works
par_ksh_funky space 6
par_ksh_funky assoc_val_a
par_ksh_funky Funky-
par_ksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_ksh_funky
par_ksh_funky \\\\\\\\
par_ksh_funky \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
par_ksh_man ### ksh
par_ksh_man ### From man env_parallel
par_ksh_man aliases work
par_ksh_man aliases work
par_ksh_man aliases work
par_ksh_man aliases work
par_ksh_man functions work
par_ksh_man functions work
par_ksh_man functions work
par_ksh_man functions work
par_ksh_man variables work
par_ksh_man variables work
par_ksh_man variables work
par_ksh_man variables work
par_ksh_man arrays
par_ksh_man work,
par_ksh_man too
par_ksh_man arrays
par_ksh_man work,
par_ksh_man too
par_ksh_man arrays
par_ksh_man work,
par_ksh_man too
par_ksh_man arrays
par_ksh_man work,
par_ksh_man too
par_ksh_underscore ### ksh
par_ksh_underscore ### Testing of --env _
par_ksh_underscore variables in aliases in and arrays in functions work
par_ksh_underscore variables in aliases in and arrays in functions work
par_ksh_underscore variables in aliases in and arrays in functions work
par_ksh_underscore variables in aliases in and arrays in functions work
par_ksh_underscore variables in aliases in and arrays in functions work
par_ksh_underscore variables in aliases in and arrays in functions work
par_ksh_underscore aliases in and arrays in functions work
par_ksh_underscore aliases in and arrays in functions work
par_ksh_underscore aliases in functions work
par_ksh_underscore aliases in functions work
par_ksh_underscore /usr/bin/ksh[193]: myecho: not found [No such file or directory]
par_ksh_underscore OK if no myecho ^^^^^^^^^^^^^^^^^
par_ksh_underscore /usr/bin/ksh[193]: myecho: not found [No such file or directory]
par_ksh_underscore OK if no myecho ^^^^^^^^^^^^^^^^^
par_ksh_underscore /usr/bin/ksh: line 193: myfunc: not found
par_ksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^
par_ksh_underscore /usr/bin/ksh: line 193: myfunc: not found
par_ksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^
par_pdksh_funky 3 arg alias_works
par_pdksh_funky function_works
par_pdksh_funky myvar works
par_pdksh_funky space 6
par_pdksh_funky assoc_val_b
par_pdksh_funky Funky-
par_pdksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_pdksh_funky 3 arg alias_works_over_ssh
par_pdksh_funky function_works_over_ssh
par_pdksh_funky myvar works
par_pdksh_funky space 6
par_pdksh_funky assoc_val_b
par_pdksh_funky Funky-
par_pdksh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_pdksh_funky
par_pdksh_funky \\\\\\\\
par_pdksh_funky \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
par_pdksh_man ### pdksh
par_pdksh_man ### From man env_parallel
par_pdksh_man aliases work
par_pdksh_man aliases work
par_pdksh_man aliases work
par_pdksh_man aliases work
par_pdksh_man functions work
par_pdksh_man functions work
par_pdksh_man functions work
par_pdksh_man functions work
par_pdksh_man variables work
par_pdksh_man variables work
par_pdksh_man variables work
par_pdksh_man variables work
par_pdksh_man arrays
par_pdksh_man work,
par_pdksh_man too
par_pdksh_man arrays
par_pdksh_man work,
par_pdksh_man too
par_pdksh_man arrays
par_pdksh_man work,
par_pdksh_man too
par_pdksh_man arrays
par_pdksh_man work,
par_pdksh_man too
par_pdksh_underscore ### pdksh
par_pdksh_underscore ### Testing of --env _
par_pdksh_underscore variables in aliases in and arrays in functions work
par_pdksh_underscore variables in aliases in and arrays in functions work
par_pdksh_underscore variables in aliases in and arrays in functions work
par_pdksh_underscore variables in aliases in and arrays in functions work
par_pdksh_underscore variables in aliases in and arrays in functions work
par_pdksh_underscore variables in aliases in and arrays in functions work
par_pdksh_underscore aliases in and arrays in functions work
par_pdksh_underscore aliases in and arrays in functions work
par_pdksh_underscore aliases in functions work
par_pdksh_underscore aliases in functions work
par_pdksh_underscore aliases in functions work
par_pdksh_underscore OK if no myecho ^^^^^^^^^^^^^^^^^
par_pdksh_underscore aliases in functions work
par_pdksh_underscore OK if no myecho ^^^^^^^^^^^^^^^^^
par_pdksh_underscore /bin/pdksh: myfunc: not found
par_pdksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^
par_pdksh_underscore /bin/pdksh: myfunc: not found
par_pdksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^
par_tcsh_funky 3 arg alias_works
par_tcsh_funky
par_tcsh_funky myvar works
par_tcsh_funky space special chars problem
par_tcsh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A>-funky alias_var_works
par_tcsh_funky func_echo: Command not found.
par_tcsh_funky 3 arg alias_works_over_ssh
par_tcsh_funky
par_tcsh_funky myvar works
par_tcsh_funky space special chars problem
par_tcsh_funky Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A>-funky alias_var_works_over_ssh
par_tcsh_funky func_echo: Command not found.
par_tcsh_funky
par_tcsh_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟<E9B3BF>
par_tcsh_man ### tcsh
par_tcsh_man ### From man env_parallel
par_tcsh_man aliases work
par_tcsh_man aliases work
par_tcsh_man aliases work
par_tcsh_man aliases work
par_tcsh_man Functions not supported
par_tcsh_man variables work
par_tcsh_man variables work
par_tcsh_man variables work
par_tcsh_man variables work
par_tcsh_man arrays
par_tcsh_man work,
par_tcsh_man too
par_tcsh_man arrays
par_tcsh_man work,
par_tcsh_man too
par_tcsh_man arrays
par_tcsh_man work,
par_tcsh_man too
par_tcsh_man arrays
par_tcsh_man work,
par_tcsh_man too
par_tcsh_man Connection to lo closed.
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_zsh_funky 3 arg alias_works
par_zsh_funky function_works
par_zsh_funky myvar works
par_zsh_funky space 6
par_zsh_funky assoc_val_a
par_zsh_funky Funky-
par_zsh_funky 
par_zsh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_zsh_funky 3 arg alias_works_over_ssh
par_zsh_funky function_works_over_ssh
par_zsh_funky myvar works
par_zsh_funky space 6
par_zsh_funky assoc_val_a
par_zsh_funky Funky-
par_zsh_funky 
par_zsh_funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
par_zsh_funky
par_zsh_funky \\\\\\\\
par_zsh_funky \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>
par_zsh_man ### zsh
par_zsh_man ### From man env_parallel
par_zsh_man aliases work
par_zsh_man aliases work
par_zsh_man aliases work
par_zsh_man aliases work
par_zsh_man functions work
par_zsh_man functions work
par_zsh_man functions work
par_zsh_man functions work
par_zsh_man variables work
par_zsh_man variables work
par_zsh_man variables work
par_zsh_man variables work
par_zsh_man arrays
par_zsh_man work,
par_zsh_man too
par_zsh_man arrays
par_zsh_man work,
par_zsh_man too
par_zsh_man arrays
par_zsh_man work,
par_zsh_man too
par_zsh_man arrays
par_zsh_man work,
par_zsh_man too
par_zsh_underscore ### zsh
par_zsh_underscore ### Testing of --env _
par_zsh_underscore variables in aliases in and arrays in functions work
par_zsh_underscore variables in aliases in and arrays in functions work
par_zsh_underscore variables in aliases in and arrays in functions work
par_zsh_underscore variables in aliases in and arrays in functions work
par_zsh_underscore variables in aliases in and arrays in functions work
par_zsh_underscore variables in aliases in and arrays in functions work
par_zsh_underscore aliases in and arrays in functions work
par_zsh_underscore aliases in and arrays in functions work
par_zsh_underscore aliases in functions work
par_zsh_underscore aliases in functions work
par_zsh_underscore (eval):1: command not found: myecho
par_zsh_underscore OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myecho
par_zsh_underscore (eval):1: command not found: myecho
par_zsh_underscore OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myecho
par_zsh_underscore (eval):1: command not found: myfunc
par_zsh_underscore OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myfunc
par_zsh_underscore (eval):1: command not found: myfunc
par_zsh_underscore OK if no .^^^^^^^^^^^^^^^^^^^^^^^^^ myfunc