parallel: Better parent_shell detection.

This commit is contained in:
Ole Tange 2018-05-22 21:02:10 +02:00
parent f2b403b7fb
commit 9b2012f021
10 changed files with 237 additions and 188 deletions

View file

@ -1163,12 +1163,12 @@ sub parse_options {
$Global::debug = $opt::D;
$Global::shell = $ENV{'PARALLEL_SHELL'} || parent_shell($$)
|| $ENV{'SHELL'} || "/bin/sh";
if(not which($Global::shell)) {
if(not -x $Global::shell and not which($Global::shell)) {
::error("Shell '$Global::shell' not found.");
wait_and_exit(255);
}
$Global::cshell = $Global::shell =~ m:/csh:;
::debug("init","Global::shell $Global::shell\n");
$Global::cshell = $Global::shell =~ m:(/[-a-z]*)?csh:;
if(defined $opt::X) { $Global::ContextReplace = 1; }
if(defined $opt::silent) { $Global::verbose = 0; }
if(defined $opt::null) { $/ = "\0"; }
@ -2252,7 +2252,7 @@ sub shell_quote_scalar {
# Speed optimization: Choose the correct shell_quote_scalar_*
# and call that directly from now on
no warnings 'redefine';
if($Global::shell =~ m:(^|/)t?csh$:) {
if($Global::cshell) {
# (t)csh
*shell_quote_scalar = \&shell_quote_scalar_csh;
} elsif($Global::shell =~ m:(^|/)rc$:) {
@ -4776,7 +4776,7 @@ sub which {
}
{
my ($regexp,%fakename);
my ($regexp,$shell,%fakename);
sub parent_shell {
# Input:
@ -4784,13 +4784,15 @@ sub which {
# Returns:
# $shellpath = path to shell - undef if no shell found
my $pid = shift;
::debug("init","Parent of $pid\n");
if(not $regexp) {
# All shells known to mankind
#
# ash bash csh dash fdsh fish fizsh ksh ksh93 mksh pdksh
# posh rbash rc rush rzsh sash sh static-sh tcsh yash zsh
my @shells = (qw(ash bash csh dash fdsh fish fizsh ksh
ksh93 lksh mksh pdksh posh rbash rc rush rzsh sash sh
my @shells = (qw(ash bash bsd-csh csh dash fdsh fish fizsh
ksh ksh93 lksh mksh pdksh posh rbash rc rush rzsh sash sh
static-sh tcsh yash zsh -sh -csh -bash),
'-sh (sh)' # sh on FreeBSD
);
@ -4798,26 +4800,50 @@ sub which {
# [sh] -sh sh busybox sh -sh (sh)
# /bin/sh /sbin/sh /opt/csw/sh
# But not: foo.sh sshd crash flush pdflush scosh fsflush ssh
my $shell = "(?:".join("|",map { "\Q$_\E" } @shells).")";
$regexp = '^((\[)('. $shell. ')(\])|(|\S+/|busybox )('. $shell. '))( *$| [^(])';
$shell = "(?:".join("|",map { "\Q$_\E" } @shells).")";
$regexp = '^((\[)(-?)('. $shell. ')(\])|(|\S+/|busybox )'.
'(-?)('. $shell. '))( *$| [^(])';
%fakename = (
# sh disguises itself as -sh (sh) on FreeBSD
"-sh (sh)" => ["sh"],
# csh and tcsh disguise themselves as -sh/-csh
"-sh" => ["csh", "tcsh"],
# E.g.: ssh -tt csh@lo 'ps aux;true' |egrep ^csh
# but sh also disguise itself as -sh
# (When?)
"-sh" => ["sh"],
"-csh" => ["tcsh", "csh"],
# ash disguises itself as -ash
"-ash" => ["ash", "dash", "sh"],
# dash disguises itself as -dash
"-dash" => ["dash", "ash", "sh"],
# bash disguises itself as -bash
"-bash" => ["bash", "sh"],
# ksh disguises itself as -ash
"-ksh" => ["ksh", "sh"],
# zsh disguises itself as -zsh
"-zsh" => ["zsh", "sh"],
);
}
# if -sh or -csh try readlink /proc/$$/exe
my ($children_of_ref, $parent_of_ref, $name_of_ref) = pid_table();
my $shellpath;
my $testpid = $pid;
while($testpid) {
::debug("init", "shell? ". $name_of_ref->{$testpid}."\n");
if($name_of_ref->{$testpid} =~ /$regexp/o) {
::debug("init", "which ".($3||$6)." => ");
$shellpath = (which($3 || $6,@{$fakename{$3 || $6}}))[0];
my $shellname = $4 || $8;
my $dash = $3 || $7;
if($shellname eq "sh" and $dash) {
# -sh => csh or sh
if($shellpath = readlink "/proc/$testpid/exe") {
::debug("init","procpath $shellpath\n");
if($shellpath =~ m:/$shell$:o) {
::debug("init", "proc which ".$shellpath." => ");
return $shellpath;
}
}
}
::debug("init", "which ".$shellname." => ");
$shellpath = (which($shellname,@{$fakename{$shellname}}))[0];
::debug("init", "shell path $shellpath\n");
$shellpath and last;
}

View file

@ -96,9 +96,10 @@ dir that makes most sense for the sysadmin.
=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>.
B<env_parallel.(bash|ksh|pdksh|zsh)> defines 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.
@ -735,6 +736,49 @@ not known to B<bash>.
If GNU B<parallel> guesses wrong in these situation, set the shell using
B<$PARALLEL_SHELL>.
=head2 Always running commands in a shell
If the command is a simple command with no redirection and setting of
variables, the command I<could> be run without spawning a shell. E.g.:
parallel "grep -E 'a|bc' {}" ::: foo
could be run as:
system("grep","-E","a|bc","foo");
However, as soon as the command is a bit more complex a shell I<must>
be spawned:
parallel "grep -E 'a|bc' {} | wc" ::: foo
It is impossible to tell the difference between these two without
parsing the string (is the B<|> a pipe in shell or an alternation in
B<grep>?).
On top of this wrapper scripts will often require a shell to be
spawned.
The downside is that you need to quote special shell chars twice:
parallel echo '*' ::: This will expand the asterisk
parallel echo "'*'" ::: This will not
parallel "echo '*'" ::: This will not
parallel echo '\*' ::: This will not
parallel echo \''*'\' ::: This will not
parallel -q echo '*' ::: This will not
B<-q> will quote all special chars, thus redirection will not work:
this prints '* > out.1' and I<does not> save '*' into the file out.1:
parallel -q echo "*" ">" out.{} ::: 1
GNU B<parallel> tries to live up to Principle Of Least Astonishment
(POLA), and the requirement of using B<-q> is hard to understand, when
you do not see the whole picture.
=head2 Quoting
Quoting depends on the shell. For most shells \ is used for all

View file

@ -129,12 +129,6 @@ parallel -k echo {#} ::: 1 2 ::: 1 2
echo '**'
testquote() { printf '"#&/\n()*=?'"'" | PARALLEL_SHELL=$1 parallel -0 echo; };
export -f testquote;
parallel --tag -k testquote ::: ash bash csh dash fdsh fish fizsh ksh ksh93 mksh posh rbash rc rzsh sash sh static-sh tcsh yash zsh
echo '**'
echo '### bug #45769: --round-robin --pipepart gives wrong results'
seq 10000 >/tmp/seq10000;
@ -797,6 +791,16 @@ par_results() {
rm /tmp/$$.csv
}
par_testquote() {
testquote() {
printf '"#&/\n()*=?'"'" |
PARALLEL_SHELL=$1 parallel -0 echo
}
export -f testquote
parallel --tag -k testquote ::: ash bash csh dash fdsh fish fizsh ksh ksh93 mksh posh rbash rc rzsh sash sh static-sh tcsh yash zsh
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -306,6 +306,8 @@ par_retries_all_fail() {
parallel -k -j0 --retries 2 --timeout 0.1 'echo {}; sleep {}; false' 2>/dev/null
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
parallel --joblog /tmp/jl-`basename $0` -j10 --tag -k '{} 2>&1'

View file

@ -121,6 +121,38 @@ par_memfree() {
stdout parallel --timeout 20 --argsep II parallel --memfree 1t echo Free mem: ::: II 1t
}
par_test_detected_shell() {
echo '### bug #42913: Dont use $SHELL but the shell currently running'
shells="ash bash csh dash fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh"
test_unknown_shell() {
shell="$1"
tmp="/tmp/test_unknown_shell_$shell"
cp $(which "$shell") "$tmp"
chmod +x "$tmp"
$tmp -c 'ppar -Dinit echo ::: 1; true' |
grep Global::shell
rm "$tmp"
}
export -f test_unknown_shell
test_known_shell_c() {
shell="$1"
$shell -c 'parallel -Dinit echo ::: 1; true' |
grep Global::shell
}
export -f test_known_shell_c
test_known_shell_pipe() {
shell="$1"
echo 'parallel -Dinit echo ::: 1; true' |
$shell | grep Global::shell
}
export -f test_known_shell_pipe
parallel -j0 --tag -k ::: test_unknown_shell test_known_shell_c test_known_shell_pipe ::: $shells
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
parallel -j0 --tag -k --joblog /tmp/jl-`basename $0` '{} 2>&1'

View file

@ -8,4 +8,9 @@ echo '### See if we get compile error'
PATH=input-files/perllib:../input-files/perllib:$PATH
perl32 `which parallel` ::: 'echo perl'
echo '### See if we read modules outside perllib'
echo perl | stdout strace -ff perl32 `which parallel` echo | grep open | grep perl | grep -v input-files/perllib
echo perl |
stdout strace -ff perl32 `which parallel` echo |
grep open |
grep perl |
grep -v '] read(6' |
grep -v input-files/perllib

View file

@ -71,26 +71,6 @@ echo '### bug #42902: profiles containing arguments with space'
echo '### bug #42892: parallel -a nonexiting --pipepart'
parallel --pipepart -a nonexisting wc
echo '### bug #42913: Dont use $SHELL but the shell currently running'
echo '## Unknown shell => $SHELL (bash)'
parallel -kj1 "rm -f /tmp/SHELL; cp \`which {}\` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;"
::: ash bash csh dash fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh;
rm -f /tmp/SHELL /tmp/par*.par
echo '## Known shells -c'
parallel -k "\`which {}\` -c 'parallel -Dinit echo ::: 1' | grep which;"
::: ash bash csh dash fdsh fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh;
rm -f /tmp/par*.par
echo '## Known shells |'
parallel -k "echo 'parallel -Dinit echo ::: 1' | \`which {}\` | grep which;"
::: ash bash csh dash fdsh fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh;
rm -f /tmp/par*.par
echo '## Started directly from perl'
perl -e 'system(qw(parallel -Dinit echo ::: 1))' | grep which;
rm -f /tmp/par*.par
echo '### added transfersize/returnsize to local jobs'
echo '### normal'
seq 100 111 | parallel --joblog /dev/stderr seq {} '|' pv -qL100 2>&1 >/dev/null | cut -f 5-7 | sort

View file

@ -164,49 +164,6 @@ parallel -k echo {#} ::: 1 2 ::: 1 2
4
echo '**'
**
testquote() { printf '"#&/\n()*=?'"'" | PARALLEL_SHELL=$1 parallel -0 echo; }; export -f testquote; parallel --tag -k testquote ::: ash bash csh dash fdsh fish fizsh ksh ksh93 mksh posh rbash rc rzsh sash sh static-sh tcsh yash zsh
ash "#&/
ash ()*=?'
bash "#&/
bash ()*=?'
csh "#&/
csh ()*=?'
dash "#&/
dash ()*=?'
fdsh "#&/
fdsh ()*=?'
fish "#&/
fish ()*=?'
fizsh "#&/
fizsh ()*=?'
ksh "#&/
ksh ()*=?'
ksh93 "#&/
ksh93 ()*=?'
mksh "#&/
mksh ()*=?'
posh "#&/
posh ()*=?'
rbash "#&/
rbash ()*=?'
rc "#&/
rc ()*=?'
rzsh "#&/
rzsh ()*=?'
sash "#&/
sash ()*=?'
sh "#&/
sh ()*=?'
static-sh "#&/
static-sh ()*=?'
tcsh "#&/
tcsh ()*=?'
yash "#&/
yash ()*=?'
zsh "#&/
zsh ()*=?'
echo '**'
**
echo '### bug #45769: --round-robin --pipepart gives wrong results'
### bug #45769: --round-robin --pipepart gives wrong results
seq 10000 >/tmp/seq10000; parallel -j2 --pipepart -a /tmp/seq10000 --block 14 --round-robin wc | wc -l; rm /tmp/seq10000
@ -1575,6 +1532,46 @@ par_tee 4 -l 122853
par_tee 4 -c 815290
par_tee 5 -l 122853
par_tee 5 -c 815290
par_testquote ash "#&/
par_testquote ash ()*=?'
par_testquote bash "#&/
par_testquote bash ()*=?'
par_testquote csh "#&/
par_testquote csh ()*=?'
par_testquote dash "#&/
par_testquote dash ()*=?'
par_testquote fdsh "#&/
par_testquote fdsh ()*=?'
par_testquote fish "#&/
par_testquote fish ()*=?'
par_testquote fizsh "#&/
par_testquote fizsh ()*=?'
par_testquote ksh "#&/
par_testquote ksh ()*=?'
par_testquote ksh93 "#&/
par_testquote ksh93 ()*=?'
par_testquote mksh "#&/
par_testquote mksh ()*=?'
par_testquote posh "#&/
par_testquote posh ()*=?'
par_testquote rbash "#&/
par_testquote rbash ()*=?'
par_testquote rc "#&/
par_testquote rc ()*=?'
par_testquote rzsh "#&/
par_testquote rzsh ()*=?'
par_testquote sash "#&/
par_testquote sash ()*=?'
par_testquote sh "#&/
par_testquote sh ()*=?'
par_testquote static-sh "#&/
par_testquote static-sh ()*=?'
par_testquote tcsh "#&/
par_testquote tcsh ()*=?'
par_testquote yash "#&/
par_testquote yash ()*=?'
par_testquote zsh "#&/
par_testquote zsh ()*=?'
par_tricolonplus ### bug #48745: :::+ bug
par_tricolonplus 11 1 21 a aa
par_tricolonplus 11 1 21 b bb

View file

@ -40,6 +40,67 @@ par_sigterm parallel: sleep 15; echo 6
par_sigterm parallel: sleep 15; echo 7
par_sigterm parallel: sleep 15; echo 8
par_sigterm parallel: sleep 15; echo 9
par_test_detected_shell ### bug #42913: Dont use $SHELL but the shell currently running
par_test_detected_shell test_unknown_shell ash Global::shell /bin/bash
par_test_detected_shell test_unknown_shell bash Global::shell /bin/bash
par_test_detected_shell test_unknown_shell csh Global::shell /bin/bash
par_test_detected_shell test_unknown_shell dash Global::shell /bin/bash
par_test_detected_shell test_unknown_shell fish Global::shell /bin/bash
par_test_detected_shell test_unknown_shell fizsh Global::shell /usr/bin/zsh
par_test_detected_shell test_unknown_shell ksh Global::shell /bin/bash
par_test_detected_shell test_unknown_shell ksh93 Global::shell /bin/bash
par_test_detected_shell test_unknown_shell mksh Global::shell /bin/bash
par_test_detected_shell test_unknown_shell posh Global::shell /bin/bash
par_test_detected_shell test_unknown_shell rbash Global::shell /bin/bash
par_test_detected_shell test_unknown_shell rush Local configuration error occurred.
par_test_detected_shell test_unknown_shell rush Contact the systems administrator for further assistance.
par_test_detected_shell test_unknown_shell rzsh Global::shell /bin/bash
par_test_detected_shell test_unknown_shell sash Global::shell /bin/sh
par_test_detected_shell test_unknown_shell sh Global::shell /bin/bash
par_test_detected_shell test_unknown_shell static-sh test_unknown_shell_static-sh: applet not found
par_test_detected_shell test_unknown_shell tcsh Global::shell /bin/bash
par_test_detected_shell test_unknown_shell yash Global::shell /bin/bash
par_test_detected_shell test_unknown_shell zsh Global::shell /bin/bash
par_test_detected_shell test_known_shell_c ash Global::shell /bin/ash
par_test_detected_shell test_known_shell_c bash Global::shell /bin/bash
par_test_detected_shell test_known_shell_c csh Global::shell /bin/csh
par_test_detected_shell test_known_shell_c dash Global::shell /bin/dash
par_test_detected_shell test_known_shell_c fish Global::shell /usr/bin/fish
par_test_detected_shell test_known_shell_c fizsh Global::shell /usr/bin/zsh
par_test_detected_shell test_known_shell_c ksh Global::shell /usr/bin/ksh
par_test_detected_shell test_known_shell_c ksh93 Global::shell /bin/ksh93
par_test_detected_shell test_known_shell_c mksh Global::shell /bin/mksh
par_test_detected_shell test_known_shell_c posh Global::shell /bin/posh
par_test_detected_shell test_known_shell_c rbash Global::shell /bin/rbash
par_test_detected_shell test_known_shell_c rush Local configuration error occurred.
par_test_detected_shell test_known_shell_c rush Contact the systems administrator for further assistance.
par_test_detected_shell test_known_shell_c rzsh Global::shell /bin/rzsh
par_test_detected_shell test_known_shell_c sash Global::shell /bin/sh
par_test_detected_shell test_known_shell_c sh Global::shell /bin/sh
par_test_detected_shell test_known_shell_c static-sh Global::shell /bin/static-sh
par_test_detected_shell test_known_shell_c tcsh Global::shell /usr/bin/tcsh
par_test_detected_shell test_known_shell_c yash Global::shell /usr/bin/yash
par_test_detected_shell test_known_shell_c zsh Global::shell /usr/bin/zsh
par_test_detected_shell test_known_shell_pipe ash Global::shell /bin/ash
par_test_detected_shell test_known_shell_pipe bash Global::shell /bin/bash
par_test_detected_shell test_known_shell_pipe csh Global::shell /bin/csh
par_test_detected_shell test_known_shell_pipe dash Global::shell /bin/dash
par_test_detected_shell test_known_shell_pipe fish Global::shell /usr/bin/fish
par_test_detected_shell test_known_shell_pipe fizsh Global::shell /usr/bin/zsh
par_test_detected_shell test_known_shell_pipe ksh Global::shell /usr/bin/ksh
par_test_detected_shell test_known_shell_pipe ksh93 Global::shell /bin/ksh93
par_test_detected_shell test_known_shell_pipe mksh Global::shell /bin/mksh
par_test_detected_shell test_known_shell_pipe posh Global::shell /bin/posh
par_test_detected_shell test_known_shell_pipe rbash Global::shell /bin/rbash
par_test_detected_shell test_known_shell_pipe rush Local configuration error occurred.
par_test_detected_shell test_known_shell_pipe rush Contact the systems administrator for further assistance.
par_test_detected_shell test_known_shell_pipe rzsh Global::shell /bin/rzsh
par_test_detected_shell test_known_shell_pipe sash Global::shell /bin/sh
par_test_detected_shell test_known_shell_pipe sh Global::shell /bin/sh
par_test_detected_shell test_known_shell_pipe static-sh Global::shell /bin/static-sh
par_test_detected_shell test_known_shell_pipe tcsh Global::shell /usr/bin/tcsh
par_test_detected_shell test_known_shell_pipe yash Global::shell /usr/bin/yash
par_test_detected_shell test_known_shell_pipe zsh Global::shell /usr/bin/zsh
par_tmp_full ### Test --tmpdir running full. bug #40733 was caused by this
par_tmp_full parallel: Error: Output is incomplete.
par_tmp_full parallel: Error: Cannot append to buffer file in /tmp/shm/parallel.

View file

@ -93,108 +93,6 @@ echo '### bug #42892: parallel -a nonexiting --pipepart'
### bug #42892: parallel -a nonexiting --pipepart
parallel --pipepart -a nonexisting wc
parallel: Error: nonexisting is neither a file nor a block device
echo '### bug #42913: Dont use $SHELL but the shell currently running'
### bug #42913: Dont use $SHELL but the shell currently running
echo '## Unknown shell => $SHELL (bash)'
## Unknown shell => $SHELL (bash)
parallel -kj1 "rm -f /tmp/SHELL; cp \`which {}\` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;" ::: ash bash csh dash fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh; rm -f /tmp/SHELL /tmp/par*.par
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which ash` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which bash` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which csh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which dash` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which fish` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
which zsh => shell path /usr/bin/zsh
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which ksh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which ksh93` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which mksh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which posh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which rbash` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which rzsh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which sash` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which sh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which tcsh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which yash` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c rm -f /tmp/SHELL; cp `which zsh` /tmp/SHELL; /tmp/SHELL -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
Local configuration error occurred.
Contact the systems administrator for further assistance.
SHELL: applet not found
echo '## Known shells -c'
## Known shells -c
parallel -k "\`which {}\` -c 'parallel -Dinit echo ::: 1' | grep which;" ::: ash bash csh dash fdsh fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh; rm -f /tmp/par*.par
which ash => shell path /bin/ash
shell? /bin/bash -c `which bash` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
which csh => shell path /bin/csh
which dash => shell path /bin/dash
which fdsh => shell path /usr/bin/fdsh
which fish => shell path /usr/bin/fish
which zsh => shell path /usr/bin/zsh
shell? /bin/bash -c `which ksh` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c `which ksh93` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c `which mksh` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
which posh => shell path /bin/posh
shell? /bin/bash -c `which rbash` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c `which rzsh` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
which sash => shell path /bin/sash
which sh => shell path /bin/sh
which static-sh => shell path /bin/static-sh
which tcsh => shell path /usr/bin/tcsh
shell? /bin/bash -c `which yash` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
shell? /bin/bash -c `which zsh` -c 'parallel -Dinit echo ::: 1' | grep which;
which bash => shell path /bin/bash
Local configuration error occurred.
Contact the systems administrator for further assistance.
echo '## Known shells |'
## Known shells |
parallel -k "echo 'parallel -Dinit echo ::: 1' | \`which {}\` | grep which;" ::: ash bash csh dash fdsh fish fizsh ksh ksh93 mksh posh rbash rush rzsh sash sh static-sh tcsh yash zsh; rm -f /tmp/par*.par
which ash => shell path /bin/ash
which bash => shell path /bin/bash
which csh => shell path /bin/csh
which dash => shell path /bin/dash
which fdsh => shell path /usr/bin/fdsh
which fish => shell path /usr/bin/fish
which zsh => shell path /usr/bin/zsh
which ksh => shell path /usr/bin/ksh
which ksh93 => shell path /bin/ksh93
which mksh => shell path /bin/mksh
which posh => shell path /bin/posh
which rbash => shell path /bin/rbash
which rzsh => shell path /bin/rzsh
which sash => shell path /bin/sash
which sh => shell path /bin/sh
which static-sh => shell path /bin/static-sh
which tcsh => shell path /usr/bin/tcsh
which yash => shell path /usr/bin/yash
which zsh => shell path /usr/bin/zsh
Local configuration error occurred.
Contact the systems administrator for further assistance.
echo '## Started directly from perl'
## Started directly from perl
perl -e 'system(qw(parallel -Dinit echo ::: 1))' | grep which; rm -f /tmp/par*.par
shell? /bin/bash -c perl -e 'system(qw(parallel -Dinit echo ::: 1))' | grep which; rm -f /tmp/par*.par
which bash => shell path /bin/bash
echo '### added transfersize/returnsize to local jobs'
### added transfersize/returnsize to local jobs
echo '### normal'