env_parallel.tcsh added.

env_parallel.csh now supports variables, aliases, and arrays with no special chars.
This commit is contained in:
Ole Tange 2016-04-14 08:33:58 +02:00
parent 61dca99762
commit 16e3e54dcf
15 changed files with 348 additions and 147 deletions

View file

@ -266,6 +266,8 @@ for Big Data Applications https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumb
* FaceCrop uses GNU Parallel: https://github.com/EderSantana/FaceCrop * FaceCrop uses GNU Parallel: https://github.com/EderSantana/FaceCrop
* GNU parallel 應用範例 http://staypython.blogspot.dk/2016/04/gnu-parallel.html
* Bug fixes and man page updates. * Bug fixes and man page updates.
GNU Parallel - For people who live life in the parallel lane. GNU Parallel - For people who live life in the parallel lane.

View file

@ -1,6 +1,6 @@
bin_SCRIPTS = parallel sql niceload \ bin_SCRIPTS = parallel sql niceload \
env_parallel env_parallel.bash env_parallel.zsh env_parallel.fish \ env_parallel env_parallel.bash env_parallel.zsh env_parallel.fish \
env_parallel.ksh env_parallel.pdksh env_parallel.csh env_parallel.ksh env_parallel.pdksh env_parallel.csh env_parallel.tcsh
install-exec-hook: install-exec-hook:
rm $(DESTDIR)$(bindir)/sem || true rm $(DESTDIR)$(bindir)/sem || true
@ -179,7 +179,7 @@ DISTCLEANFILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
EXTRA_DIST = parallel sem sql niceload env_parallel \ EXTRA_DIST = parallel sem sql niceload env_parallel \
env_parallel.bash env_parallel.zsh env_parallel.fish env_parallel.ksh \ env_parallel.bash env_parallel.zsh env_parallel.fish env_parallel.ksh \
env_parallel.pdksh env_parallel.csh \ env_parallel.pdksh env_parallel.csh env_parallel.tcsh \
sem.pod parallel.pod env_parallel.pod niceload.pod parallel_tutorial.pod \ sem.pod parallel.pod env_parallel.pod niceload.pod parallel_tutorial.pod \
parallel_design.pod \ parallel_design.pod \
$(DISTCLEANFILES) $(DISTCLEANFILES)

View file

@ -219,7 +219,7 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
bin_SCRIPTS = parallel sql niceload \ bin_SCRIPTS = parallel sql niceload \
env_parallel env_parallel.bash env_parallel.zsh env_parallel.fish \ env_parallel env_parallel.bash env_parallel.zsh env_parallel.fish \
env_parallel.ksh env_parallel.pdksh env_parallel.csh env_parallel.ksh env_parallel.pdksh env_parallel.csh env_parallel.tcsh
@DOCUMENTATION_TRUE@man_MANS = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \ @DOCUMENTATION_TRUE@man_MANS = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
@DOCUMENTATION_TRUE@ parallel_tutorial.7 parallel_design.7 @DOCUMENTATION_TRUE@ parallel_tutorial.7 parallel_design.7
@ -242,7 +242,7 @@ DISTCLEANFILES = parallel.1 env_parallel.1 sem.1 sql.1 niceload.1 \
EXTRA_DIST = parallel sem sql niceload env_parallel \ EXTRA_DIST = parallel sem sql niceload env_parallel \
env_parallel.bash env_parallel.zsh env_parallel.fish env_parallel.ksh \ env_parallel.bash env_parallel.zsh env_parallel.fish env_parallel.ksh \
env_parallel.pdksh env_parallel.csh \ env_parallel.pdksh env_parallel.csh env_parallel.tcsh \
sem.pod parallel.pod env_parallel.pod niceload.pod parallel_tutorial.pod \ sem.pod parallel.pod env_parallel.pod niceload.pod parallel_tutorial.pod \
parallel_design.pod \ parallel_design.pod \
$(DISTCLEANFILES) $(DISTCLEANFILES)

View file

@ -46,7 +46,11 @@ pdksh: Put this in $HOME/.profile: source `which env_parallel.pdksh`
csh: Put this in $HOME/.cshrc: source `which env_parallel.csh` csh: Put this in $HOME/.cshrc: source `which env_parallel.csh`
E.g. by doing: echo 'source `which env_parallel.csh`' >> $HOME/.cshrc E.g. by doing: echo 'source `which env_parallel.csh`' >> $HOME/.cshrc
Supports: aliases Supports: aliases, variables, arrays with no special chars
tcsh: Put this in $HOME/.tcshrc: source `which env_parallel.tcsh`
E.g. by doing: echo 'source `which env_parallel.tcsh`' >> $HOME/.tcshrc
Supports: aliases, variables, arrays with no special chars
For details: see man env_parallel For details: see man env_parallel

View file

