diff --git a/src/parallel b/src/parallel index 4d6a0fac..e1bac6c7 100755 --- a/src/parallel +++ b/src/parallel @@ -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; } diff --git a/src/parallel_design.pod b/src/parallel_design.pod index ed415d15..2a7a9ff2 100644 --- a/src/parallel_design.pod +++ b/src/parallel_design.pod @@ -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 sets the function B. It uses -B and B to dump the configuration (with a few -exceptions) into B<$PARALLEL_ENV> before running GNU B. +B defines the function +B. It uses B and B to dump the +configuration (with a few exceptions) into B<$PARALLEL_ENV> before +running GNU B. After GNU B is finished, B<$PARALLEL_ENV> is deleted. @@ -735,6 +736,49 @@ not known to B. If GNU B 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 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 +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?). + +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 save '*' into the file out.1: + + parallel -q echo "*" ">" out.{} ::: 1 + +GNU B 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 diff --git a/testsuite/tests-to-run/parallel-local-0.3s.sh b/testsuite/tests-to-run/parallel-local-0.3s.sh index 66fc76e5..776490b9 100644 --- a/testsuite/tests-to-run/parallel-local-0.3s.sh +++ b/testsuite/tests-to-run/parallel-local-0.3s.sh @@ -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' diff --git a/testsuite/tests-to-run/parallel-local-10s.sh b/testsuite/tests-to-run/parallel-local-10s.sh index d6d3d0fd..631c88ce 100644 --- a/testsuite/tests-to-run/parallel-local-10s.sh +++ b/testsuite/tests-to-run/parallel-local-10s.sh @@ -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' diff --git a/testsuite/tests-to-run/parallel-local-30s.sh b/testsuite/tests-to-run/parallel-local-30s.sh index c4e4a657..410118de 100755 --- a/testsuite/tests-to-run/parallel-local-30s.sh +++ b/testsuite/tests-to-run/parallel-local-30s.sh @@ -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' diff --git a/testsuite/tests-to-run/parallel-local10.sh b/testsuite/tests-to-run/parallel-local10.sh index 72aceac3..851f42c5 100755 --- a/testsuite/tests-to-run/parallel-local10.sh +++ b/testsuite/tests-to-run/parallel-local10.sh @@ -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 diff --git a/testsuite/tests-to-run/parallel-local22.sh b/testsuite/tests-to-run/parallel-local22.sh index 53f77dda..2ee05eac 100755 --- a/testsuite/tests-to-run/parallel-local22.sh +++ b/testsuite/tests-to-run/parallel-local22.sh @@ -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 diff --git a/testsuite/wanted-results/parallel-local-0.3s b/testsuite/wanted-results/parallel-local-0.3s index 933ffeb0..0c3b17d0 100644 --- a/testsuite/wanted-results/parallel-local-0.3s +++ b/testsuite/wanted-results/parallel-local-0.3s @@ -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 diff --git a/testsuite/wanted-results/parallel-local-30s b/testsuite/wanted-results/parallel-local-30s index 74d1b8f2..810861c3 100644 --- a/testsuite/wanted-results/parallel-local-30s +++ b/testsuite/wanted-results/parallel-local-30s @@ -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. diff --git a/testsuite/wanted-results/parallel-local22 b/testsuite/wanted-results/parallel-local22 index b60f0dd7..954b72ba 100644 --- a/testsuite/wanted-results/parallel-local22 +++ b/testsuite/wanted-results/parallel-local22 @@ -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'