diff --git a/src/env_parallel.bash b/src/env_parallel.bash index 615738b4..5e251674 100755 --- a/src/env_parallel.bash +++ b/src/env_parallel.bash @@ -33,7 +33,8 @@ env_parallel() { # and convert a b c to (a|b|c) # If --env not set: Match everything (.*) local _grep_REGEXP="$( - perl -e 'for(@ARGV){ + perl -e ' + for(@ARGV){ /^_$/ and $next_is_env = 0; $next_is_env and push @envvar, split/,/, $_; $next_is_env = /^--env$/; @@ -44,18 +45,27 @@ env_parallel() { )" # Deal with --env _ local _ignore_UNDERSCORE="$( - perl -e 'for(@ARGV){ + perl -e ' + for(@ARGV){ $next_is_env and push @envvar, split/,/, $_; $next_is_env=/^--env$/; } - $underscore = grep { /^_$/ } @envvar; - print $underscore ? "grep -vf $ENV{HOME}/.parallel/ignored_vars" : "cat"; + if(grep { /^_$/ } @envvar) { + if(not open(IN, "<", "$ENV{HOME}/.parallel/ignored_vars")) { + print STDERR "parallel: Error: ", + "Run \"parallel --record-env\" in a clean environment first.\n"; + } else { + chomp(@ignored_vars = ); + $vars = join "|",map { quotemeta $_ } @ignored_vars; + print $vars ? "($vars)" : "(,,nO,,VaRs,,)"; + } + } ' -- "$@" )" # Grep alias names 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" if [[ "$_alias_NAMES" = "" ]] ; then # no aliases selected @@ -65,7 +75,7 @@ env_parallel() { # Grep function names 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" if [[ "$_function_NAMES" = "" ]] ; then # no functions selected @@ -75,7 +85,7 @@ env_parallel() { # Grep variable names local _variable_NAMES="$(compgen -A variable | - egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE | + 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" @@ -101,17 +111,3 @@ env_parallel() { `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; -# } diff --git a/src/env_parallel.csh b/src/env_parallel.csh index 1e555b0b..d8fd3bda 100755 --- a/src/env_parallel.csh +++ b/src/env_parallel.csh @@ -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 = ); + $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; diff --git a/src/env_parallel.fish b/src/env_parallel.fish index f881cc49..078501d8 100755 --- a/src/env_parallel.fish +++ b/src/env_parallel.fish @@ -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 = ); + $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; diff --git a/src/env_parallel.ksh b/src/env_parallel.ksh index db238ecf..3d78dbf2 100755 --- a/src/env_parallel.ksh +++ b/src/env_parallel.ksh @@ -25,8 +25,6 @@ # 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.ksh @@ -35,10 +33,11 @@ env_parallel() { # and convert a b c to (a|b|c) # If --env not set: Match everything (.*) _grep_REGEXP="$( - perl -e 'for(@ARGV){ + 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)" : "(.*)"; @@ -46,18 +45,27 @@ env_parallel() { )" # Deal with --env _ _ignore_UNDERSCORE="$( - perl -e 'for(@ARGV){ + perl -e ' + for(@ARGV){ $next_is_env and push @envvar, split/,/, $_; $next_is_env=/^--env$/; } - $underscore = grep { /^_$/ } @envvar; - print $underscore ? "grep -vf $ENV{HOME}/.parallel/ignored_vars" : "cat"; + if(grep { /^_$/ } @envvar) { + if(not open(IN, "<", "$ENV{HOME}/.parallel/ignored_vars")) { + print STDERR "parallel: Error: ", + "Run \"parallel --record-env\" in a clean environment first.\n"; + } else { + chomp(@ignored_vars = ); + $vars = join "|",map { quotemeta $_ } @ignored_vars; + print $vars ? "($vars)" : "(,,nO,,VaRs,,)"; + } + } ' -- "$@" )" # Grep alias names _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 /'" if [[ "$_alias_NAMES" = "" ]] ; then # no aliases selected @@ -67,7 +75,7 @@ env_parallel() { # Grep function names _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" if [[ "$_function_NAMES" = "" ]] ; then # no functions selected @@ -77,7 +85,7 @@ env_parallel() { # Grep variable names _variable_NAMES="$(typeset +p | perl -pe 's/^typeset .. //' | - egrep "^${_grep_REGEXP}\$" | $_ignore_UNDERSCORE | + grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ | egrep -v '^(PIPESTATUS)$')" _list_variable_VALUES="typeset -p $_variable_NAMES" if [[ "$_variable_NAMES" = "" ]] ; then @@ -97,10 +105,3 @@ env_parallel() { `which parallel` "$@"; 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; -# } diff --git a/src/env_parallel.pdksh b/src/env_parallel.pdksh index c82f1978..4a92ef8e 100755 --- a/src/env_parallel.pdksh +++ b/src/env_parallel.pdksh @@ -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 = ); + $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; } diff --git a/src/env_parallel.pod b/src/env_parallel.pod index e7447625..3985ef95 100644 --- a/src/env_parallel.pod +++ b/src/env_parallel.pod @@ -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 @@ -250,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 diff --git a/src/env_parallel.tcsh b/src/env_parallel.tcsh index 8524167c..e19a79af 100755 --- a/src/env_parallel.tcsh +++ b/src/env_parallel.tcsh @@ -35,6 +35,8 @@ else # 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/,/, $_; @@ -43,7 +45,8 @@ else $vars = join "|",map { quotemeta $_ } @envvar; print $vars ? "($vars)" : "(.*)"; 'EOF' - set _grep_REGEXP="`perl $_tMpscRIpt -- !*`" + set _grep_REGEXP="`perl $_tMpscRIpt -- $PARALLEL`" + # Deal with --env _ cat <<'EOF' > $_tMpscRIpt #!/usr/bin/perl @@ -59,12 +62,13 @@ else } else { chomp(@ignored_vars = ); $vars = join "|",map { quotemeta $_ } @ignored_vars; - print $vars ? "($vars)" : "(nOVaRs)"; + print $vars ? "($vars)" : "(,,nO,,VaRs,,)"; } } 'EOF' - set _ignore_UNDERSCORE="`perl $_tMpscRIpt -- !*`" + 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|command)$' | grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$`) diff --git a/src/env_parallel.zsh b/src/env_parallel.zsh index bf16529e..aa8f0087 100755 --- a/src/env_parallel.zsh +++ b/src/env_parallel.zsh @@ -33,7 +33,8 @@ env_parallel() { # and convert a b c to (a|b|c) # If --env not set: Match everything (.*) _grep_REGEXP="$( - perl -e 'for(@ARGV){ + perl -e ' + for(@ARGV){ /^_$/ and $next_is_env = 0; $next_is_env and push @envvar, split/,/, $_; $next_is_env = /^--env$/; @@ -44,18 +45,27 @@ env_parallel() { )" # Deal with --env _ local _ignore_UNDERSCORE="$( - perl -e 'for(@ARGV){ + perl -e ' + for(@ARGV){ $next_is_env and push @envvar, split/,/, $_; $next_is_env=/^--env$/; } - $underscore = grep { /^_$/ } @envvar; - print $underscore ? "grep -vf $ENV{HOME}/.parallel/ignored_vars" : "cat"; + if(grep { /^_$/ } @envvar) { + if(not open(IN, "<", "$ENV{HOME}/.parallel/ignored_vars")) { + print STDERR "parallel: Error: ", + "Run \"parallel --record-env\" in a clean environment first.\n"; + } else { + chomp(@ignored_vars = ); + $vars = join "|",map { quotemeta $_ } @ignored_vars; + print $vars ? "($vars)" : "(,,nO,,VaRs,,)"; + } + } ' -- "$@" )" # Grep alias names _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 /'" if [[ "$_alias_NAMES" = "" ]] ; then # no aliases selected @@ -65,7 +75,7 @@ env_parallel() { # Grep function names _function_NAMES="$(print -l ${(k)functions} | - egrep "^${_grep_REGEXP}\$" | eval $_ignore_UNDERSCORE | + grep -E "^$_grep_REGEXP\$" | grep -vE "^$_ignore_UNDERSCORE\$" | grep -v '=' )" _list_function_BODIES="typeset -f "$(echo $_function_NAMES|xargs) @@ -78,7 +88,7 @@ env_parallel() { # Grep variable names # The egrep -v is crap and should be better _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 '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` "$@"; 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; -} diff --git a/testsuite/tests-to-run/parallel-local-ssh7.sh b/testsuite/tests-to-run/parallel-local-ssh7.sh index 87cf9066..faba0297 100755 --- a/testsuite/tests-to-run/parallel-local-ssh7.sh +++ b/testsuite/tests-to-run/parallel-local-ssh7.sh @@ -108,6 +108,43 @@ _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' @@ -143,7 +180,7 @@ par_csh_man() { myscript=$(cat <<'_EOF' echo "### From man env_parallel" - source `which env_parallel.csh`; +# source `which env_parallel.csh`; alias myecho 'echo aliases' env_parallel myecho ::: work @@ -170,6 +207,43 @@ _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' @@ -195,14 +269,14 @@ par_bash_underscore() { env_parallel --env _ -S server myfunc ::: work; echo myecho >> ~/.parallel/ignored_vars; env_parallel --env _ myfunc ::: work; - echo "OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; + echo "OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; env_parallel --env _ -S server myfunc ::: work; - echo "OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; + echo "OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; echo myfunc >> ~/.parallel/ignored_vars; env_parallel --env _ myfunc ::: work; - echo "OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; + echo "OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; env_parallel --env _ -S server myfunc ::: work; - echo "OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; + echo "OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^" >&2; _EOF ) ssh bash@lo "$myscript" @@ -289,6 +363,45 @@ _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' @@ -328,7 +441,7 @@ par_csh_underscore() { myscript=$(cat <<'_EOF' echo "### Testing of --env _" -# . `which env_parallel.tcsh`; +# . `which env_parallel.csh`; env_parallel --record-env; alias myecho "echo "\$"myvar "\$'myarray'" aliases"; set myvar="variables"; @@ -357,6 +470,47 @@ _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 @@ -448,6 +602,35 @@ _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" @@ -524,6 +707,38 @@ _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 diff --git a/testsuite/wanted-results/parallel-local-ssh7 b/testsuite/wanted-results/parallel-local-ssh7 index e0dd9250..b00442e6 100644 --- a/testsuite/wanted-results/parallel-local-ssh7 +++ b/testsuite/wanted-results/parallel-local-ssh7 @@ -62,14 +62,14 @@ 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 64: myecho: command not found -par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^ -par_bash_underscore /bin/bash: line 64: myecho: command not found -par_bash_underscore OK if no myecho ^^^^^^^^^^^^^^^^^^^^^^^^^ -par_bash_underscore /bin/bash: line 62: myfunc: command not found -par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^ -par_bash_underscore /bin/bash: line 62: myfunc: command not found -par_bash_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^^^^^^^^^ +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 @@ -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 and arrays in aliases work -par_csh_underscore and arrays in aliases work -par_csh_underscore 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 and arrays in aliases work +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 @@ -157,6 +157,68 @@ par_fish_funky par_fish_funky par_fish_funky par_fish_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +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” +par_fish_underscore Standard input: myecho $myarray functions $argv +par_fish_underscore ^ +par_fish_underscore in function “myfunc”, +par_fish_underscore called on standard input, +par_fish_underscore with parameter list “work” +par_fish_underscore +par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho +par_fish_underscore fish: Unknown command “myecho” +par_fish_underscore Standard input: myecho $myarray functions $argv +par_fish_underscore ^ +par_fish_underscore in function “myfunc”, +par_fish_underscore called on standard input, +par_fish_underscore with parameter list “work” +par_fish_underscore +par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myecho +par_fish_underscore fish: Unknown command “myfunc” +par_fish_underscore Standard input: myfunc work +par_fish_underscore ^ +par_fish_underscore OK if ^^^^^^^^^^^^^^^^^ no myfunc +par_fish_underscore fish: Unknown command “myfunc” +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 @@ -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 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 /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 /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 /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_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{|}~-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{|}~-funky +par_pdksh_funky +par_pdksh_funky \\\\\\\\ +par_pdksh_funky \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ +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{|}~-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{|}~-funky alias_var_works_over_ssh +par_tcsh_funky func_echo: Command not found. +par_tcsh_funky +par_tcsh_funky \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ par_tcsh_man ### tcsh par_tcsh_man ### From man env_parallel par_tcsh_man aliases work