@ -25,4 +25,70 @@
# 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
alias env_parallel 'setenv PARALLEL_ENV "`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;`";parallel \!*; setenv PARALLEL_ENV' if ("`alias env_parallel`" == '') then
# Activate alias
alias env_parallel 'setenv PARALLEL "\!*"; source `which env_parallel.csh`'
else
# Get the scalar and array variable names
set _vARnAmES=(`set | awk -e '{print $1}' |grep -v prompt2`)
# 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;
end
# 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
# ALIAS TO EXPORT ALIASES:
# Quote ' by putting it inside "
# s/'/'"'"'/g;
# ' => \047 " => \042
# s/\047/\047\042\047\042\047/g;
# 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/\;
# Add ' around second column
# s/^(\S+)(\s+)(.*)/\1\2'\3'/
# \047 => '
# s/^(\S+)(\s+)(.*)/\1\2\047\3\047/;
# Quoted: s/\^\(\\S+\)\(\\s+\)\(.\*\)/\\1\\2\\047\\3\\047/\;
# Quote ! as \!
# s/\!/\\\!/g;
# Quoted: s/\\\!/\\\\\\\!/g;
# 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
setenv PARALLEL_ENV "`cat $_tMpaLLfILe; rm $_tMpaLLfILe`";
unset _tMpaLLfILe;
# Use $PARALLEL set in calling alias
parallel
setenv PARALLEL_ENV
setenv PARALLEL
endif
# Tested working for aliases
# alias env_parallel 'setenv PARALLEL_ENV "`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;`";parallel \!*; setenv PARALLEL_ENV'

View file

