diff --git a/src/Makefile.am b/src/Makefile.am
index 9b5f7e4e..20e5bd0c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,8 +1,8 @@
bin_SCRIPTS = parallel sql niceload parcat parset env_parallel \
env_parallel.ash env_parallel.bash env_parallel.csh \
env_parallel.dash env_parallel.fish env_parallel.ksh \
- env_parallel.pdksh env_parallel.sh env_parallel.tcsh \
- env_parallel.zsh
+ env_parallel.mksh env_parallel.pdksh env_parallel.sh \
+ env_parallel.tcsh env_parallel.zsh
install-exec-hook:
rm $(DESTDIR)$(bindir)/sem || true
@@ -278,8 +278,8 @@ DISTCLEANFILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
EXTRA_DIST = parallel sem sql niceload parcat parset env_parallel \
env_parallel.ash env_parallel.bash env_parallel.csh \
env_parallel.dash env_parallel.fish env_parallel.ksh \
- env_parallel.pdksh env_parallel.sh env_parallel.tcsh \
- env_parallel.zsh parcat.pod parset.pod sem.pod parallel.pod \
- env_parallel.pod niceload.pod parallel_tutorial.pod \
- parallel_book.pod parallel_design.pod \
+ env_parallel.mksh env_parallel.pdksh env_parallel.sh \
+ env_parallel.tcsh env_parallel.zsh parcat.pod parset.pod \
+ sem.pod parallel.pod env_parallel.pod niceload.pod \
+ parallel_tutorial.pod parallel_book.pod parallel_design.pod \
parallel_alternatives.pod $(DISTCLEANFILES)
diff --git a/src/Makefile.in b/src/Makefile.in
index ce1c2b84..392ecd5c 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -232,8 +232,8 @@ top_srcdir = @top_srcdir@
bin_SCRIPTS = parallel sql niceload parcat parset env_parallel \
env_parallel.ash env_parallel.bash env_parallel.csh \
env_parallel.dash env_parallel.fish env_parallel.ksh \
- env_parallel.pdksh env_parallel.sh env_parallel.tcsh \
- env_parallel.zsh
+ env_parallel.mksh env_parallel.pdksh env_parallel.sh \
+ env_parallel.tcsh env_parallel.zsh
@DOCUMENTATION_TRUE@man_MANS = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
@DOCUMENTATION_TRUE@ parallel_tutorial.7 parallel_book.7 parallel_design.7 \
@@ -269,10 +269,10 @@ DISTCLEANFILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
EXTRA_DIST = parallel sem sql niceload parcat parset env_parallel \
env_parallel.ash env_parallel.bash env_parallel.csh \
env_parallel.dash env_parallel.fish env_parallel.ksh \
- env_parallel.pdksh env_parallel.sh env_parallel.tcsh \
- env_parallel.zsh parcat.pod parset.pod sem.pod parallel.pod \
- env_parallel.pod niceload.pod parallel_tutorial.pod \
- parallel_book.pod parallel_design.pod \
+ env_parallel.mksh env_parallel.pdksh env_parallel.sh \
+ env_parallel.tcsh env_parallel.zsh parcat.pod parset.pod \
+ sem.pod parallel.pod env_parallel.pod niceload.pod \
+ parallel_tutorial.pod parallel_book.pod parallel_design.pod \
parallel_alternatives.pod $(DISTCLEANFILES)
all: all-am
diff --git a/src/env_parallel b/src/env_parallel
index 30757924..6524b3f2 100755
--- a/src/env_parallel
+++ b/src/env_parallel
@@ -43,6 +43,7 @@ while test $# -gt 0; do
installer . env_parallel.sh $HOME/.shrc
installer . env_parallel.zsh $HOME/.zshenv
installer source env_parallel.ksh $HOME/.kshrc
+ installer source env_parallel.mksh $HOME/.mkshrc
echo $SHELL | grepq /pdksh &&
installer . env_parallel.pdksh $HOME/.profile
echo $SHELL | grepq /ash &&
@@ -60,6 +61,7 @@ while test $# -gt 0; do
echo " " $HOME/.zshenv
echo " " $HOME/.config/fish/config.fish
echo " " $HOME/.kshrc
+ echo " " $HOME/.mkshrc
echo " " $HOME/.profile
echo " " $HOME/.cshrc
echo " " $HOME/.tcshrc
@@ -94,6 +96,10 @@ ksh: Put this in $HOME/.kshrc: source `which env_parallel.ksh`
E.g. by doing: echo 'source `which env_parallel.ksh`' >> $HOME/.kshrc
Supports: aliases, functions, variables, arrays
+mksh: Put this in $HOME/.mkshrc: source `which env_parallel.mksh`
+ E.g. by doing: echo 'source `which env_parallel.mksh`' >> $HOME/.mkshrc
+ Supports: aliases, functions, variables, arrays
+
pdksh: Put this in $HOME/.profile: source `which env_parallel.pdksh`
E.g. by doing: echo '. `which env_parallel.pdksh`' >> $HOME/.profile
Supports: aliases, functions, variables, arrays
diff --git a/src/env_parallel.mksh b/src/env_parallel.mksh
new file mode 100644
index 00000000..eabda1be
--- /dev/null
+++ b/src/env_parallel.mksh
@@ -0,0 +1,357 @@
+#!/usr/bin/env ksh
+
+# This file must be sourced in mksh:
+#
+# source `which env_parallel.mksh`
+#
+# after which 'env_parallel' works
+#
+#
+# Copyright (C) 2016,2017,2018
+# Ole Tange and Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see
+# or write to the Free Software Foundation, Inc., 51 Franklin St,
+# Fifth Floor, Boston, MA 02110-1301 USA
+
+env_parallel() {
+ # env_parallel.mksh
+
+ _names_of_ALIASES() {
+ alias | perl -pe 's/=.*//'
+ }
+ _bodies_of_ALIASES() {
+ alias "$@" | perl -pe 's/^/alias /;
+ sub warning { print STDERR "env_parallel: Warning: @_\n"; }
+ if(/^alias (\S+)=\$.*\\n/) {
+ warning("Alias \"$1\" contains newline.");
+ warning("Make sure the command has at least one newline after \"$1\".");
+ warning("See BUGS in \"man env_parallel\".");
+ }'
+
+ }
+ _names_of_maybe_FUNCTIONS() {
+ true not used
+ }
+ _names_of_FUNCTIONS() {
+ typeset +f
+ }
+ _bodies_of_FUNCTIONS() {
+ typeset -f "$@"
+ }
+ _names_of_VARIABLES() {
+ typeset +p |
+ perl -pe 's/^(type)?set( [-+][a-zA-Z0-9]*)* //; s/(\[\d+\])?=.*//' |
+ uniq
+ }
+ _bodies_of_VARIABLES() {
+ typeset -p "$@"
+ }
+ _ignore_HARDCODED() {
+ # These names cannot be detected
+ echo '(_)'
+ }
+ _ignore_READONLY() {
+ readonly | perl -e '@r = map {
+ chomp;
+ # sh on UnixWare: readonly TIMEOUT
+ # ash: readonly var='val'
+ # ksh: var='val'
+ # mksh: PIPESTATUS[0]
+ s/^(readonly )?([^=\[ ]*?)(\[\d+\])?(=.*|)$/$2/ or
+ # bash: declare -ar BASH_VERSINFO=([0]="4" [1]="4")
+ s/^\S+\s+\S+\s+(\S[^=]*)(=.*|$)/$1/;
+ $_ } <>;
+ $vars = join "|",map { quotemeta $_ } @r;
+ print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
+ '
+ }
+ _remove_bad_NAMES() {
+ # Do not transfer vars and funcs from env_parallel
+ _ignore_RO="`_ignore_READONLY`"
+ _ignore_HARD="`_ignore_HARDCODED`"
+ # Macos-grep does not like long patterns
+ # Old Solaris grep does not support -E
+ # Perl Version of:
+ # grep -Ev '^(...)$' |
+ perl -ne '/^(
+ PARALLEL_ENV|
+ PARALLEL_TMP|
+ _alias_NAMES|
+ _bodies_of_ALIASES|
+ _bodies_of_FUNCTIONS|
+ _bodies_of_VARIABLES|
+ _error_PAR|
+ _function_NAMES|
+ _get_ignored_VARS|
+ _grep_REGEXP|
+ _ignore_HARD|
+ _ignore_HARDCODED|
+ _ignore_READONLY|
+ _ignore_RO|
+ _ignore_UNDERSCORE|
+ _list_alias_BODIES|
+ _list_function_BODIES|
+ _list_variable_VALUES|
+ _make_grep_REGEXP|
+ _names_of_ALIASES|
+ _names_of_FUNCTIONS|
+ _names_of_VARIABLES|
+ _names_of_maybe_FUNCTIONS|
+ _parallel_exit_CODE|
+ _prefix_PARALLEL_ENV|
+ _prefix_PARALLEL_ENV|
+ _remove_bad_NAMES|
+ _remove_readonly|
+ _variable_NAMES|
+ _warning_PAR|
+ _which_PAR)$/x and next;
+ # Filter names matching --env
+ /^'"$_grep_REGEXP"'$/ or next;
+ /^'"$_ignore_UNDERSCORE"'$/ and next;
+ # Remove readonly variables
+ /^'"$_ignore_RO"'$/ and next;
+ /^'"$_ignore_HARD"'$/ and next;
+ print;'
+ }
+ _get_ignored_VARS() {
+ 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 = );
+ }
+ }
+ if($ENV{PARALLEL_IGNORED_NAMES}) {
+ push @ignored_vars, split/\s+/, $ENV{PARALLEL_IGNORED_NAMES};
+ chomp @ignored_vars;
+ }
+ $vars = join "|",map { quotemeta $_ } "env_parallel", @ignored_vars;
+ print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
+ ' -- "$@"
+ }
+
+ # Get the --env variables if set
+ # --env _ should be ignored
+ # and convert a b c to (a|b|c)
+ # If --env not set: Match everything (.*)
+ _make_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)" : "(.*)";
+ ' -- "$@"
+ }
+ _which_PAR() {
+ # type returns:
+ # ll is an alias for ls -l (in ash)
+ # bash is a tracked alias for /bin/bash
+ # true is a shell builtin
+ # myfunc is a function (in bash)
+ # myfunc is a shell function (in zsh)
+ # which is /usr/bin/which
+ # which is hashed (/usr/bin/which)
+ # aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
+ # Return 0 if found, 1 otherwise
+ LANG=C type "$@" |
+ perl -pe '$exit += (s/ is an alias for .*// ||
+ s/ is aliased to .*// ||
+ s/ is a function// ||
+ s/ is a shell function// ||
+ s/ is a shell builtin// ||
+ s/.* is hashed .(\S+).$/$1/ ||
+ s/.* is (a tracked alias for )?//);
+ END { exit not $exit }'
+ }
+ _warning_PAR() {
+ echo "env_parallel: Warning: $@" >&2
+ }
+ _error_PAR() {
+ echo "env_parallel: Error: $@" >&2
+ }
+
+ if _which_PAR parallel >/dev/null; then
+ true parallel found in path
+ else
+ _error_PAR 'parallel must be in $PATH.'
+ return 255
+ fi
+
+ # Grep regexp for vars given by --env
+ _grep_REGEXP="`_make_grep_REGEXP \"$@\"`"
+
+ # Deal with --env _
+ _ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`"
+
+ # --record-env
+ if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then
+ true skip
+ else
+ (_names_of_ALIASES;
+ _names_of_FUNCTIONS;
+ _names_of_VARIABLES) |
+ cat > $HOME/.parallel/ignored_vars
+ return 0
+ fi
+
+ # --session
+ if perl -e 'exit grep { /^--session$/ } @ARGV' -- "$@"; then
+ true skip
+ else
+ PARALLEL_IGNORED_NAMES="`_names_of_ALIASES;
+ _names_of_FUNCTIONS;
+ _names_of_VARIABLES`"
+ export PARALLEL_IGNORED_NAMES
+ return 0
+ fi
+
+ # Grep alias names
+ _alias_NAMES="`_names_of_ALIASES | _remove_bad_NAMES | xargs echo`"
+ _list_alias_BODIES="_bodies_of_ALIASES $_alias_NAMES"
+ if [ "$_alias_NAMES" = "" ] ; then
+ # no aliases selected
+ _list_alias_BODIES="true"
+ fi
+ unset _alias_NAMES
+
+ # Grep function names
+ _function_NAMES="`_names_of_FUNCTIONS | _remove_bad_NAMES | xargs echo`"
+ _list_function_BODIES="_bodies_of_FUNCTIONS $_function_NAMES"
+ if [ "$_function_NAMES" = "" ] ; then
+ # no functions selected
+ _list_function_BODIES="true"
+ fi
+ unset _function_NAMES
+
+ # Grep variable names
+ _variable_NAMES="`_names_of_VARIABLES | _remove_bad_NAMES | xargs echo`"
+ _list_variable_VALUES="_bodies_of_VARIABLES $_variable_NAMES"
+ if [ "$_variable_NAMES" = "" ] ; then
+ # no variables selected
+ _list_variable_VALUES="true"
+ fi
+ unset _variable_NAMES
+
+ PARALLEL_ENV="`
+ $_list_alias_BODIES;
+ $_list_function_BODIES;
+ $_list_variable_VALUES;
+ `"
+ export PARALLEL_ENV
+ unset _list_alias_BODIES
+ unset _list_variable_VALUES
+ unset _list_function_BODIES
+ unset _grep_REGEXP
+ unset _ignore_UNDERSCORE
+ # Test if environment is too big
+ if `_which_PAR true` >/dev/null 2>/dev/null ; then
+ parallel "$@";
+ _parallel_exit_CODE=$?
+ unset PARALLEL_ENV;
+ return $_parallel_exit_CODE
+ else
+ unset PARALLEL_ENV;
+ _error_PAR "Your environment is too big."
+ _error_PAR "You can try 3 different approaches:"
+ _error_PAR "1. Run 'env_parallel --session' before you set"
+ _error_PAR " variables or define functions."
+ _error_PAR "2. Use --env and only mention the names to copy."
+ _error_PAR "3. Try running this in a clean environment once:"
+ _error_PAR " env_parallel --record-env"
+ _error_PAR " And then use '--env _'"
+ _error_PAR "For details see: man env_parallel"
+ return 255
+ fi
+}
+
+parset() {
+ _parset_parallel_prg=parallel
+ _parset_main "$@"
+}
+
+env_parset() {
+ _parset_parallel_prg=env_parallel
+ _parset_main "$@"
+}
+
+_parset_main() {
+ # If $1 contains ',' or space:
+ # Split on , to get the destination variable names
+ # If $1 is a single destination variable name:
+ # Treat it as the name of an array
+ #
+ # # Create array named myvar
+ # parset myvar echo ::: {1..10}
+ # echo ${myvar[5]}
+ #
+ # # Put output into $var_a $var_b $var_c
+ # varnames=(var_a var_b var_c)
+ # parset "${varnames[*]}" echo ::: {1..3}
+ # echo $var_c
+ #
+ # # Put output into $var_a4 $var_b4 $var_c4
+ # parset "var_a4 var_b4 var_c4" echo ::: {1..3}
+ # echo $var_c4
+
+ _parset_name="$1"
+ if [ "$_parset_name" = "" ] ; then
+ echo parset: Error: No destination variable given. >&2
+ echo parset: Error: Try: >&2
+ echo parset: Error: ' ' parset myarray echo ::: foo bar >&2
+ return 255
+ fi
+ shift
+ echo "$_parset_name" |
+ perl -ne 'chomp;for (split /[, ]/) {
+ # Allow: var_32 var[3]
+ if(not /^[a-zA-Z_][a-zA-Z_0-9]*(\[\d+\])?$/) {
+ print STDERR "parset: Error: $_ is an invalid variable name.\n";
+ print STDERR "parset: Error: Variable names must be letter followed by letters or digits.\n";
+ $exitval = 255;
+ }
+ }
+ exit $exitval;
+ ' || return 255
+ if perl -e 'exit not grep /,| /, @ARGV' "$_parset_name" ; then
+ # $_parset_name contains , or space
+ # Split on , or space to get the names
+ eval "`
+ # Compute results into files
+ $_parset_parallel_prg --files -k "$@" |
+ # var1= cat tmpfile1; rm tmpfile1
+ # var2= cat tmpfile2; rm tmpfile2
+ parallel -q echo {2}='\`cat {1}; rm {1}\`' :::: - :::+ \`
+ echo "$_parset_name" |
+ perl -pe 's/,/ /g'
+ \`
+ `"
+ else
+ # $_parset_name does not contain , or space
+ # => $_parset_name is the name of the array to put data into
+ # Supported in: bash zsh ksh
+ # Arrays do not work in: ash dash
+ eval "$_parset_name=( $( $_parset_parallel_prg --files -k "$@" |
+ perl -pe 'chop;$_="\"\`cat $_; rm $_\`\" "' ) )"
+ fi
+}
diff --git a/src/env_parallel.pod b/src/env_parallel.pod
index a91135c5..71b582ad 100644
--- a/src/env_parallel.pod
+++ b/src/env_parallel.pod
@@ -448,6 +448,68 @@ array with the given name. Multiple B<--env>s can be given.
=back
+=head2 mksh (alpha testing)
+
+=head3 Installation
+
+Put this in $HOME/.mkshrc:
+
+ source `which env_parallel.mksh`
+
+E.g. by doing:
+
+ echo 'source `which env_parallel.mksh`' >> $HOME/.mkshrc
+
+=head3 Supported use
+
+B<--env> is supported to export only the variable, alias, function, or
+array with the given name. Multiple B<--env>s can be given.
+
+=over 8
+
+=item aliases
+
+ 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
+
+ alias multiline='echo multiline
+ echo aliases'
+ env_parallel multiline ::: work
+ env_parallel -S server multiline ::: work
+ env_parallel --env multiline multiline ::: work
+ env_parallel --env multiline -S server multiline ::: work
+
+=item functions
+
+ 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=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=(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
+
+
=head2 pdksh
=head3 Installation
diff --git a/src/parset b/src/parset
index 80b57e1a..9cab27c1 100755
--- a/src/parset
+++ b/src/parset
@@ -43,6 +43,7 @@ while test $# -gt 0; do
installer . env_parallel.sh $HOME/.shrc
installer . env_parallel.zsh $HOME/.zshenv
installer source env_parallel.ksh $HOME/.kshrc
+ installer source env_parallel.mksh $HOME/.kshrc
echo $SHELL | grepq /pdksh &&
installer . env_parallel.pdksh $HOME/.profile
echo $SHELL | grepq /ash &&
@@ -60,6 +61,7 @@ while test $# -gt 0; do
echo " " $HOME/.zshenv
echo " " $HOME/.config/fish/config.fish
echo " " $HOME/.kshrc
+ echo " " $HOME/.mkshrc
echo " " $HOME/.profile
echo " " $HOME/.cshrc
echo " " $HOME/.tcshrc
@@ -93,6 +95,10 @@ ksh: Put this in $HOME/.kshrc: source `which env_parallel.ksh`
E.g. by doing: echo 'source `which env_parallel.ksh`' >> $HOME/.kshrc
Supports: aliases, functions, variables, arrays
+mksh: Put this in $HOME/.mkshrc: source `which env_parallel.mksh`
+ E.g. by doing: echo 'source `which env_parallel.mksh`' >> $HOME/.mkshrc
+ Supports: aliases, functions, variables, arrays
+
pdksh: Put this in $HOME/.profile: source `which env_parallel.pdksh`
E.g. by doing: echo '. `which env_parallel.pdksh`' >> $HOME/.profile
Supports: aliases, functions, variables, arrays
diff --git a/src/parset.pod b/src/parset.pod
index cedc3669..a604eabc 100644
--- a/src/parset.pod
+++ b/src/parset.pod
@@ -39,7 +39,7 @@ variable.
=head1 SUPPORTED SHELLS
-=head2 Bash/Zsh/Ksh
+=head2 Bash/Zsh/Ksh/(Mksh alpha testing)
=head3 Examples
diff --git a/testsuite/tests-to-run/parallel-local-ssh7.sh b/testsuite/tests-to-run/parallel-local-ssh7.sh
index 12f0d968..7a5f3658 100755
--- a/testsuite/tests-to-run/parallel-local-ssh7.sh
+++ b/testsuite/tests-to-run/parallel-local-ssh7.sh
@@ -346,6 +346,69 @@ _EOF
ssh ksh@lo "$myscript"
}
+par_mksh_man() {
+ echo '### mksh'
+ myscript=$(cat <<'_EOF'
+ echo "### From man env_parallel"
+
+ . `which env_parallel.mksh`;
+
+ alias myecho='echo aliases with \= \& \" \!'" \'"
+ myecho work
+ env_parallel myecho ::: work
+ env_parallel -S server myecho ::: work
+ env_parallel --env myecho myecho ::: work
+ env_parallel --env myecho -S server myecho ::: work
+
+ alias multiline='echo multiline
+ echo aliases with \= \& \" \!'" \'"
+ multiline work
+ env_parallel multiline ::: work
+ env_parallel -S server multiline ::: work
+ env_parallel --env multiline multiline ::: work
+ env_parallel --env multiline -S server multiline ::: work
+ alias multiline='dummy'
+
+ myfunc() { echo functions 'with = & " !'" '" $*; }
+ myfunc work
+ 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 with = & " !'" '"
+ echo "$myvar" work
+ 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
+
+ multivar='multiline
+ variables with = & " !'" '"
+ echo "$multivar" work
+ env_parallel echo '"$multivar"' ::: work
+ env_parallel -S server echo '"$multivar"' ::: work
+ env_parallel --env multivar echo '"$multivar"' ::: work
+ env_parallel --env multivar -S server echo '"$multivar"' ::: work
+
+ myarray=(arrays 'with = & " !'" '" work, too)
+ echo "${myarray[0]}" "${myarray[1]}" "${myarray[2]}" "${myarray[3]}"
+ env_parallel -k echo '"${myarray[{}]}"' ::: 0 1 2 3
+ env_parallel -k -S server echo '"${myarray[{}]}"' ::: 0 1 2 3
+ env_parallel -k --env myarray echo '"${myarray[{}]}"' ::: 0 1 2 3
+ env_parallel -k --env myarray -S server echo '"${myarray[{}]}"' ::: 0 1 2 3
+
+ env_parallel ::: true false true false
+ echo exit value $? should be 2
+
+ env_parallel --no-such-option 2>&1 >/dev/null
+ # Sleep 1 to delay output to stderr to avoid race
+ echo exit value $? should be 255 `sleep 1`
+_EOF
+ )
+ ssh mksh@lo "$myscript"
+}
+
par_sh_man() {
echo '### sh'
@@ -796,6 +859,54 @@ _EOF
ssh ksh@lo "$myscript"
}
+par_mksh_underscore() {
+ echo '### mksh'
+ myscript=$(cat <<'_EOF'
+ echo "### Testing of --env _"
+
+ alias not_copied_alias="echo BAD"
+ not_copied_func() { echo BAD; };
+ not_copied_var=BAD
+ not_copied_array=(BAD BAD BAD);
+ . `which env_parallel.mksh`;
+ 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;
+
+ env_parallel --env _ -S server not_copied_alias ::: error=OK;
+ env_parallel --env _ -S server not_copied_func ::: error=OK;
+ env_parallel --env _ -S server echo \$not_copied_var ::: error=OK;
+ env_parallel --env _ -S server echo \${not_copied_array[@]} ::: error=OK;
+
+ echo myvar >> ~/.parallel/ignored_vars;
+ 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 mksh@lo "$myscript"
+}
+
par_sh_underscore() {
echo '### sh'
myscript=$(cat <<'_EOF'
@@ -1144,6 +1255,39 @@ _EOF
ssh ksh@lo "$myscript" 2>&1 | sort
}
+par_mksh_funky() {
+ myscript=$(cat <<'_EOF'
+ . `which env_parallel.mksh`;
+
+ myvar="myvar works"
+ funky=$(perl -e "print pack \"c*\", 1..255")
+ myarray=("" array_val2 3 "" 5 " space 6 ")
+# Assoc arrays not supported
+# 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 mksh@lo alias_echo ::: alias_works_over_ssh
+ env_parallel -S mksh@lo func_echo ::: function_works_over_ssh
+ echo
+ echo "$funky" | parallel --shellquote
+_EOF
+ )
+ # Order is often different. Dunno why. So sort
+ ssh mksh@lo "$myscript" 2>&1 | sort
+}
+
par_sh_funky() {
myscript=$(cat <<'_EOF'
. `which env_parallel.sh`;
@@ -1367,6 +1511,31 @@ _EOF
ssh ksh@lo "$myscript" 2>&1 | sort
}
+par_mksh_env_parallel() {
+ myscript=$(cat <<'_EOF'
+ . `which env_parallel.mksh`;
+ echo 'bug #50435: Remote fifo broke in 20150522'
+ # Due to $PARALLEL_TMP being transferred
+ OK=OK
+ echo data from stdin | env_parallel --pipe -S lo --fifo 'cat {} && echo $OK'
+ echo data from stdin | env_parallel --pipe -S lo --cat 'cat {} && echo $OK'
+
+ echo 'bug #52534: Tail of multiline alias is ignored'
+ alias myalias='echo alias line 1
+ echo alias line 2
+ echo alias line 3
+ '
+ alias myalias2='echo alias2 line 1
+ echo alias2 line 2
+ '
+ env_parallel myalias ::: myalias2
+ env_parallel -S lo myalias ::: myalias2
+_EOF
+ )
+ # Order is often different. Dunno why. So sort
+ ssh mksh@lo "$myscript" 2>&1 | sort
+}
+
par_sh_env_parallel() {
myscript=$(cat <<'_EOF'
. `which env_parallel.sh`;
@@ -1633,6 +1802,54 @@ _EOF
ssh ksh@lo "$myscript"
}
+par_mksh_environment_too_big() {
+ myscript=$(cat <<'_EOF'
+ echo 'bug #50815: env_parallel should warn if the environment is too big'
+ . `which env_parallel.mksh`;
+
+ bigvar="$(perl -e 'print "x"x119000')"
+ env_parallel echo ::: OK_bigvar
+ env_parallel -S lo echo ::: OK_bigvar_remote
+
+ bigvar="$(perl -e 'print "\""x119000')"
+ env_parallel echo ::: OK_bigvar_quote
+ env_parallel -S lo echo ::: OK_bigvar_quote_remote
+
+ bigvar=u
+ eval 'bigfunc() { a="'"$(perl -e 'print "x"x119000')"'"; };'
+ env_parallel echo ::: OK_bigfunc
+ env_parallel -S lo echo ::: OK_bigfunc_remote
+
+ eval 'bigfunc() { a="'"$(perl -e 'print "\""x119000')"'"; };'
+ env_parallel echo ::: OK_bigfunc_quote
+ env_parallel -S lo echo ::: OK_bigfunc_quote_remote
+ bigfunc() { true; }
+
+ echo Rest should fail
+
+ bigvar="$(perl -e 'print "x"x130000')"
+ env_parallel echo ::: fail_bigvar
+ env_parallel -S lo echo ::: fail_bigvar_remote
+
+ bigvar="$(perl -e 'print "\""x130000')"
+ env_parallel echo ::: fail_bigvar_quote
+ env_parallel -S lo echo ::: fail_bigvar_quote_remote
+
+ bigvar=u
+ eval 'bigfunc() { a="'"$(perl -e 'print "x"x129000')"'"; };'
+ env_parallel echo ::: fail_bigfunc
+ env_parallel -S lo echo ::: fail_bigfunc_remote
+
+ eval 'bigfunc() { a="'"$(perl -e 'print "\""x130000')"'"; };'
+ env_parallel echo ::: fail_bigfunc_quote
+ env_parallel -S lo echo ::: fail_bigfunc_quote_remote
+
+ bigfunc() { true; }
+_EOF
+ )
+ ssh mksh@lo "$myscript"
+}
+
par_sh_environment_too_big() {
myscript=$(cat <<'_EOF'
echo 'bug #50815: env_parallel should warn if the environment is too big'
@@ -1969,6 +2186,60 @@ _EOF
ssh ksh@lo "$myscript"
}
+par_mksh_parset() {
+ myscript=$(cat <<'_EOF'
+ echo 'parset'
+ . `which env_parallel.mksh`
+
+ echo '### parset into array'
+ parset arr1 echo ::: foo bar baz
+ echo ${arr1[0]} ${arr1[1]} ${arr1[2]}
+
+ echo '### parset into vars with comma'
+ parset comma3,comma2,comma1 echo ::: baz bar foo
+ echo $comma1 $comma2 $comma3
+
+ echo '### parset into vars with space'
+ parset 'space3 space2 space1' echo ::: baz bar foo
+ echo $space1 $space2 $space3
+
+ echo '### parset with newlines'
+ parset 'newline3 newline2 newline1' seq ::: 3 2 1
+ echo "$newline1"
+ echo "$newline2"
+ echo "$newline3"
+
+ echo '### parset into indexed array vars'
+ parset 'myarray[6],myarray[5],myarray[4]' echo ::: baz bar foo
+ echo ${myarray[*]}
+ echo ${myarray[4]} ${myarray[5]} ${myarray[6]}
+
+ echo '### env_parset'
+ myfun() {
+ myecho myfun "$@";
+ }
+ alias myecho='echo myecho "$myvar" "${myarr[1]}"'
+ myvar="myvar"
+ myarr=("myarr 0" "myarr 1" "myarr 2")
+ mynewline="`echo newline1;echo newline2;`"
+ env_parset arr1 myfun ::: foo bar baz
+ echo "${arr1[0]} ${arr1[1]} ${arr1[2]}"
+ env_parset comma3,comma2,comma1 myfun ::: baz bar foo
+ echo "$comma1 $comma2 $comma3"
+ env_parset 'space3 space2 space1' myfum ::: baz bar foo
+ echo "$space1 $space2 $space3"
+ env_parset 'newline3 newline2 newline1' 'echo "$mynewline";seq' ::: 3 2 1
+ echo "$newline1"
+ echo "$newline2"
+ echo "$newline3"
+ env_parset 'myarray[6],myarray[5],myarray[4]' myfun ::: baz bar foo
+ echo "${myarray[*]}"
+ echo "${myarray[4]} ${myarray[5]} ${myarray[6]}"
+_EOF
+ )
+ ssh mksh@lo "$myscript"
+}
+
par_sh_parset() {
myscript=$(cat <<'_EOF'
echo 'parset'
@@ -2132,7 +2403,7 @@ par_ash_env_parallel_session() {
# Arrays not supported
# arraybefore=(array before)
env_parallel --session
- # stuff defined
+ # stuff defined
env_parallel aliasbefore ::: must_fail
env_parallel -S lo aliasbefore ::: must_fail
# Functions not supported
@@ -2175,7 +2446,7 @@ par_bash_env_parallel_session() {
funcbefore() { echo 'before' "$@"; }
arraybefore=(array before)
env_parallel --session
- # stuff defined
+ # stuff defined
env_parallel aliasbefore ::: must_fail
env_parallel -S lo aliasbefore ::: must_fail
env_parallel funcbefore ::: must_fail
@@ -2218,7 +2489,7 @@ par_dash_env_parallel_session() {
# Arrays not supported
# arraybefore=(array before)
env_parallel --session
- # stuff defined
+ # stuff defined
env_parallel aliasbefore ::: must_fail
env_parallel -S lo aliasbefore ::: must_fail
# Functions not supported
@@ -2265,7 +2536,7 @@ par_ksh_env_parallel_session() {
funcbefore() { echo 'before' "$@"; }
arraybefore=(array before)
env_parallel --session
- # stuff defined
+ # stuff defined
env_parallel aliasbefore ::: must_fail
env_parallel -S lo aliasbefore ::: must_fail
env_parallel funcbefore ::: must_fail
@@ -2292,6 +2563,43 @@ _EOF
ssh ksh@lo "$myscript"
}
+par_mksh_env_parallel_session() {
+ myscript=$(cat <<'_EOF'
+ . `which env_parallel.mksh`
+ echo '### Test env_parallel --session'
+
+ alias aliasbefore='echo before'
+ varbefore='before'
+ funcbefore() { echo 'before' "$@"; }
+ arraybefore=(array before)
+ env_parallel --session
+ # stuff defined
+ env_parallel aliasbefore ::: must_fail
+ env_parallel -S lo aliasbefore ::: must_fail
+ env_parallel funcbefore ::: must_fail
+ env_parallel -S lo funcbefore ::: must_fail
+ env_parallel echo '$varbefore' ::: no_before
+ env_parallel -S lo echo '$varbefore' ::: no_before
+ env_parallel echo '${arraybefore[*]}' ::: no_before
+ env_parallel -S lo echo '${arraybefore[*]}' ::: no_before
+ alias aliasafter='echo after'
+ varafter='after'
+ funcafter() { echo 'after' "$@"; }
+ arrayafter=(array after)
+ env_parallel aliasafter ::: aliasafter_OK
+ env_parallel -S lo aliasafter ::: aliasafter_OK
+ env_parallel funcafter ::: funcafter_OK
+ env_parallel -S lo funcafter ::: funcafter_OK
+ env_parallel echo '$varafter' ::: varafter_OK
+ env_parallel -S lo echo '$varafter' ::: varafter_OK
+ env_parallel echo '${arrayafter[*]}' ::: arrayafter_OK
+ env_parallel -S lo echo '${arrayafter[*]}' ::: arrayafter_OK
+ unset PARALLEL_IGNORED_NAMES
+_EOF
+ )
+ ssh mksh@lo "$myscript"
+}
+
par_sh_env_parallel_session() {
myscript=$(cat <<'_EOF'
. `which env_parallel.sh`
@@ -2304,7 +2612,7 @@ par_sh_env_parallel_session() {
# Arrays not supported
# arraybefore=(array before)
env_parallel --session
- # stuff defined
+ # stuff defined
env_parallel aliasbefore ::: must_fail
env_parallel -S lo aliasbefore ::: must_fail
# Functions not supported
@@ -2351,7 +2659,7 @@ par_zsh_env_parallel_session() {
funcbefore() { echo 'before' "$@"; }
arraybefore=(array before)
env_parallel --session
- # stuff defined
+ # stuff defined
env_parallel aliasbefore ::: must_fail
env_parallel -S lo aliasbefore ::: must_fail
env_parallel funcbefore ::: must_fail
diff --git a/testsuite/wanted-results/parallel-local-100s b/testsuite/wanted-results/parallel-local-100s
index ca40dc51..cc723cd3 100644
--- a/testsuite/wanted-results/parallel-local-100s
+++ b/testsuite/wanted-results/parallel-local-100s
@@ -402,7 +402,7 @@ par_test_build_and_install Making install in src
par_test_build_and_install make[0]: Entering directory '/tmp/parallel-00000000/src'
par_test_build_and_install make[0]: Entering directory '/tmp/parallel-00000000/src'
par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/bin'
-par_test_build_and_install /usr/bin/install -c parallel sql niceload parcat parset env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/tmp/parallel-install/bin'
+par_test_build_and_install /usr/bin/install -c parallel sql niceload parcat parset env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.mksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/tmp/parallel-install/bin'
par_test_build_and_install make install-exec-hook
par_test_build_and_install make[0]: Entering directory '/tmp/parallel-00000000/src'
par_test_build_and_install rm /tmp/parallel-install/bin/sem || true
@@ -662,7 +662,7 @@ par_test_build_and_install /bin/bash: pod2pdf: command not found
par_test_build_and_install Warning: pod2pdf not found. Using old parset.pdf
par_test_build_and_install make[0]: Entering directory '/tmp/parallel-00000000/src'
par_test_build_and_install /bin/mkdir -p '/tmp/parallel-install/bin'
-par_test_build_and_install /usr/bin/install -c parallel sql niceload parcat parset env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/tmp/parallel-install/bin'
+par_test_build_and_install /usr/bin/install -c parallel sql niceload parcat parset env_parallel env_parallel.ash env_parallel.bash env_parallel.csh env_parallel.dash env_parallel.fish env_parallel.ksh env_parallel.mksh env_parallel.pdksh env_parallel.sh env_parallel.tcsh env_parallel.zsh '/tmp/parallel-install/bin'
par_test_build_and_install make install-exec-hook
par_test_build_and_install make[0]: Entering directory '/tmp/parallel-00000000/src'
par_test_build_and_install rm /tmp/parallel-install/bin/sem || true
diff --git a/testsuite/wanted-results/parallel-local-ssh7 b/testsuite/wanted-results/parallel-local-ssh7
index d381a3f5..282f7152 100644
--- a/testsuite/wanted-results/parallel-local-ssh7
+++ b/testsuite/wanted-results/parallel-local-ssh7
@@ -543,6 +543,284 @@ par_sh_env_parallel bug #50435: Remote fifo broke in 20150522
par_sh_env_parallel bug #52534: Tail of multiline alias is ignored
par_sh_env_parallel data from stdin
par_sh_env_parallel data from stdin
+par_mksh_underscore ### mksh
+par_mksh_underscore ### Testing of --env _
+par_mksh_underscore variables in aliases in and arrays in functions work
+par_mksh_underscore variables in aliases in and arrays in functions work
+par_mksh_underscore variables in aliases in and arrays in functions work
+par_mksh_underscore variables in aliases in and arrays in functions work
+par_mksh_underscore variables in aliases in and arrays in functions work
+par_mksh_underscore variables in aliases in and arrays in functions work
+par_mksh_underscore /bin/mksh: not_copied_alias: not found
+par_mksh_underscore /bin/mksh: not_copied_func: not found
+par_mksh_underscore error=OK
+par_mksh_underscore error=OK
+par_mksh_underscore aliases in and arrays in functions work
+par_mksh_underscore aliases in and arrays in functions work
+par_mksh_underscore aliases in functions work
+par_mksh_underscore aliases in functions work
+par_mksh_underscore aliases in functions work
+par_mksh_underscore OK if no myecho ^^^^^^^^^^^^^^^^^
+par_mksh_underscore aliases in functions work
+par_mksh_underscore OK if no myecho ^^^^^^^^^^^^^^^^^
+par_mksh_underscore /bin/mksh: myfunc: not found
+par_mksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^
+par_mksh_underscore /bin/mksh: myfunc: not found
+par_mksh_underscore OK if no myfunc ^^^^^^^^^^^^^^^^^
+par_mksh_parset parset
+par_mksh_parset ### parset into array
+par_mksh_parset foo bar baz
+par_mksh_parset ### parset into vars with comma
+par_mksh_parset foo bar baz
+par_mksh_parset ### parset into vars with space
+par_mksh_parset foo bar baz
+par_mksh_parset ### parset with newlines
+par_mksh_parset 1
+par_mksh_parset 1
+par_mksh_parset 2
+par_mksh_parset 1
+par_mksh_parset 2
+par_mksh_parset 3
+par_mksh_parset ### parset into indexed array vars
+par_mksh_parset foo bar baz
+par_mksh_parset foo bar baz
+par_mksh_parset ### env_parset
+par_mksh_parset myecho myvar myarr 1 myfun foo myecho myvar myarr 1 myfun bar myecho myvar myarr 1 myfun baz
+par_mksh_parset myecho myvar myarr 1 myfun foo myecho myvar myarr 1 myfun bar myecho myvar myarr 1 myfun baz
+par_mksh_parset
+par_mksh_parset newline1
+par_mksh_parset newline2
+par_mksh_parset 1
+par_mksh_parset newline1
+par_mksh_parset newline2
+par_mksh_parset 1
+par_mksh_parset 2
+par_mksh_parset newline1
+par_mksh_parset newline2
+par_mksh_parset 1
+par_mksh_parset 2
+par_mksh_parset 3
+par_mksh_parset myecho myvar myarr 1 myfun foo myecho myvar myarr 1 myfun bar myecho myvar myarr 1 myfun baz
+par_mksh_parset myecho myvar myarr 1 myfun foo myecho myvar myarr 1 myfun bar myecho myvar myarr 1 myfun baz
+par_mksh_man ### mksh
+par_mksh_man ### From man env_parallel
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man multiline
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man env_parallel: Warning: Alias "multiline" contains newline.
+par_mksh_man env_parallel: Warning: Make sure the command has at least one newline after "multiline".
+par_mksh_man env_parallel: Warning: See BUGS in "man env_parallel".
+par_mksh_man multiline
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man env_parallel: Warning: Alias "multiline" contains newline.
+par_mksh_man env_parallel: Warning: Make sure the command has at least one newline after "multiline".
+par_mksh_man env_parallel: Warning: See BUGS in "man env_parallel".
+par_mksh_man multiline
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man env_parallel: Warning: Alias "multiline" contains newline.
+par_mksh_man env_parallel: Warning: Make sure the command has at least one newline after "multiline".
+par_mksh_man env_parallel: Warning: See BUGS in "man env_parallel".
+par_mksh_man multiline
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man env_parallel: Warning: Alias "multiline" contains newline.
+par_mksh_man env_parallel: Warning: Make sure the command has at least one newline after "multiline".
+par_mksh_man env_parallel: Warning: See BUGS in "man env_parallel".
+par_mksh_man multiline
+par_mksh_man aliases with = & " ! ' work
+par_mksh_man functions with = & " ! ' work
+par_mksh_man functions with = & " ! ' work
+par_mksh_man functions with = & " ! ' work
+par_mksh_man functions with = & " ! ' work
+par_mksh_man functions with = & " ! ' work
+par_mksh_man variables with = & " ! ' work
+par_mksh_man variables with = & " ! ' work
+par_mksh_man variables with = & " ! ' work
+par_mksh_man variables with = & " ! ' work
+par_mksh_man variables with = & " ! ' work
+par_mksh_man multiline
+par_mksh_man variables with = & " ! ' work
+par_mksh_man multiline
+par_mksh_man variables with = & " ! ' work
+par_mksh_man multiline
+par_mksh_man variables with = & " ! ' work
+par_mksh_man multiline
+par_mksh_man variables with = & " ! ' work
+par_mksh_man multiline
+par_mksh_man variables with = & " ! ' work
+par_mksh_man arrays with = & " ! ' work, too
+par_mksh_man arrays
+par_mksh_man with = & " ! '
+par_mksh_man work,
+par_mksh_man too
+par_mksh_man arrays
+par_mksh_man with = & " ! '
+par_mksh_man work,
+par_mksh_man too
+par_mksh_man arrays
+par_mksh_man with = & " ! '
+par_mksh_man work,
+par_mksh_man too
+par_mksh_man arrays
+par_mksh_man with = & " ! '
+par_mksh_man work,
+par_mksh_man too
+par_mksh_man exit value 2 should be 2
+par_mksh_man Unknown option: no-such-option
+par_mksh_man exit value 255 should be 255
+par_mksh_funky
+par_mksh_funky \\\\\\\\
+par_mksh_funky
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky
+par_mksh_funky
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~-funky
+par_mksh_funky space 6
+par_mksh_funky space 6
+par_mksh_funky 3 arg alias_works
+par_mksh_funky 3 arg alias_works_over_ssh
+par_mksh_funky Funky-
+par_mksh_funky Funky-
+par_mksh_funky \\\
\\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+par_mksh_funky function_works
+par_mksh_funky function_works_over_ssh
+par_mksh_funky myvar works
+par_mksh_funky myvar works
+par_mksh_environment_too_big bug #50815: env_parallel should warn if the environment is too big
+par_mksh_environment_too_big OK_bigvar
+par_mksh_environment_too_big OK_bigvar_remote
+par_mksh_environment_too_big OK_bigvar_quote
+par_mksh_environment_too_big OK_bigvar_quote_remote
+par_mksh_environment_too_big OK_bigfunc
+par_mksh_environment_too_big OK_bigfunc_remote
+par_mksh_environment_too_big OK_bigfunc_quote
+par_mksh_environment_too_big OK_bigfunc_quote_remote
+par_mksh_environment_too_big Rest should fail
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_environment_too_big mksh: /usr/bin/perl: Argument list too long
+par_mksh_environment_too_big env_parallel: Error: Your environment is too big.
+par_mksh_environment_too_big env_parallel: Error: You can try 3 different approaches:
+par_mksh_environment_too_big env_parallel: Error: 1. Run 'env_parallel --session' before you set
+par_mksh_environment_too_big env_parallel: Error: variables or define functions.
+par_mksh_environment_too_big env_parallel: Error: 2. Use --env and only mention the names to copy.
+par_mksh_environment_too_big env_parallel: Error: 3. Try running this in a clean environment once:
+par_mksh_environment_too_big env_parallel: Error: env_parallel --record-env
+par_mksh_environment_too_big env_parallel: Error: And then use '--env _'
+par_mksh_environment_too_big env_parallel: Error: For details see: man env_parallel
+par_mksh_env_parallel_session ### Test env_parallel --session
+par_mksh_env_parallel_session /bin/mksh: aliasbefore: not found
+par_mksh_env_parallel_session /bin/mksh: aliasbefore: not found
+par_mksh_env_parallel_session /bin/mksh: funcbefore: not found
+par_mksh_env_parallel_session /bin/mksh: funcbefore: not found
+par_mksh_env_parallel_session no_before
+par_mksh_env_parallel_session no_before
+par_mksh_env_parallel_session no_before
+par_mksh_env_parallel_session no_before
+par_mksh_env_parallel_session after aliasafter_OK
+par_mksh_env_parallel_session after aliasafter_OK
+par_mksh_env_parallel_session after funcafter_OK
+par_mksh_env_parallel_session after funcafter_OK
+par_mksh_env_parallel_session after varafter_OK
+par_mksh_env_parallel_session after varafter_OK
+par_mksh_env_parallel_session array after arrayafter_OK
+par_mksh_env_parallel_session array after arrayafter_OK
+par_mksh_env_parallel OK
+par_mksh_env_parallel OK
+par_mksh_env_parallel alias line 1
+par_mksh_env_parallel alias line 1
+par_mksh_env_parallel alias line 2
+par_mksh_env_parallel alias line 2
+par_mksh_env_parallel alias line 3
+par_mksh_env_parallel alias line 3
+par_mksh_env_parallel alias2 line 1
+par_mksh_env_parallel alias2 line 1
+par_mksh_env_parallel alias2 line 2
+par_mksh_env_parallel alias2 line 2
+par_mksh_env_parallel bug #50435: Remote fifo broke in 20150522
+par_mksh_env_parallel bug #52534: Tail of multiline alias is ignored
+par_mksh_env_parallel data from stdin
+par_mksh_env_parallel data from stdin
+par_mksh_env_parallel env_parallel: Warning: Alias "myalias" contains newline.
+par_mksh_env_parallel env_parallel: Warning: Alias "myalias" contains newline.
+par_mksh_env_parallel env_parallel: Warning: Alias "myalias2" contains newline.
+par_mksh_env_parallel env_parallel: Warning: Alias "myalias2" contains newline.
+par_mksh_env_parallel env_parallel: Warning: Make sure the command has at least one newline after "myalias".
+par_mksh_env_parallel env_parallel: Warning: Make sure the command has at least one newline after "myalias".
+par_mksh_env_parallel env_parallel: Warning: Make sure the command has at least one newline after "myalias2".
+par_mksh_env_parallel env_parallel: Warning: Make sure the command has at least one newline after "myalias2".
+par_mksh_env_parallel env_parallel: Warning: See BUGS in "man env_parallel".
+par_mksh_env_parallel env_parallel: Warning: See BUGS in "man env_parallel".
+par_mksh_env_parallel env_parallel: Warning: See BUGS in "man env_parallel".
+par_mksh_env_parallel env_parallel: Warning: See BUGS in "man env_parallel".
par_ksh_underscore ### ksh
par_ksh_underscore ### Testing of --env _
par_ksh_underscore variables in aliases in and arrays in functions work