env_parallel: --env _ supported in (t)csh and pdksh.

This commit is contained in:
Ole Tange 2016-07-14 09:35:39 +02:00
parent 3ba7a4646d
commit 68a48146ea
10 changed files with 653 additions and 128 deletions

View file

@ -33,7 +33,8 @@ env_parallel() {
# and convert a b c to (a|b|c) # and convert a b c to (a|b|c)
# If --env not set: Match everything (.*) # If --env not set: Match everything (.*)
local _grep_REGEXP="$( local _grep_REGEXP="$(
perl -e 'for(@ARGV){ perl -e '
for(@ARGV){
/^_$/ and $next_is_env = 0; /^_$/ and $next_is_env = 0;
$next_is_env and push @envvar, split/,/, $_; $next_is_env and push @envvar, split/,/, $_;
$next_is_env = /^--env$/; $next_is_env = /^--env$/;
@ -44,18 +45,27 @@ env_parallel() {
)" )"
# Deal with --env _ # Deal with --env _
local _ignore_UNDERSCORE="$( local _ignore_UNDERSCORE="$(
perl -e 'for(@ARGV){ perl -e '
for(@ARGV){
$next_is_env and push @envvar, split/,/, $_; $next_is_env and push @envvar, split/,/, $_;
$next_is_env=/^--env$/; $next_is_env=/^--env$/;
} }
$underscore = grep { /^_$/ } @envvar; if(grep { /^_$/ } @envvar) {
print $underscore ? "grep -vf $ENV{HOME}/.parallel/ignored_vars" : "cat"; 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 # Grep alias names
local _alias_NAMES="$(compgen -a | local _alias_NAMES="$(compgen -a |
egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE)" grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
local _list_alias_BODIES="alias $_alias_NAMES" local _list_alias_BODIES="alias $_alias_NAMES"
if [[ "$_alias_NAMES" = "" ]] ; then if [[ "$_alias_NAMES" = "" ]] ; then
# no aliases selected # no aliases selected
@ -65,7 +75,7 @@ env_parallel() {
# Grep function names # Grep function names
local _function_NAMES="$(compgen -A function | local _function_NAMES="$(compgen -A function |
egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE)" grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
local _list_function_BODIES="typeset -f $_function_NAMES" local _list_function_BODIES="typeset -f $_function_NAMES"
if [[ "$_function_NAMES" = "" ]] ; then if [[ "$_function_NAMES" = "" ]] ; then
# no functions selected # no functions selected
@ -75,7 +85,7 @@ env_parallel() {
# Grep variable names # Grep variable names
local _variable_NAMES="$(compgen -A variable | local _variable_NAMES="$(compgen -A variable |
egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ |
grep -vFf <(readonly) | grep -vFf <(readonly) |
egrep -v '^(BASHOPTS|BASHPID|EUID|GROUPS|FUNCNAME|DIRSTACK|_|PIPESTATUS|PPID|SHELLOPTS|UID|USERNAME|BASH_[A-Z_]+)$')" egrep -v '^(BASHOPTS|BASHPID|EUID|GROUPS|FUNCNAME|DIRSTACK|_|PIPESTATUS|PPID|SHELLOPTS|UID|USERNAME|BASH_[A-Z_]+)$')"
local _list_variable_VALUES="typeset -p $_variable_NAMES" local _list_variable_VALUES="typeset -p $_variable_NAMES"
@ -101,17 +111,3 @@ env_parallel() {
`which parallel` "$@"; `which parallel` "$@";
unset PARALLEL_ENV; 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,8 +29,48 @@ if ("`alias env_parallel`" == '') then
# Activate alias # Activate alias
alias env_parallel 'setenv PARALLEL "\!*"; source `which env_parallel.csh`' alias env_parallel 'setenv PARALLEL "\!*"; source `which env_parallel.csh`'
else 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 # 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 # Make a tmpfile for the variable definitions
set _tMpvARfILe=`tempfile` set _tMpvARfILe=`tempfile`
@ -38,19 +78,20 @@ else
# Make a tmpfile for the variable definitions + alias # Make a tmpfile for the variable definitions + alias
set _tMpaLLfILe=`tempfile` set _tMpaLLfILe=`tempfile`
foreach _vARnAmE ($_vARnAmES); foreach _vARnAmE ($_vARnAmES);
# if $?myvar && $#myvar <= 1 echo scalar_myvar=$var # if not defined: next
eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} <= 1) echo scalar_'$_vARnAmE'="$'$_vARnAmE'"' >> $_tMpvARfILe; eval if'(! $?'$_vARnAmE') continue'
# if $?myvar && $#myvar > 1 echo array_myvar=$var # if $#myvar <= 1 echo scalar_myvar=$var
eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} > 1) echo array_'$_vARnAmE'="$'$_vARnAmE'"' >> $_tMpvARfILe; 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 end
unset _vARnAmE _vARnAmES
# shell quote variables (--plain needed due to $PARALLEL abuse) # shell quote variables (--plain needed due to $PARALLEL abuse)
# Convert 'scalar_myvar=...' to 'set myvar=...' # Convert 'scalar_myvar=...' to 'set myvar=...'
# Convert 'array_myvar=...' to 'set array=(...)' # 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 cat $_tMpvARfILe | parallel --plain --shellquote | perl -pe 's/^scalar_(\S+).=/set $1=/ or s/^array_(\S+).=(.*)/set $1=($2)/ && s/\\ / /g;' > $_tMpaLLfILe
# Cleanup # Cleanup
rm $_tMpvARfILe; unset _tMpvARfILe _vARnAmE _vARnAmES rm $_tMpvARfILe; unset _tMpvARfILe
# ALIAS TO EXPORT ALIASES: # ALIAS TO EXPORT ALIASES:
@ -61,8 +102,6 @@ else
# Quoted: s/\\047/\\047\\042\\047\\042\\047/g\; # Quoted: s/\\047/\\047\\042\\047\\042\\047/g\;
# Remove () from second column # Remove () from second column
# s/^(\S+)(\s+)\((.*)\)/\1\2\3/
# \047 => '
# s/^(\S+)(\s+)\((.*)\)/\1\2\3/; # s/^(\S+)(\s+)\((.*)\)/\1\2\3/;
# Quoted: s/\^\(\\S+\)\(\\s+\)\\\(\(.\*\)\\\)/\\1\\2\\3/\; # Quoted: s/\^\(\\S+\)\(\\s+\)\\\(\(.\*\)\\\)/\\1\\2\\3/\;
@ -79,7 +118,10 @@ else
# Prepend with "\nalias " # Prepend with "\nalias "
# s/^/\001alias /; # s/^/\001alias /;
# Quoted: 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`"; setenv PARALLEL_ENV "`cat $_tMpaLLfILe; rm $_tMpaLLfILe`";
unset _tMpaLLfILe; unset _tMpaLLfILe;

View file

@ -44,10 +44,44 @@ function env_parallel
# env_parallel.fish # env_parallel.fish
setenv PARALLEL_ENV ( setenv PARALLEL_ENV (
begin; 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 # 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 # 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,$val)=split(/ /,$_,2);
$name=~/^(HOME|USER|COLUMNS|FISH_VERSION|LINES|PWD|SHLVL|_|history|status|version)$/ and next; $name=~/^(HOME|USER|COLUMNS|FISH_VERSION|LINES|PWD|SHLVL|_|history|status|version)$/ and next;
if($val=~/^'"'"'/) { next; } if($val=~/^'"'"'/) { next; }
@ -55,7 +89,7 @@ function env_parallel
') ')
# Generate commands to set scalar variables # Generate commands to set scalar variables
begin; 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 # Separate variables with the string: \000
eval "for i in \$$v; eval "for i in \$$v;
echo -n $v \$i; echo -n $v \$i;

View file

@ -25,8 +25,6 @@
# or write to the Free Software Foundation, Inc., 51 Franklin St, # or write to the Free Software Foundation, Inc., 51 Franklin St,
# Fifth Floor, Boston, MA 02110-1301 USA # Fifth Floor, Boston, MA 02110-1301 USA
# Supports env of 127426 bytes
env_parallel() { env_parallel() {
# env_parallel.ksh # env_parallel.ksh
@ -35,7 +33,8 @@ env_parallel() {
# and convert a b c to (a|b|c) # and convert a b c to (a|b|c)
# If --env not set: Match everything (.*) # If --env not set: Match everything (.*)
_grep_REGEXP="$( _grep_REGEXP="$(
perl -e 'for(@ARGV){ perl -e '
for(@ARGV){
/^_$/ and $next_is_env = 0; /^_$/ and $next_is_env = 0;
$next_is_env and push @envvar, split/,/, $_; $next_is_env and push @envvar, split/,/, $_;
$next_is_env = /^--env$/; $next_is_env = /^--env$/;
@ -46,18 +45,27 @@ env_parallel() {
)" )"
# Deal with --env _ # Deal with --env _
_ignore_UNDERSCORE="$( _ignore_UNDERSCORE="$(
perl -e 'for(@ARGV){ perl -e '
for(@ARGV){
$next_is_env and push @envvar, split/,/, $_; $next_is_env and push @envvar, split/,/, $_;
$next_is_env=/^--env$/; $next_is_env=/^--env$/;
} }
$underscore = grep { /^_$/ } @envvar; if(grep { /^_$/ } @envvar) {
print $underscore ? "grep -vf $ENV{HOME}/.parallel/ignored_vars" : "cat"; 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 # Grep alias names
_alias_NAMES="$(alias | perl -pe 's/=.*//' | _alias_NAMES="$(alias | perl -pe 's/=.*//' |
egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE)" grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
_list_alias_BODIES="alias $_alias_NAMES | perl -pe 's/^/alias /'" _list_alias_BODIES="alias $_alias_NAMES | perl -pe 's/^/alias /'"
if [[ "$_alias_NAMES" = "" ]] ; then if [[ "$_alias_NAMES" = "" ]] ; then
# no aliases selected # no aliases selected
@ -67,7 +75,7 @@ env_parallel() {
# Grep function names # Grep function names
_function_NAMES="$(typeset +p -f | perl -pe 's/\(\).*//' | _function_NAMES="$(typeset +p -f | perl -pe 's/\(\).*//' |
egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE)" grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
_list_function_BODIES="typeset -f $_function_NAMES" _list_function_BODIES="typeset -f $_function_NAMES"
if [[ "$_function_NAMES" = "" ]] ; then if [[ "$_function_NAMES" = "" ]] ; then
# no functions selected # no functions selected
@ -77,7 +85,7 @@ env_parallel() {
# Grep variable names # Grep variable names
_variable_NAMES="$(typeset +p | perl -pe 's/^typeset .. //' | _variable_NAMES="$(typeset +p | perl -pe 's/^typeset .. //' |
egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ |
egrep -v '^(PIPESTATUS)$')" egrep -v '^(PIPESTATUS)$')"
_list_variable_VALUES="typeset -p $_variable_NAMES" _list_variable_VALUES="typeset -p $_variable_NAMES"
if [[ "$_variable_NAMES" = "" ]] ; then if [[ "$_variable_NAMES" = "" ]] ; then
@ -97,10 +105,3 @@ env_parallel() {
`which parallel` "$@"; `which parallel` "$@";
unset PARALLEL_ENV; unset PARALLEL_ENV;
} }
# _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;
# }

View file

@ -1,8 +1,8 @@
#!/bin/pdksh #!/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 # after which 'env_parallel' works
# #
@ -27,7 +27,86 @@
env_parallel() { env_parallel() {
# env_parallel.pdksh # env_parallel.pdksh
export PARALLEL_ENV="$(alias | perl -pe 's/^/alias /';typeset -p|egrep -v 'typeset( -i)? -r|PIPESTATUS';typeset -f)";
# 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` "$@"; `which parallel` "$@";
unset PARALLEL_ENV; unset PARALLEL_ENV;
} }

View file

@ -160,29 +160,37 @@ E.g. by doing:
=item aliases =item aliases
alias myecho=echo alias myecho 'echo aliases'
env_parallel myecho ::: test env_parallel myecho ::: work
env_parallel -S server myecho ::: test env_parallel -S server myecho ::: work
env_parallel --env myecho myecho ::: work
env_parallel --env myecho -S server myecho ::: work
=item functions =item functions
function myfunc function myfunc
echo $argv echo functions $argv
end end
env_parallel myfunc ::: test env_parallel myfunc ::: work
env_parallel -S server myfunc ::: test env_parallel -S server myfunc ::: work
env_parallel --env myfunc myfunc ::: work
env_parallel --env myfunc -S server myfunc ::: work
=item variables =item variables
set myvar test set myvar variables
env_parallel echo '$myvar' ::: test env_parallel echo '$myvar' ::: work
env_parallel -S server echo '$myvar' ::: test 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 =item arrays
set myarray foo bar baz set myarray arrays work, too
env_parallel echo '$myarray[{}]' ::: 1 2 3 env_parallel -k echo '$myarray[{}]' ::: 1 2 3
env_parallel -S server 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 =back
@ -250,27 +258,35 @@ E.g. by doing:
=item aliases =item aliases
alias myecho=echo alias myecho="echo aliases";
env_parallel myecho ::: test env_parallel myecho ::: work;
env_parallel -S server myecho ::: test env_parallel -S server myecho ::: work;
env_parallel --env myecho myecho ::: work;
env_parallel --env myecho -S server myecho ::: work
=item functions =item functions
myfunc() { echo $*; } myfunc() { echo functions $*; };
env_parallel myfunc ::: test env_parallel myfunc ::: work;
env_parallel -S server myfunc ::: test env_parallel -S server myfunc ::: work;
env_parallel --env myfunc myfunc ::: work;
env_parallel --env myfunc -S server myfunc ::: work
=item variables =item variables
myvar=test myvar=variables;
env_parallel echo '$myvar' ::: test env_parallel echo "\$myvar" ::: work;
env_parallel -S server echo '$myvar' ::: test 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 =item arrays
myarray=(foo bar baz) myarray=(arrays work, too);
env_parallel echo '${myarray[{}]}' ::: 0 1 2 env_parallel -k echo "\${myarray[{}]}" ::: 0 1 2;
env_parallel -S server 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 =back

View file

@ -35,6 +35,8 @@ else
# If --env not set: Match everything (.*) # If --env not set: Match everything (.*)
set _tMpscRIpt=`tempfile` set _tMpscRIpt=`tempfile`
cat <<'EOF' > $_tMpscRIpt cat <<'EOF' > $_tMpscRIpt
#!/usr/bin/perl
for(@ARGV){ for(@ARGV){
/^_$/ and $next_is_env = 0; /^_$/ and $next_is_env = 0;
$next_is_env and push @envvar, split/,/, $_; $next_is_env and push @envvar, split/,/, $_;
@ -43,7 +45,8 @@ else
$vars = join "|",map { quotemeta $_ } @envvar; $vars = join "|",map { quotemeta $_ } @envvar;
print $vars ? "($vars)" : "(.*)"; print $vars ? "($vars)" : "(.*)";
'EOF' 'EOF'
set _grep_REGEXP="`perl $_tMpscRIpt -- !*`" set _grep_REGEXP="`perl $_tMpscRIpt -- $PARALLEL`"
# Deal with --env _ # Deal with --env _
cat <<'EOF' > $_tMpscRIpt cat <<'EOF' > $_tMpscRIpt
#!/usr/bin/perl #!/usr/bin/perl
@ -59,12 +62,13 @@ else
} else { } else {
chomp(@ignored_vars = <IN>); chomp(@ignored_vars = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars; $vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(nOVaRs)"; print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
} }
} }
'EOF' 'EOF'
set _ignore_UNDERSCORE="`perl $_tMpscRIpt -- !*`" set _ignore_UNDERSCORE="`perl $_tMpscRIpt -- $PARALLEL`"
rm $_tMpscRIpt rm $_tMpscRIpt
# Get the scalar and array variable names # Get the scalar and array variable names
set _vARnAmES=(`set | awk -e '{print $1}' |grep -vE '^(#|_|killring|prompt2|command)$' | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$`) set _vARnAmES=(`set | awk -e '{print $1}' |grep -vE '^(#|_|killring|prompt2|command)$' | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$`)

View file

@ -33,7 +33,8 @@ env_parallel() {
# and convert a b c to (a|b|c) # and convert a b c to (a|b|c)
# If --env not set: Match everything (.*) # If --env not set: Match everything (.*)
_grep_REGEXP="$( _grep_REGEXP="$(
perl -e 'for(@ARGV){ perl -e '
for(@ARGV){
/^_$/ and $next_is_env = 0; /^_$/ and $next_is_env = 0;
$next_is_env and push @envvar, split/,/, $_; $next_is_env and push @envvar, split/,/, $_;
$next_is_env = /^--env$/; $next_is_env = /^--env$/;
@ -44,18 +45,27 @@ env_parallel() {
)" )"
# Deal with --env _ # Deal with --env _
local _ignore_UNDERSCORE="$( local _ignore_UNDERSCORE="$(
perl -e 'for(@ARGV){ perl -e '
for(@ARGV){
$next_is_env and push @envvar, split/,/, $_; $next_is_env and push @envvar, split/,/, $_;
$next_is_env=/^--env$/; $next_is_env=/^--env$/;
} }
$underscore = grep { /^_$/ } @envvar; if(grep { /^_$/ } @envvar) {
print $underscore ? "grep -vf $ENV{HOME}/.parallel/ignored_vars" : "cat"; 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 # Grep alias names
_alias_NAMES="$(print -l ${(k)aliases} | _alias_NAMES="$(print -l ${(k)aliases} |
egrep "^${_grep_REGEXP}\$" | eval $_ignore_UNDERSCORE )" grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ )"
_list_alias_BODIES="alias "$(echo $_alias_NAMES|xargs)" | perl -pe 's/^/alias /'" _list_alias_BODIES="alias "$(echo $_alias_NAMES|xargs)" | perl -pe 's/^/alias /'"
if [[ "$_alias_NAMES" = "" ]] ; then if [[ "$_alias_NAMES" = "" ]] ; then
# no aliases selected # no aliases selected
@ -65,7 +75,7 @@ env_parallel() {
# Grep function names # Grep function names
_function_NAMES="$(print -l ${(k)functions} | _function_NAMES="$(print -l ${(k)functions} |
egrep "^${_grep_REGEXP}\$" | eval $_ignore_UNDERSCORE | grep -E "^$_grep_REGEXP\$" | grep -vE "^$_ignore_UNDERSCORE\$" |
grep -v '=' grep -v '='
)" )"
_list_function_BODIES="typeset -f "$(echo $_function_NAMES|xargs) _list_function_BODIES="typeset -f "$(echo $_function_NAMES|xargs)
@ -78,7 +88,7 @@ env_parallel() {
# Grep variable names # Grep variable names
# The egrep -v is crap and should be better # The egrep -v is crap and should be better
_variable_NAMES="$(print -l ${(k)parameters} | _variable_NAMES="$(print -l ${(k)parameters} |
egrep "^${_grep_REGEXP}\$" | eval $_ignore_UNDERSCORE | 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 '^([-?#!$*@_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' 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'
)" )"
@ -103,14 +113,3 @@ env_parallel() {
`which parallel` "$@"; `which parallel` "$@";
unset PARALLEL_ENV; 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

@ -108,6 +108,43 @@ _EOF
ssh ksh@lo "$myscript" 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() { par_tcsh_man() {
echo '### tcsh' echo '### tcsh'
myscript=$(cat <<'_EOF' myscript=$(cat <<'_EOF'
@ -143,7 +180,7 @@ par_csh_man() {
myscript=$(cat <<'_EOF' myscript=$(cat <<'_EOF'
echo "### From man env_parallel" echo "### From man env_parallel"
source `which env_parallel.csh`; # source `which env_parallel.csh`;
alias myecho 'echo aliases' alias myecho 'echo aliases'
env_parallel myecho ::: work env_parallel myecho ::: work
@ -170,6 +207,43 @@ _EOF
ssh csh@lo "$myscript" 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() { par_bash_underscore() {
echo '### bash' echo '### bash'
myscript=$(cat <<'_EOF' myscript=$(cat <<'_EOF'
@ -289,6 +363,45 @@ _EOF
ssh ksh@lo "$myscript" 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() { par_tcsh_underscore() {
echo '### tcsh' echo '### tcsh'
myscript=$(cat <<'_EOF' myscript=$(cat <<'_EOF'
@ -328,7 +441,7 @@ par_csh_underscore() {
myscript=$(cat <<'_EOF' myscript=$(cat <<'_EOF'
echo "### Testing of --env _" echo "### Testing of --env _"
# . `which env_parallel.tcsh`; # . `which env_parallel.csh`;
env_parallel --record-env; env_parallel --record-env;
alias myecho "echo "\$"myvar "\$'myarray'" aliases"; alias myecho "echo "\$"myvar "\$'myarray'" aliases";
set myvar="variables"; set myvar="variables";
@ -357,6 +470,47 @@ _EOF
ssh -tt csh@lo "$myscript" 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: # Test env_parallel:
# + for each shell # + for each shell
# + remote, locally # + remote, locally
@ -448,6 +602,35 @@ _EOF
ssh ksh@lo "$myscript" 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() { par_fish_funky() {
myscript=$(cat <<'_EOF' myscript=$(cat <<'_EOF'
set myvar "myvar works" set myvar "myvar works"
@ -524,6 +707,38 @@ _EOF
ssh csh@lo "$myscript" 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_) export -f $(compgen -A function | grep par_)
# Tested with -j1..8 # Tested with -j1..8

View file

@ -62,13 +62,13 @@ 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 and arrays in functions work
par_bash_underscore aliases in functions work par_bash_underscore aliases in functions work
par_bash_underscore aliases in functions work par_bash_underscore aliases in functions work
par_bash_underscore /bin/bash: line 64: myecho: command not found par_bash_underscore /bin/bash: line 139: myecho: command not found
par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^ par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^
par_bash_underscore /bin/bash: line 64: myecho: command not found par_bash_underscore /bin/bash: line 139: myecho: command not found
par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^ par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^
par_bash_underscore /bin/bash: line 62: myfunc: command not found par_bash_underscore /bin/bash: line 136: myfunc: command not found
par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^ par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^
par_bash_underscore /bin/bash: line 62: myfunc: command not found par_bash_underscore /bin/bash: line 136: myfunc: command not found
par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^ par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^
par_csh_funky 3 arg alias_works par_csh_funky 3 arg alias_works
par_csh_funky myvar works par_csh_funky myvar works
@ -112,13 +112,13 @@ 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 variables and arrays in aliases work
par_csh_underscore variables and arrays in aliases work par_csh_underscore myvar: Undefined variable.
par_csh_underscore variables and arrays in aliases work par_csh_underscore myvar: Undefined variable.
par_csh_underscore and arrays in aliases work par_csh_underscore myarray: Undefined variable.
par_csh_underscore and arrays in aliases work par_csh_underscore myarray: Undefined variable.
par_csh_underscore and arrays in aliases work par_csh_underscore myecho: Command not found.
par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho
par_csh_underscore and arrays in aliases work par_csh_underscore myecho: Command not found.
par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho par_csh_underscore OK ^^^^^^^^^^^^^^^^^ if no myecho
par_csh_underscore Connection to lo closed. 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
@ -157,6 +157,68 @@ par_fish_funky
par_fish_funky par_fish_funky
par_fish_funky par_fish_funky
par_fish_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~<7F>\\ƒ\„\…\†\‡\ˆ\‰\Š\\Œ\<5C>\Ž\<5C>\<5C>\\\“\”\•\\—\˜\™\š\\œ\<5C>\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿ par_fish_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~<7F>\\ƒ\„\…\†\‡\ˆ\‰\Š\\Œ\<5C>\Ž\<5C>\<5C>\\\“\”\•\\—\˜\™\š\\œ\<5C>\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿ
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 “myechoâ€<C3A2>
par_fish_underscore Standard input: myecho $myarray functions $argv
par_fish_underscore ^
par_fish_underscore in function “myfuncâ€<C3A2>,
par_fish_underscore called on standard input,
par_fish_underscore with parameter list “workâ€<C3A2>
par_fish_underscore
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho
par_fish_underscore fish: Unknown command “myechoâ€<C3A2>
par_fish_underscore Standard input: myecho $myarray functions $argv
par_fish_underscore ^
par_fish_underscore in function “myfuncâ€<C3A2>,
par_fish_underscore called on standard input,
par_fish_underscore with parameter list “workâ€<C3A2>
par_fish_underscore
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho
par_fish_underscore fish: Unknown command “myfuncâ€<C3A2>
par_fish_underscore Standard input: myfunc work
par_fish_underscore ^
par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myfunc
par_fish_underscore fish: Unknown command “myfuncâ€<C3A2>
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 3 arg alias_works
par_ksh_funky function_works par_ksh_funky function_works
par_ksh_funky myvar works par_ksh_funky myvar works
@ -212,14 +274,91 @@ 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 and arrays in functions work
par_ksh_underscore aliases in functions work par_ksh_underscore aliases in functions work
par_ksh_underscore aliases in functions work par_ksh_underscore aliases in functions work
par_ksh_underscore /usr/bin/ksh[100]: myecho: not found [No such file or directory] 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 OK if no myecho ^^^^^^^^^^^^^^^^^
par_ksh_underscore /usr/bin/ksh[100]: myecho: not found [No such file or directory] 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 OK if no myecho ^^^^^^^^^^^^^^^^^
par_ksh_underscore /usr/bin/ksh: line 100: myfunc: not found par_ksh_underscore /usr/bin/ksh: line 193: myfunc: not found
par_ksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^ par_ksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^
par_ksh_underscore /usr/bin/ksh: line 100: myfunc: not found par_ksh_underscore /usr/bin/ksh: line 193: myfunc: not found
par_ksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^ 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{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-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{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ-funky
par_pdksh_funky
par_pdksh_funky \\\\\\\\
par_pdksh_funky \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~<7F>\\ƒ\„\…\†\‡\ˆ\‰\Š\\Œ\<5C>\Ž\<5C>\<5C>\\\“\”\•\\—\˜\™\š\\œ\<5C>\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿ
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{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùú-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{|}~<7F>ƒ„…†‡ˆ‰ŠŒ<E280B9>Ž<EFBFBD><C5BD>“”•˜™šœ<E280BA>žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùú-funky alias_var_works_over_ssh
par_tcsh_funky func_echo: Command not found.
par_tcsh_funky
par_tcsh_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~<7F>\\ƒ\„\…\†\‡\ˆ\‰\Š\\Œ\<5C>\Ž\<5C>\<5C>\\\“\”\•\\—\˜\™\š\\œ\<5C>\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú
par_tcsh_man ### tcsh par_tcsh_man ### tcsh
par_tcsh_man ### From man env_parallel par_tcsh_man ### From man env_parallel
par_tcsh_man aliases work par_tcsh_man aliases work