@ -75,6 +75,8 @@ function env_parallel
$val=~s/'"'"'/\\\$&/go; $val=~s/'"'"'/\\\$&/go;
# Quote newline as '\n' # Quote newline as '\n'
$val =~ s/[\n]/\\\n/go; $val =~ s/[\n]/\\\n/go;
# Empty => 2 single quotes = \047\047
$val=~s/^$/\047\047/o;
if($name ne $last and $last) { if($name ne $last and $last) {
# The $name is different, so this is a new variable. # The $name is different, so this is a new variable.
# Print the last one. # Print the last one.

View file

@ -243,6 +243,9 @@ E.g. by doing:
=head2 csh =head2 csh
B<env_parallel> for B<csh> breaks B<$PARALLEL>, so do not use
B<$PARALLEL>.
Installation Installation
Put this in $HOME/.cshrc: Put this in $HOME/.cshrc:
@ -267,15 +270,21 @@ Not supported by B<csh>.
=item variables =item variables
Not supported set myvar=test
env_parallel echo "\$myvar" ::: test
env_parallel -S csh@server echo "\$myvar" ::: test
=item arrays
Not supported =item arrays with no special chars
set myarray=(foo bar baz)
env_parallel echo "\${myarray\[\{\}\]}" ::: 1 2 3
env_parallel -S csh@server echo "\${myarray\[\{\}\]}" ::: 1 2 3
=back =back
=head1 EXIT STATUS =head1 EXIT STATUS
Same as GNU B<parallel>. Same as GNU B<parallel>.

94
src/env_parallel.tcsh Executable file
View file

@ -0,0 +1,94 @@
#!/bin/csh
# This file must be sourced in csh:
#
# source `which env_parallel.csh`
#
# after which 'env_parallel' works
#
#
# Copyright (C) 2016
# 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 <http://www.gnu.org/licenses/>
# or write to the Free Software Foundation, Inc., 51 Franklin St,
# Fifth Floor, Boston, MA 02110-1301 USA
if ("`alias env_parallel`" == '') then
# Activate alias
## alias env_parallel 'setenv PARALLEL "\!*"; source `which env_parallel.csh`'
alias env_parallel 'setenv PARALLEL "\!*"; source /tmp/env_parallel.csh'
else
# Get the scalar and array variable names
set _vARnAmES=(`set | awk -e '{print $1}' |grep -vE '^(_|killring|prompt2)$'`)
# 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;
end
# 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
# ALIAS TO EXPORT ALIASES:
# Quote ' by putting it inside "
# s/'/'"'"'/g;
# ' => \047 " => \042
# s/\047/\047\042\047\042\047/g;
# 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/\;
# Add ' around second column
# s/^(\S+)(\s+)(.*)/\1\2'\3'/
# \047 => '
# s/^(\S+)(\s+)(.*)/\1\2\047\3\047/;
# Quoted: s/\^\(\\S+\)\(\\s+\)\(.\*\)/\\1\\2\\047\\3\\047/\;
# Quote ! as \!
# s/\!/\\\!/g;
# Quoted: s/\\\!/\\\\\\\!/g;
# 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
setenv PARALLEL_ENV "`cat $_tMpaLLfILe; rm $_tMpaLLfILe`";
unset _tMpaLLfILe;
# Use $PARALLEL set in calling alias
parallel
setenv PARALLEL_ENV
setenv PARALLEL
endif
# Tested working for aliases
# alias env_parallel 'setenv PARALLEL_ENV "`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;`";parallel \!*; setenv PARALLEL_ENV'

View file

@ -6865,7 +6865,7 @@ sub wrapped {
$command = "perl -e ". $command = "perl -e ".
::shell_quote_scalar(base64_eval())." ". ::shell_quote_scalar(base64_eval())." ".
join(" ", ::shell_quote( join(" ", ::shell_quote(
string_base64('exec "'. string_base64("exec \"$Global::shell\",'-c',\"".
::perl_quote_scalar($command).'"'))); ::perl_quote_scalar($command).'"')));
} }
$self->{'wrapped'} = $command; $self->{'wrapped'} = $command;

View file

@ -50,6 +50,82 @@ Fixing the problem in B<csh> often breaks it in B<bash>. In these
cases the fix is often to use a small Perl script and call that. cases the fix is often to use a small Perl script and call that.
=head2 env_parallel
B<env_parallel> is a dummy shell script that will run if
B<env_parallel> is not an alias or a function and tell the user how to
activate the alias/function for the supported shells.
The alias or function will copy the current environment and run the
command with GNU B<parallel> in the copy of the environment.
The problem is that you cannot access all of the current environment
inside Perl. E.g. aliases, functions and unexported shell variables.
The idea is therefore to take the environment and put it in
B<$PARALLEL_ENV> which GNU B<parallel> prepends to every command.
The only way to have access to the environment is directly from the
shell, so the program must be written in a shell script that will be
sourced and there has to deal with the dialect of the relevant shell.
Dumping the environment into a format that can be activated again is
easy in Bash: B<typeset> and B<alias> basically give you the commands
you must run to re-create the environment. It is much harder in B<csh>
where there is no easy way to convert an environment into commands
that generate the environment.
=head3 env_parallel.bash / env_parallel.zsh / env_parallel.ksh / env_parallel.pdksh
B<env_parallel.(bash|ksh|pdksh|zsh)> sets the function B<env_parallel>. It uses
B<alias> and B<typeset> to dump the configuration (with a few
exceptions) into B<$PARALLEL_ENV> before running GNU B<parallel>.
After GNU B<parallel> is finished, B<$PARALLEL_ENV> is deleted.
=head3 env_parallel.csh
B<env_parallel.csh> has two purposes: If B<env_parallel> is not an
alias: make it into an alias that sets B<$PARALLEL> with arguments
and calls B<env_parallel.csh>.
If B<env_parallel> is an alias, then B<env_parallel.csh> uses
B<$PARALLEL> as the arguments for GNU B<parallel>.
It exports the environment by writing a variable definition to a file
for each variable. The definitions of aliases are appended to this
file. Finally the file is put into B<$PARALLEL_ENV>.
GNU B<parallel> is then run and B<$PARALLEL_ENV> is deleted.
=head3 env_parallel.fish
First all functions definitions are generated using a loop and
B<functions>.
Dumping the scalar variable definitions is harder.
B<fish> can represent non-printable characters in (at least) 2
ways. To avoid problems all scalars are converted to \XX quoting.
Then commands to generate the definitions are made and separated by
NUL.
This is then piped into a Perl script that quotes all values. List
elements will be appended using two spaces.
Finally \n is converted into \1 because B<fish> variables cannot
contain \n. GNU B<parallel> will later convert all \1 from
B<$PARALLEL_ENV> into \n.
This is then all saved in B<$PARALLEL_ENV>.
GNU B<parallel> is called, and B<$PARALLEL_ENV> is deleted.
=head2 Job slots =head2 Job slots
The easiest way to explain what GNU B<parallel> does is to assume that The easiest way to explain what GNU B<parallel> does is to assume that
@ -64,10 +140,11 @@ been implemented as a stack with lazy evaluation: Draw one from an
empty stack and the stack is extended by one. When a job is done, push empty stack and the stack is extended by one. When a job is done, push
the available job slot back on the stack. the available job slot back on the stack.
This implementation also means that if you use remote executions, you This implementation also means that if you re-run the same jobs, you
cannot assume that a given job slot will remain on the same remote cannot assume jobs will get the same slots. And if you use remote
server. This goes double since number of job slots can be adjusted on executions, you cannot assume that a given job slot will remain on the
the fly (by giving B<--jobs> a file name). same remote server. This goes double since number of job slots can be
adjusted on the fly (by giving B<--jobs> a file name).
=head2 Rsync protocol version =head2 Rsync protocol version
@ -84,12 +161,13 @@ B<rsync>s to talk to version 2.5.7.
=head2 Compression =head2 Compression
B<--compress> compresses the data in the temporary files. This is a GNU B<parallel> buffers output in temporary files. B<--compress>
bit tricky because there should be no files to clean up if GNU compresses the buffered data. This is a bit tricky because there
B<parallel> is killed by a power outage. should be no files to clean up if GNU B<parallel> is killed by a power
outage.
GNU B<parallel> first selects a compression program. If the user has not GNU B<parallel> first selects a compression program. If the user has not
selected one, the first of these that are in $PATH is used: B<lz4 pigz selected one, the first of these that is in $PATH is used: B<lz4 pigz
lzop plzip pbzip2 pxz gzip lzma xz bzip2 lzip>. They are sorted by lzop plzip pbzip2 pxz gzip lzma xz bzip2 lzip>. They are sorted by
speed on a 16 core machine. speed on a 16 core machine.
@ -133,16 +211,17 @@ Local: B<setpriority(0,0,$nice)>
=item --cat =item --cat
cat > {}; I<input> {}; cat > {}; <<command>> {};
perl -e '$bash = shift; perl -e '$bash = shift;
$csh = shift; $csh = shift;
for(@ARGV) { unlink;rmdir; } for(@ARGV) { unlink;rmdir; }
if($bash =~ s/h//) { exit $bash; } if($bash =~ s/h//) { exit $bash; }
exit $csh;' "$?h" "$status" {}; exit $csh;' "$?h" "$status" {};
{} is set to $PARALLEL_TMP which is a tmpfile. The Perl script saves {} is set to B<$PARALLEL_TMP> which is a tmpfile. The Perl script
the exit value, unlinks the tmpfile, and returns the exit value - no saves the exit value, unlinks the tmpfile, and returns the exit value
matter if the shell is B<bash> (using $?) or B<*csh> (using $status). - no matter if the shell is B<bash>/B<ksh>/B<zsh> (using $?) or
B<*csh>/B<fish> (using $status).
=item --fifo =item --fifo
@ -161,35 +240,38 @@ matter if the shell is B<bash> (using $?) or B<*csh> (using $status).
waitpid $pid,0; waitpid $pid,0;
# Cleanup # Cleanup
unlink $f; unlink $f;
exit $?/256;' I<shell> I<input> $PARALLEL_TMP exit $?/256;' <<shell>> -c <<command>> $PARALLEL_TMP
This is an elaborate way of: mkfifo {}; run I<input> in the This is an elaborate way of: mkfifo {}; run I<<<command>>> in the
background using I<shell>; copying STDIN to {}; waiting for background background using I<<<shell>>>; copying STDIN to {}; waiting for background
to complete; remove {} and exit with the exit code from I<input>. to complete; remove {} and exit with the exit code from I<<<command>>>.
It is made this way to be compatible with B<*csh>. It is made this way to be compatible with B<*csh>/B<fish>.
=item --pipepart =item --pipepart
< file perl -e 'while(@ARGV) { < <<file>> perl -e 'while(@ARGV) {
sysseek(STDIN,shift,0) || die; sysseek(STDIN,shift,0) || die;
$left = shift; $left = shift;
while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){
$left -= $read; $left -= $read;
syswrite(STDOUT,$buf); syswrite(STDOUT,$buf);
} }
}' startposition length }' <<startposition>> <<length>>
This will read I<length> bytes from I<file> starting at This will read I<<<length>>> bytes from I<<<file>>> starting at
I<startposition> and send it to STDOUT. I<<<startposition>>> and send it to STDOUT.
=item --sshlogin I<sln> =item --sshlogin I<sln>
ssh I<sln> I<shell quoted input> ssh I<sln> I<shell quoted command>
Where I<sln> is the sshlogin and I<shell quoted command> is the
command quoted so it will be passed to the server.
=item --transfer =item --transfer
( ssh I<sln> mkdir -p ./I<workdir>;rsync --protocol 30 -rlDzR -essh ./{} I<sln>:./I<workdir> ); I<input> ( ssh I<sln> mkdir -p ./I<workdir>;rsync --protocol 30 -rlDzR -essh ./{} I<sln>:./I<workdir> ); I<<<command>>>
Read about B<--protocol 30> in the section B<Rsync protocol version>. Read about B<--protocol 30> in the section B<Rsync protocol version>.
@ -203,7 +285,7 @@ Read about B<--protocol 30> in the section B<Rsync protocol version>.
=item --return I<file> =item --return I<file>
I<input>; _EXIT_status=$?; mkdir -p I<workdir>; rsync --protocol 30 --rsync-path=cd\ ./I<workdir>\;\ rsync -rlDzR -essh I<sln>:./I<file> ./I<workdir>; exit $_EXIT_status; I<<<command>>>; _EXIT_status=$?; mkdir -p I<<<workdir>>>; rsync --protocol 30 --rsync-path=cd\ ./I<<<workdir>>>\;\ rsync -rlDzR -essh I<<<sln>>>:./I<<<file>>> ./I<<<workdir>>>; exit $_EXIT_status;
The B<--rsync-path=cd ...> is needed because old versions of B<rsync> The B<--rsync-path=cd ...> is needed because old versions of B<rsync>
do not support B<--no-implied-dirs>. do not support B<--no-implied-dirs>.
@ -214,7 +296,7 @@ wrapping 'sh -c' is enough?
=item --cleanup =item --cleanup
I<input> _EXIT_status=$?; <<return>> I<<<command>>> _EXIT_status=$?; <<return>>;
ssh I<sln> \(rm\ -f\ ./I<workdir>/{}\;\ rmdir\ ./I<workdir>\ \>\&/dev/null\;\); exit $_EXIT_status; ssh I<sln> \(rm\ -f\ ./I<workdir>/{}\;\ rmdir\ ./I<workdir>\ \>\&/dev/null\;\); exit $_EXIT_status;

View file

@ -90,6 +90,7 @@ echo '### Test tmux works on different shells'
stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?' | grep -v 'See output'; stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?' | grep -v 'See output';
stdout ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output';
stdout ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output';
echo "# command is currently too long for csh. Maybe it can be fixed?";
stdout ssh csh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh csh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output';
stdout ssh csh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output' stdout ssh csh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
@ -131,7 +132,7 @@ echo "### Bash environment"
#stdout ssh -t lo <<'EOS' #stdout ssh -t lo <<'EOS'
myvar="myvar works" myvar="myvar works"
funky=$(perl -e 'print pack "c*", 1..255') funky=$(perl -e 'print pack "c*", 1..255')
myarray=('' array_val2 3 '' 5) myarray=('' array_val2 3 '' 5 ' space 6 ')
declare -A assocarr declare -A assocarr
assocarr[a]=assoc_val_a assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b assocarr[b]=assoc_val_b
@ -139,7 +140,7 @@ alias alias_echo="echo 3 arg";
func_echo() { func_echo() {
echo $*; echo $*;
echo "$myvar" echo "$myvar"
echo ${myarray[1]} echo "${myarray[5]}"
echo ${assocarr[a]} echo ${assocarr[a]}
echo Funky-"$funky"-funky echo Funky-"$funky"-funky
} }
@ -158,7 +159,7 @@ echo "### Zsh environment"
stdout ssh -q zsh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates' stdout ssh -q zsh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates'
myvar="myvar works" myvar="myvar works"
funky=$(perl -e 'print pack "c*", 1..255') funky=$(perl -e 'print pack "c*", 1..255')
myarray=('' array_val2 3 '' 5) myarray=('' array_val2 3 '' 5 ' space 6 ')
declare -A assocarr declare -A assocarr
assocarr[a]=assoc_val_a assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b assocarr[b]=assoc_val_b
@ -166,7 +167,7 @@ alias alias_echo="echo 3 arg";
func_echo() { func_echo() {
echo $*; echo $*;
echo "$myvar" echo "$myvar"
echo $myarray[2] echo "$myarray[6]"
echo ${assocarr[a]} echo ${assocarr[a]}
echo Funky-"$funky"-funky echo Funky-"$funky"-funky
} }
@ -186,7 +187,7 @@ echo "### Ksh environment"
stdout ssh -q ksh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates' stdout ssh -q ksh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates'
myvar="myvar works" myvar="myvar works"
funky=$(perl -e 'print pack "c*", 1..255') funky=$(perl -e 'print pack "c*", 1..255')
myarray=('' array_val2 3 '' 5) myarray=('' array_val2 3 '' 5 ' space 6 ')
typeset -A assocarr typeset -A assocarr
assocarr[a]=assoc_val_a assocarr[a]=assoc_val_a
assocarr[b]=assoc_val_b assocarr[b]=assoc_val_b
@ -195,7 +196,7 @@ alias alias_echo="echo 3 arg";
func_echo() { func_echo() {
echo $*; echo $*;
echo "$myvar" echo "$myvar"
echo ${myarray[1]} echo "${myarray[5]}"
echo ${assocarr[a]} echo ${assocarr[a]}
echo Funky-"$funky"-funky echo Funky-"$funky"-funky
} }
@ -217,7 +218,8 @@ setenv myenvvar "myenvvar works"
set funky (perl -e 'print pack "c*", 1..255') set funky (perl -e 'print pack "c*", 1..255')
setenv funkyenv (perl -e 'print pack "c*", 1..255') setenv funkyenv (perl -e 'print pack "c*", 1..255')
set myarray '' array_val2 3 '' 5 set myarray '' array_val2 3 '' 5 ' space 6 '
# Assoc arrays do not exist # Assoc arrays do not exist
#typeset -A assocarr #typeset -A assocarr
#assocarr[a]=assoc_val_a #assocarr[a]=assoc_val_a
@ -228,14 +230,14 @@ function func_echo
echo $argv; echo $argv;
echo "$myvar" echo "$myvar"
echo "$myenvvar" echo "$myenvvar"
echo $myarray[2] echo "$myarray[6]"
# Assoc arrays do not exist in fish # Assoc arrays do not exist in fish
# echo ${assocarr[a]} # echo ${assocarr[a]}
echo echo
echo echo
echo echo
echo Funky-"$funky"-funky echo Funky-"$funky"-funky
echo Funky-"$funkyenv"-funky echo Funkyenv-"$funkyenv"-funkyenv
echo echo
echo echo
echo echo
@ -251,23 +253,15 @@ EOS
echo echo
echo "### csh environment" echo "### csh environment"
# http://hyperpolyglot.org/unix-shells
# makealias:
# alias quote "/bin/sed -e 's/\\!/\\\\\!/g' -e 's/'\\\''/'\\\'\\\\\\\'\\\''/g' -e 's/^/'\''/' -e 's/"\$"/'\''/'"
# alias makealias "quote | /bin/sed 's/^/alias \!:1 /' \!:2*"
#
# makealias_with_newline
# perl -e '$/=undef;$_=<>;s/\n/\\\n/g;s/\047/\047\042\047\042\047/g;print'
stdout ssh -q csh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates' stdout ssh -q csh@lo <<'EOS' | egrep -v 'Welcome to |packages can be updated|security updates'
set myvar = "myvar works" set myvar = "myvar works"
set funky = "`perl -e 'print pack q(c*), 1..255'`" set funky = "`perl -e 'print pack q(c*), 2..255'`"
set myarray = ('' 'array_val2' '3' '' '5') set myarray = ('' 'array_val2' '3' '' '5' ' space 6 ')
#declare -A assocarr #declare -A assocarr
#assocarr[a]=assoc_val_a #assocarr[a]=assoc_val_a
#assocarr[b]=assoc_val_b #assocarr[b]=assoc_val_b
alias alias_echo echo 3 arg; alias alias_echo echo 3 arg;
alias alias_echo_var 'echo $argv; echo $myvar; echo ${myarray[2]}; echo Funky-"$funky"-funky' alias alias_echo_var 'echo $argv; echo "$myvar"; echo "${myarray[4]} special chars problem"; echo Funky-"$funky"-funky'
#function func_echo #function func_echo
# echo $argv; # echo $argv;
@ -277,80 +271,11 @@ alias alias_echo_var 'echo $argv; echo $myvar; echo ${myarray[2]}; echo Funky-"$
# echo Funky-"$funky"-funky # echo Funky-"$funky"-funky
#end #end
# ALIAS TO EXPORT ALIASES:
# Quote ' by putting it inside "
# s/'/'"'"'/g;
# ' => \047 " => \042
# s/\047/\047\042\047\042\047/g;
# 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/\;
# Add ' around second column
# s/^(\S+)(\s+)(.*)/\1\2'\3'/
# \047 => '
# s/^(\S+)(\s+)(.*)/\1\2\047\3\047/;
# Quoted: s/\^\(\\S+\)\(\\s+\)\(.\*\)/\\1\\2\\047\\3\\047/\;
# Quote ! as \!
# s/\!/\\\!/g;
# Quoted: s/\\\!/\\\\\\\!/g;
# Prepend with "\nalias "
# s/^/\001alias /;
# Quoted: s/\^/\\001alias\ /\;
#!# alias env_parallel 'setenv PARALLEL_ENV "`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;`";parallel \!*; setenv PARALLEL_ENV'
## set tmpfile=`tempfile`
## foreach v (`set | awk -e '{print $1}' |grep -v prompt2`);
## eval if'($?'$v' && ${#'$v'} <= 1) echo scalar'$v'="$'$v'"' >> $tmpfile;
## eval if'($?'$v' && ${#'$v'} > 1) echo array'$v'="$'$v'"' >> $tmpfile;
## end
## cat $tmpfile | parallel --shellquote | perl -pe 's/^scalar(\S+).=/set $1=/ or s/^array(\S+).=(.*)/set $1=($2)/ && s/\\ / /g;'; rm $tmpfile
##
## set tmpfile=`tempfile`
## foreach _vARnAmE (`set | awk -e '{print $1}' |grep -v prompt2`);
## eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} <= 1) echo scalar'$_vARnAmE'="$'$_vARnAmE'"' >> $tmpfile; eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} > 1) echo array'$_vARnAmE'="$'$_vARnAmE'"' >> $tmpfile;
## end
## cat $tmpfile | parallel --shellquote | perl -pe 's/^scalar(\S+).=/set $1=/ or s/^array(\S+).=(.*)/set $1=($2)/ && s/\\ / /g;'; rm $tmpfile; unset tmpfile
##
## #!/bin/csh
##
## set _tmpfile=`tempfile`;
## foreach _vARnAmE (`set | awk -e '{print $1}' |grep -Ev 'prompt2|_tmpfile'`);
## eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} <= 1) echo scalar'$_vARnAmE'="$'$_vARnAmE'"' >> $_tmpfile;
## eval if'($?'$_vARnAmE' && ${#'$_vARnAmE'} > 1) echo array'$_vARnAmE'="$'$_vARnAmE'"' >> $_tmpfile;
## end
## setenv PARALLEL_ENV `cat $_tmpfile | parallel --shellquote | perl -pe 's/^scalar(\S+).=/set $1=/ or s/^array(\S+).=(.*)/set $1=($2)/ && s/\\ / /g; s/$/\001/';`
## rm $_tmpfile;
## unset _tmpfile
##
## setenv PARALLEL_ENV "$PARALLEL_ENV`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;`"
## parallel \!*
## setenv PARALLEL_ENV
##
##
## perl -e '$/=undef;$_=<>;s/\n/\\\\\n/g;s/\047/\047\042\047\042\047/g;print "eval \047$_\047"'
##
## foreach g (h i j)
## echo $g
## end
##
##
env_parallel alias_echo ::: alias_works env_parallel alias_echo ::: alias_works
env_parallel alias_echo_var ::: alias_var_does_not_work env_parallel alias_echo_var ::: alias_var_works
env_parallel func_echo ::: function_does_not_work env_parallel func_echo ::: function_does_not_work
env_parallel -S csh@lo alias_echo ::: alias_works_over_ssh env_parallel -S csh@lo alias_echo ::: alias_works_over_ssh
env_parallel -S csh@lo alias_echo_var ::: alias_var_does_not_work env_parallel -S csh@lo alias_echo_var ::: alias_var_works_over_ssh
env_parallel -S csh@lo func_echo ::: function_does_not_work_over_ssh env_parallel -S csh@lo func_echo ::: function_does_not_work_over_ssh
echo echo
echo "$funky" | parallel --shellquote echo "$funky" | parallel --shellquote

View file

@ -66,7 +66,7 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' ../../src/
# Due to order is often mixed up # Due to order is often mixed up
s/echo \d; exit \d\n/echo X; exit X\n/; s/echo \d; exit \d\n/echo X; exit X\n/;
# Race condition causes outdir to sometime exist # Race condition causes outdir to sometime exist
s/(std(out|err):) Permission denied/$1 No such file or directory/; s/(std(out|err)|seq): Permission denied/$1: No such file or directory/;
' '
# 3+3 .par files (from --files), 1 .tms-file from tmux attach # 3+3 .par files (from --files), 1 .tms-file from tmux attach
find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | wc -l find {$TMPDIR,/var/tmp,/tmp}/{fif,tms,par[^a]}* -mmin -10 2>/dev/null | wc -l

View file

@ -175,7 +175,7 @@ pod2pdf --output-file ./parallel_design.pdf ./parallel_design.pod --title "GNU P
Warning: pod2pdf not found. Using old parallel_design.pdf Warning: pod2pdf not found. Using old parallel_design.pdf
make[0]: Entering directory `/tmp/parallel-00000000/src' make[0]: Entering directory `/tmp/parallel-00000000/src'
/bin/mkdir -p '/usr/local/bin' /bin/mkdir -p '/usr/local/bin'
/usr/bin/install -c parallel sql niceload env_parallel env_parallel.bash env_parallel.zsh env_parallel.fish env_parallel.ksh env_parallel.pdksh env_parallel.csh '/usr/local/bin' /usr/bin/install -c parallel sql niceload env_parallel env_parallel.bash env_parallel.zsh env_parallel.fish env_parallel.ksh env_parallel.pdksh env_parallel.csh env_parallel.tcsh '/usr/local/bin'
make install-exec-hook make install-exec-hook
make[0]: Entering directory `/tmp/parallel-00000000/src' make[0]: Entering directory `/tmp/parallel-00000000/src'
rm /usr/local/bin/sem || true rm /usr/local/bin/sem || true

View file

@ -81,14 +81,23 @@ echo '### Test tmux works on different shells'
0 0
(stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?) | grep -v 'See output'; (stdout parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux false ::: 1 2 3 4; echo $?) | grep -v 'See output';
4 4
export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; stdout ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?' | grep -v 'See output'; stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh csh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh csh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output' export PARTMUX='parallel -Scsh@lo,tcsh@lo,parallel@lo,zsh@lo --tmux '; stdout ssh zsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh zsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh parallel@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $?' | grep -v 'See output'; stdout ssh parallel@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $?' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh tcsh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'; echo "# command is currently too long for csh. Maybe it can be fixed?"; stdout ssh csh@lo "$PARTMUX" 'true ::: 1 2 3 4; echo $status' | grep -v 'See output'; stdout ssh csh@lo "$PARTMUX" 'false ::: 1 2 3 4; echo $status' | grep -v 'See output'
0 0
4 4
0 0
4 4
0 0
4 4
0 # command is currently too long for csh. Maybe it can be fixed?
Word too long.
Word too long.
Word too long.
Word too long.
4
Word too long.
Word too long.
Word too long.
Word too long.
4 4
echo '### works' echo '### works'
### works ### works
@ -133,7 +142,7 @@ Test env_parallel:
3 arg alias_works 3 arg alias_works
function_works function_works
myvar works myvar works
array_val2 space 6
assoc_val_a assoc_val_a
Funky- Funky-
@ -143,7 +152,7 @@ Funky-
3 arg alias_works_over_ssh 3 arg alias_works_over_ssh
function_works_over_ssh function_works_over_ssh
myvar works myvar works
array_val2 space 6
assoc_val_a assoc_val_a
Funky- Funky-
@ -162,7 +171,7 @@ Funky-
zsh:130: command not found: alias_echo zsh:130: command not found: alias_echo
function_works function_works
myvar works myvar works
array_val2 space 6
assoc_val_a assoc_val_a
Funky- Funky-
 
@ -170,7 +179,7 @@ Funky-
zsh:130: command not found: alias_echo zsh:130: command not found: alias_echo
function_works_over_ssh function_works_over_ssh
myvar works myvar works
array_val2 space 6
assoc_val_a assoc_val_a
Funky- Funky-
 
@ -187,14 +196,14 @@ Funky-
3 arg alias_works 3 arg alias_works
function_works function_works
myvar works myvar works
array_val2 space 6
assoc_val_a assoc_val_a
Funky- Funky-
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
3 arg alias_works_over_ssh 3 arg alias_works_over_ssh
function_works_over_ssh function_works_over_ssh
myvar works myvar works
array_val2 space 6
assoc_val_a assoc_val_a
Funky- Funky-
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
@ -215,12 +224,12 @@ env_parallel: Warning: ASCII value 1 in variables is not supported
function_works function_works
myvar works myvar works
myenvvar works myenvvar works
3 space 6
Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
@ -232,12 +241,12 @@ env_parallel: Warning: ASCII value 1 in variables is not supported
function_works_over_ssh function_works_over_ssh
myvar works myvar works
myenvvar works myenvvar works
3 space 6
Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky
Funky-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky Funkyenv-   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funkyenv
@ -253,9 +262,13 @@ Warning: no access to tty (Bad file descriptor).
Thus no job control in this shell. Thus no job control in this shell.
3 arg alias_works 3 arg alias_works
myvar: Undefined variable. myvar works
space special chars problem
Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky alias_var_works
func_echo: Command not found. func_echo: Command not found.
3 arg alias_works_over_ssh 3 arg alias_works_over_ssh
myvar: Undefined variable. myvar works
space special chars problem
Funky-  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€亗儎厗噲墛媽崕彁憭摂晼棙櫄洔潪煚、¥ウЖ┆<D096><E29486><EFBFBD>辈炒刀犯购患骄坷谅媚牌侨墒颂臀闲岩釉罩棕仝圮蒉哙徕沅彐玷殛腱眍镳耱篝貊鼬<E8B28A><E9BCAC><EFBFBD><EFBFBD>-funky alias_var_works_over_ssh
func_echo: Command not found. func_echo: Command not found.
\\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96> \\\\\\\\ \ \ \ \ \\\\\\\\\\\\\\ \!\"\#\$%\&\'\(\)\*+,-./0123456789:\;\<\=\>\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]\^_\`abcdefghijklmnopqrstuvwxyz\{\|\}\~€乗俓僜刓匼哱嘰圽塡奬媆孿峔嶾廫怽慭抃揬擻昞朶梊榎橽歕沑淺漒瀄焅燶<E78485><E787B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>猏玕琝璡甛痋癨盶瞈砛碶礬禱穃竆筡篭籠糪絓綷縗繺羂耚肻腬臷芢荺萛蒤蔦薥蘚蚛蝄蟎衆裓襖覾診誠謀譢豛賊赲踈躙輁轡運郳醆鈂鉢鋅錦鎈鏫鑌閈闬隲靄韁頫颸餦馶騖骪鬨鮘鯸鱘鳿鵟鶿鸤黒齖㘎<E9BD96>

View file

@ -407,13 +407,13 @@ C
outdir/1/C/seq outdir/1/C/seq
outdir/1/C/stderr outdir/1/C/stderr
outdir/1/C/stdout outdir/1/C/stdout
/bin/bash: outdir/1/A/seq: Permission denied /bin/bash: outdir/1/A/seq: No such file or directory
/bin/bash: line 1: outdir/1/A/stderr: No such file or directory /bin/bash: line 1: outdir/1/A/stderr: No such file or directory
/bin/bash: line 2: outdir/1/A/stdout: No such file or directory /bin/bash: line 2: outdir/1/A/stdout: No such file or directory
/bin/bash: line 3: outdir/1/B/seq: Permission denied /bin/bash: line 3: outdir/1/B/seq: No such file or directory
/bin/bash: line 4: outdir/1/B/stderr: No such file or directory /bin/bash: line 4: outdir/1/B/stderr: No such file or directory
/bin/bash: line 5: outdir/1/B/stdout: No such file or directory /bin/bash: line 5: outdir/1/B/stdout: No such file or directory
/bin/bash: line 6: outdir/1/C/seq: Permission denied /bin/bash: line 6: outdir/1/C/seq: No such file or directory
/bin/bash: line 7: outdir/1/C/stderr: No such file or directory /bin/bash: line 7: outdir/1/C/stderr: No such file or directory
/bin/bash: line 8: outdir/1/C/stdout: No such file or directory /bin/bash: line 8: outdir/1/C/stdout: No such file or directory
parallel --header : --results outdir echo ::: f1 A B ::: f2 C D parallel --header : --results outdir echo ::: f1 A B ::: f2 C D
@ -734,7 +734,11 @@ pdksh: Put this in /home/tange/.profile: source /usr/local/bin/env_parallel.pdk
csh: Put this in /home/tange/.cshrc: source /usr/local/bin/env_parallel.csh csh: Put this in /home/tange/.cshrc: source /usr/local/bin/env_parallel.csh
E.g. by doing: echo 'source /usr/local/bin/env_parallel.csh' >> /home/tange/.cshrc E.g. by doing: echo 'source /usr/local/bin/env_parallel.csh' >> /home/tange/.cshrc
Supports: aliases Supports: aliases, variables, arrays with no special chars
tcsh: Put this in /home/tange/.tcshrc: source /usr/local/bin/env_parallel.tcsh
E.g. by doing: echo 'source /usr/local/bin/env_parallel.tcsh' >> /home/tange/.tcshrc
Supports: aliases, variables, arrays with no special chars
For details: see man env_parallel For details: see man env_parallel