diff --git a/NEWS b/NEWS index 1b212960..7246bf03 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,15 @@ +20231122 + +New in this release: + +* -a file1 -a +file2 will link file2 to file1 similar to ::::+ + +* Bug fixes and man page updates. + +News about GNU Parallel: + + + 20231022 New in this release: diff --git a/doc/release_new_version b/doc/release_new_version index 24dfe102..baecae67 100644 --- a/doc/release_new_version +++ b/doc/release_new_version @@ -274,24 +274,23 @@ from:tange@gnu.org to:parallel@gnu.org, bug-parallel@gnu.org stable-bcc: Jesse Alama -Subject: GNU Parallel 20231022 ('Al-Aqsa Deluge') released [stable] +Subject: GNU Parallel 20231122 ('Perry<<>>') released <<[stable]>> -GNU Parallel 20231022 ('Al-Aqsa Deluge') has been released. It is available for download at: lbry://@GnuParallel:4 +GNU Parallel 20231122 ('<<>>') has been released. It is available for download at: lbry://@GnuParallel:4 Quote of the month: - Love to make a dual processor workstation absolutely whir running dozens of analysis scripts at once - -- Best Catboy Key Grip @alamogordoglass@twitter - +<<>> + New in this release: +* -a file1 -a +file2 will link file2 to file1 similar to ::::+ + * Bug fixes and man page updates. News about GNU Parallel: -* Resume long parallel jobs https://ginolhac.github.io/posts/2023-10-02_resume-parallel/index.html - -* Efficiency and Speed with GNU Parallel https://dev.to/0xog_pg/efficiency-and-speed-with-gnu-parallel-loo +<<>> GNU Parallel - For people who live life in the parallel lane. diff --git a/src/parallel b/src/parallel index f4d7b905..1d328b08 100755 --- a/src/parallel +++ b/src/parallel @@ -2522,10 +2522,8 @@ sub parse_options(@) { not ($opt::xargs or $opt::m)) { $Global::ContextReplace = 1; } - if(grep /^$Global::arg_sep\+?$|^$Global::arg_file_sep\+?$/o, @ARGV) { - # Deal with ::: :::+ :::: and ::::+ - @ARGV = read_args_from_command_line(); - } + # Deal with ::: :::+ :::: ::::+ and -a +file + @ARGV = read_args_from_command_line(); parse_semaphore(); if(defined $opt::eta) { $opt::progress = $opt::eta; } @@ -3524,76 +3522,136 @@ sub read_args_from_command_line() { # @opt::a # Returns: # @argv_no_argsep = @::ARGV without ::: and :::: and following args - my @new_argv = (); - for(my $arg = shift @ARGV; @ARGV; $arg = shift @ARGV) { - if($arg eq $Global::arg_sep - or - $arg eq $Global::arg_sep."+" - or - $arg eq $Global::arg_file_sep - or - $arg eq $Global::arg_file_sep."+") { - my $group_sep = $arg; # This group of args is args or argfiles - my @group; - while(defined ($arg = shift @ARGV)) { - if($arg eq $Global::arg_sep - or - $arg eq $Global::arg_sep."+" - or - $arg eq $Global::arg_file_sep - or - $arg eq $Global::arg_file_sep."+") { - # exit while loop if finding new separator - last; + my %group_sep = ($Global::arg_sep => ":::", + $Global::arg_sep."+" => ":::+", + $Global::arg_file_sep => "::::", + $Global::arg_file_sep."+" => "::::+"); + sub is_linked($) { + # file is linked if file starts with + + local $_ = shift; + if(/^\+(.*)/) { + my $noplus = $1; + if(-e $_ and -e $noplus) { + ::error("It is unclear whether you mean +./$noplus or ./+$noplus"); + wait_and_exit(255); + } elsif(-e $_ and not -e $noplus) { + # This is ./+file = this is not linked + return 0; + } elsif(not -e $_ and -e $noplus) { + # This is +./file = this is linked + return 1; + } elsif(not -e $_ and not -e $noplus) { + # File does not exist, maybe it is stdin? + if($_ eq "-") { + # This is - = this is not linked + return 0; + } elsif($_ eq "+-") { + # This is +- = this is linked + return 1; } else { - # If not hitting ::: :::+ :::: or ::::+ - # Append it to the group - push @group, $arg; + ::error("File not found: $_"); + wait_and_exit(255); } - } - my $is_linked = ($group_sep =~ /\+$/) ? 1 : 0; - my $is_file = ($group_sep eq $Global::arg_file_sep - or - $group_sep eq $Global::arg_file_sep."+"); - if($is_file) { - # :::: / ::::+ - push @opt::linkinputsource, map { $is_linked } @group; } else { - # ::: / :::+ - push @opt::linkinputsource, $is_linked; - } - if($is_file - or ($opt::_pipe_means_argfiles and $opt::pipe) - ) { - # Group of file names on the command line. - # Append args into -a - push @opt::a, @group; - } else { - # Group of arguments on the command line. - # Put them into a file. - # Create argfile - my ($outfh,$name) = ::tmpfile(SUFFIX => ".arg"); - unlink($name); - # Put args into argfile - print $outfh map { $_,$/ } @group; - seek $outfh, 0, 0; - exit_if_disk_full(); - # Append filehandle to -a - push @opt::a, $outfh; - } - if(defined($arg)) { - # $arg is ::: :::+ :::: or ::::+ - # so there is another group - redo; - } else { - # $arg is undef -> @ARGV empty - last; + ::die_bug("noplus: $noplus $_"); } } - push @new_argv, $arg; + # not linked + return 0; } - # Output: @ARGV = command to run with options - return @new_argv; + sub cmd_template() { + # remove command template from @ARGV + # keep ::: / :::: in @ARGV if any + my @cmd_template; + while(@ARGV) { + my $arg = shift @ARGV; + if($group_sep{$arg}) { + # Found separator: push it back and exit loop + unshift @ARGV, $arg; + last; + } + push @cmd_template, $arg; + } + return @cmd_template; + } + sub divide_into_groups() { + # Split arguments from @ARGV into groups: + # ::: 1 2 3 :::: a b c ::::+ d e f + # => + # [ ::: 1 2 3 ], [ :::: a b c ], [ ::::+ d e f ] + my @g; + my @grp; + while(@ARGV) { + my $arg = shift @ARGV; + if($group_sep{$arg}) { + # start a new group + push @grp, [@g]; + @g = ($group_sep{$arg}); + } else { + push @g, $arg; + } + } + push @grp, [@g]; + shift @grp; # The first will always be empty + return @grp; + } + sub save_to_file(@) { + # Put args into a file, return open file handle of file + # Create argfile + my ($fh,$name) = ::tmpfile(SUFFIX => ".arg"); + unlink($name); + # Put args into argfile + print $fh map { $_,$/ } @_; + seek $fh, 0, 0; + exit_if_disk_full(); + return $fh; + } + my @cmd = cmd_template(); + # The rest of @ARGV is ::: / :::: args + # If there are any -a: Rewrite them to use :::: + if(@opt::a) { unshift @ARGV, $Global::arg_file_sep, @opt::a; } + @opt::a = (); + # Convert ::: and :::: into (linked) files and put those into @opt::a + for my $g_ref (divide_into_groups()) { + my $group_sep = shift @$g_ref; + if($group_sep eq ":::" or $group_sep eq ":::+") { + # Group starts with ::: / :::+ + if($opt::_pipe_means_argfiles and $#$g_ref < 0) { + # TODO + # Deal with --shebang-wrap and ::: on the shebang line + } else { + push @opt::a, save_to_file(@$g_ref); + # if $group_sep == ":::+": it is linked + push @opt::linkinputsource, ($group_sep eq ":::+"); + } + } elsif($group_sep eq "::::" or $group_sep eq "::::+") { + # Group starts with :::: / ::::+ + for my $f (@$g_ref) { + if($group_sep eq "::::+") { + # Linking forced + push @opt::a, $f; + push @opt::linkinputsource, 1; + } elsif($group_sep eq "::::") { + # Auto detect linking + if(is_linked($f)) { + # +file + push @opt::linkinputsource, 1; + $f =~ s/^\+//; + } else { + # file (no plus) + push @opt::linkinputsource, 0; + } + push @opt::a, $f; + } else { + ::die_bug("arg link error"); + } + } + } else { + ::die_bug("arg link error"); + } + } + # Output: command to run with options + return @cmd; } sub cleanup() { diff --git a/src/parallel.pod b/src/parallel.pod index 414a321f..017f6e74 100644 --- a/src/parallel.pod +++ b/src/parallel.pod @@ -536,16 +536,12 @@ Shorthand for B<--delimiter '\0'>. See also: B<--delimiter> -=item B<--arg-file> I +=item B<--arg-file> I (alpha testing) -=item B<-a> I +=item B<-a> I (alpha testing) Use I as input source. -If you use this option, stdin (standard input) is given to the first -process run. Otherwise, stdin (standard input) is redirected from -/dev/null. - If multiple B<--arg-file> are given, each I will be treated as an input source, and all combinations of input sources will be generated. E.g. The file B contains B<1 2>, the file @@ -553,6 +549,12 @@ B contains B. B<-a foo> B<-a bar> will result in the combinations (1,a) (1,b) (1,c) (2,a) (2,b) (2,c). This is useful for replacing nested for-loops. +If I starts with B<+> the file will be linked to the +previous B<--arg-file> E.g. The file B contains B<1 2>, the file +B contains B. B<-a foo> B<-a +bar> will result in the +combinations (1,a) (2,b) like B<--link> instead of generating all +combinations. + See also: B<--link> B<{>IB<}> B<::::> B<::::+> B<:::> diff --git a/testsuite/tests-to-run/parallel-local-3s.sh b/testsuite/tests-to-run/parallel-local-3s.sh index c0471a2c..8dd18dd6 100644 --- a/testsuite/tests-to-run/parallel-local-3s.sh +++ b/testsuite/tests-to-run/parallel-local-3s.sh @@ -8,6 +8,53 @@ # Each should be taking 3-10s and be possible to run in parallel # I.e.: No race conditions, no logins +par__argfile_plus() { + tmp=$(mktemp -d) + ( + p() { + echo -- -a $1 $2 $3 + stdout parallel -k -a $1 -a $2 -a $3 echo; + } + q() { + echo :::: $1 $2 $3 + stdout parallel -k echo :::: $1 $2 $3; + } + cd "$tmp" + seq 3 > file + seq 4 6 > +file + seq 7 9 > ++file + + p file +file ++file + p file +./file ++file + p file ./+file ++file + + p file +file +./+file + p file +./file +./+file + p file ./+file +./+file + + p file +file ./++file + p file +./file ./++file + p file ./+file ./++file + + q file +file ++file + q file +./file ++file + q file ./+file ++file + + q file +file +./+file + q file +./file +./+file + q file ./+file +./+file + + q file +file ./++file + q file +./file ./++file + q file ./+file ./++file + + seq 10 12 | p ./file ./++file - + seq 10 12 | p ./file +./+file +- + seq 10 12 | p ./file +- ./+file + ) + rm -r "$tmp" +} + par_process_slot_var() { echo '### bug #62310: xargs compatibility: --process-slot-var=name' seq 0.1 0.4 1.8 | diff --git a/testsuite/tests-to-run/parallel-local-load.sh b/testsuite/tests-to-run/parallel-local-load.sh index e8e8539e..4a9f2e65 100644 --- a/testsuite/tests-to-run/parallel-local-load.sh +++ b/testsuite/tests-to-run/parallel-local-load.sh @@ -50,4 +50,4 @@ par_load_file_more_10s() { export -f $(compgen -A function | grep par_) #compgen -A function | grep par_ | sort | parallel --delay $D -j$P --tag -k '{} 2>&1' compgen -A function | grep par_ | sort | - parallel --joblog /tmp/jl-`basename $0` -j200% --tag -k '{} 2>&1' + parallel --timeout 30s --joblog /tmp/jl-`basename $0` -j200% --tag -k '{} 2>&1' diff --git a/testsuite/tests-to-run/parallel-tutorial.sh b/testsuite/tests-to-run/parallel-tutorial.sh index 8ea521f6..78a3a428 100644 --- a/testsuite/tests-to-run/parallel-tutorial.sh +++ b/testsuite/tests-to-run/parallel-tutorial.sh @@ -120,7 +120,13 @@ perl -ne '$/="\n\n"; /^Output/../^[^O]\S/ and next; /^ / and print;' "$testsuit s:par......par:tempfile:g; s:^tempfile\n::g; # --progress => 1:local / 4 / 4 - s,1:local / . / .,1:local / 9 / 9, + s,1:local / . / .,1:local / 9 / 9,; + # bash: -c: line 1: .set a="tempfile"; if( { test -d "$a" } ) echo "$a is a dir" + s{.*bash: .*set a=".*".*test -d.*is a dir.*\n}{}; + # /usr/bin/bash: -c: line 1: syntax error near unexpected token .) + s{.*bash: .*syntax error near unexpected token.*\n}{}; + # This is input_file + s{^This is input_file.*\n}{}; ' | uniq echo "### 3+3 .par files (from --files), 1 .tms-file from tmux attach" diff --git a/testsuite/wanted-results/parallel-local-3s b/testsuite/wanted-results/parallel-local-3s index 33baff62..17983f3a 100644 --- a/testsuite/wanted-results/parallel-local-3s +++ b/testsuite/wanted-results/parallel-local-3s @@ -12,6 +12,172 @@ par__10000_5_rpl_X 4 par__10000_5_rpl_X 4 par__10000_5_rpl_X 3 par__10000_5_rpl_X 2 +par__argfile_plus -- -a file +file ++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./file or ./+file +par__argfile_plus -- -a file +./file ++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./+file or ./++file +par__argfile_plus -- -a file ./+file ++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./+file or ./++file +par__argfile_plus -- -a file +file +./+file +par__argfile_plus parallel: Error: It is unclear whether you mean +./file or ./+file +par__argfile_plus -- -a file +./file +./+file +par__argfile_plus 1 1 4 +par__argfile_plus 2 2 5 +par__argfile_plus 3 3 6 +par__argfile_plus -- -a file ./+file +./+file +par__argfile_plus 1 4 4 +par__argfile_plus 1 5 5 +par__argfile_plus 1 6 6 +par__argfile_plus 2 4 4 +par__argfile_plus 2 5 5 +par__argfile_plus 2 6 6 +par__argfile_plus 3 4 4 +par__argfile_plus 3 5 5 +par__argfile_plus 3 6 6 +par__argfile_plus -- -a file +file ./++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./file or ./+file +par__argfile_plus -- -a file +./file ./++file +par__argfile_plus 1 1 7 +par__argfile_plus 1 1 8 +par__argfile_plus 1 1 9 +par__argfile_plus 2 2 7 +par__argfile_plus 2 2 8 +par__argfile_plus 2 2 9 +par__argfile_plus 3 3 7 +par__argfile_plus 3 3 8 +par__argfile_plus 3 3 9 +par__argfile_plus -- -a file ./+file ./++file +par__argfile_plus 1 4 7 +par__argfile_plus 1 4 8 +par__argfile_plus 1 4 9 +par__argfile_plus 1 5 7 +par__argfile_plus 1 5 8 +par__argfile_plus 1 5 9 +par__argfile_plus 1 6 7 +par__argfile_plus 1 6 8 +par__argfile_plus 1 6 9 +par__argfile_plus 2 4 7 +par__argfile_plus 2 4 8 +par__argfile_plus 2 4 9 +par__argfile_plus 2 5 7 +par__argfile_plus 2 5 8 +par__argfile_plus 2 5 9 +par__argfile_plus 2 6 7 +par__argfile_plus 2 6 8 +par__argfile_plus 2 6 9 +par__argfile_plus 3 4 7 +par__argfile_plus 3 4 8 +par__argfile_plus 3 4 9 +par__argfile_plus 3 5 7 +par__argfile_plus 3 5 8 +par__argfile_plus 3 5 9 +par__argfile_plus 3 6 7 +par__argfile_plus 3 6 8 +par__argfile_plus 3 6 9 +par__argfile_plus :::: file +file ++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./file or ./+file +par__argfile_plus :::: file +./file ++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./+file or ./++file +par__argfile_plus :::: file ./+file ++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./+file or ./++file +par__argfile_plus :::: file +file +./+file +par__argfile_plus parallel: Error: It is unclear whether you mean +./file or ./+file +par__argfile_plus :::: file +./file +./+file +par__argfile_plus 1 1 4 +par__argfile_plus 2 2 5 +par__argfile_plus 3 3 6 +par__argfile_plus :::: file ./+file +./+file +par__argfile_plus 1 4 4 +par__argfile_plus 1 5 5 +par__argfile_plus 1 6 6 +par__argfile_plus 2 4 4 +par__argfile_plus 2 5 5 +par__argfile_plus 2 6 6 +par__argfile_plus 3 4 4 +par__argfile_plus 3 5 5 +par__argfile_plus 3 6 6 +par__argfile_plus :::: file +file ./++file +par__argfile_plus parallel: Error: It is unclear whether you mean +./file or ./+file +par__argfile_plus :::: file +./file ./++file +par__argfile_plus 1 1 7 +par__argfile_plus 1 1 8 +par__argfile_plus 1 1 9 +par__argfile_plus 2 2 7 +par__argfile_plus 2 2 8 +par__argfile_plus 2 2 9 +par__argfile_plus 3 3 7 +par__argfile_plus 3 3 8 +par__argfile_plus 3 3 9 +par__argfile_plus :::: file ./+file ./++file +par__argfile_plus 1 4 7 +par__argfile_plus 1 4 8 +par__argfile_plus 1 4 9 +par__argfile_plus 1 5 7 +par__argfile_plus 1 5 8 +par__argfile_plus 1 5 9 +par__argfile_plus 1 6 7 +par__argfile_plus 1 6 8 +par__argfile_plus 1 6 9 +par__argfile_plus 2 4 7 +par__argfile_plus 2 4 8 +par__argfile_plus 2 4 9 +par__argfile_plus 2 5 7 +par__argfile_plus 2 5 8 +par__argfile_plus 2 5 9 +par__argfile_plus 2 6 7 +par__argfile_plus 2 6 8 +par__argfile_plus 2 6 9 +par__argfile_plus 3 4 7 +par__argfile_plus 3 4 8 +par__argfile_plus 3 4 9 +par__argfile_plus 3 5 7 +par__argfile_plus 3 5 8 +par__argfile_plus 3 5 9 +par__argfile_plus 3 6 7 +par__argfile_plus 3 6 8 +par__argfile_plus 3 6 9 +par__argfile_plus -- -a ./file ./++file - +par__argfile_plus 1 7 10 +par__argfile_plus 1 7 11 +par__argfile_plus 1 7 12 +par__argfile_plus 1 8 10 +par__argfile_plus 1 8 11 +par__argfile_plus 1 8 12 +par__argfile_plus 1 9 10 +par__argfile_plus 1 9 11 +par__argfile_plus 1 9 12 +par__argfile_plus 2 7 10 +par__argfile_plus 2 7 11 +par__argfile_plus 2 7 12 +par__argfile_plus 2 8 10 +par__argfile_plus 2 8 11 +par__argfile_plus 2 8 12 +par__argfile_plus 2 9 10 +par__argfile_plus 2 9 11 +par__argfile_plus 2 9 12 +par__argfile_plus 3 7 10 +par__argfile_plus 3 7 11 +par__argfile_plus 3 7 12 +par__argfile_plus 3 8 10 +par__argfile_plus 3 8 11 +par__argfile_plus 3 8 12 +par__argfile_plus 3 9 10 +par__argfile_plus 3 9 11 +par__argfile_plus 3 9 12 +par__argfile_plus -- -a ./file +./+file +- +par__argfile_plus 1 4 10 +par__argfile_plus 2 5 11 +par__argfile_plus 3 6 12 +par__argfile_plus -- -a ./file +- ./+file +par__argfile_plus 1 10 4 +par__argfile_plus 1 10 5 +par__argfile_plus 1 10 6 +par__argfile_plus 2 11 4 +par__argfile_plus 2 11 5 +par__argfile_plus 2 11 6 +par__argfile_plus 3 12 4 +par__argfile_plus 3 12 5 +par__argfile_plus 3 12 6 par__parset_assoc_arr bash@lo parset into an assoc array par__parset_assoc_arr bash@lo val 1 val 2 val 3 par__parset_assoc_arr bash@lo val 1 val 2 val 3 diff --git a/testsuite/wanted-results/parallel-tutorial b/testsuite/wanted-results/parallel-tutorial index ba547b34..736891bd 100644 --- a/testsuite/wanted-results/parallel-tutorial +++ b/testsuite/wanted-results/parallel-tutorial @@ -8,7 +8,6 @@ 160d3159 9480cf5c a101512f 150b7ac0 206a65dc 86f2bb6b bdf1a2bc 96bc6d06 7f8237c2 0964b67f bccf8a93 332528fa 11e5ab43 2a6226a6 ceb197ab 7f03c061 $ bash install.sh -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' /usr/bin/bash: -c: line 1: ` fetch -o - http://pi.dk/3 ) > install.sh' parallel -k echo ::: A B C > abc-file parallel -k echo ::: D E F > def-file @@ -23,7 +22,6 @@ sleep .3 /usr/bin/bash: -c: line 3: syntax error: unexpected end of file sleep .3 perl -e 'for(1..10){print "$_\n"}') > num_%header -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' /usr/bin/bash: -c: line 1: ` perl -e 'for(1..10){print "$_\n"}') > num_%header' perl -e 'print "HHHHAAABBBCCC"' > fixedlen parallel echo ::: A B C @@ -351,7 +349,6 @@ foo perl -e 'print "@ARGV\n"' [CTRL-D] /usr/bin/bash: line 2: Warning:: command not found -/usr/bin/bash: -c: line 3: syntax error near unexpected token `(' /usr/bin/bash: -c: line 3: ` Warning: are doing (in which case: YOU ARE AWESOME!) or you forgot' parallel --trim r echo pre-{}-post ::: ' A ' pre- A-post @@ -364,26 +361,6 @@ pre-A-post =bash =ls parallel 'set a="{}"; if( { test -d "$a" } ) echo "$a is a dir"' ::: * -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="abc-file"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="abc0-file"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="abc_-file"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="def-file"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="fixedlen"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="num1000000"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="num30000"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="num8"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="outdir"; if( { test -d "$a" } ) echo "$a is a dir"' -/usr/bin/bash: -c: line 1: syntax error near unexpected token `)' -/usr/bin/bash: -c: line 1: `set a="tsv-file.tsv"; if( { test -d "$a" } ) echo "$a is a dir"' parallel --tag echo foo-{} ::: A B C A foo-A B foo-B @@ -644,21 +621,17 @@ run_on_grp1 run_on_grp2 echo This is input_file > input_file parallel -S $SERVER1 --transferfile {} cat ::: input_file -This is input_file echo This is input_file > input_file parallel -S $SERVER1 --transferfile {} --return {}.out \ cat {} ">"{}.out ::: input_file cat input_file.out -This is input_file echo This is input_file > input_file parallel -S $SERVER1 --transferfile {} --return {}.out --cleanup \ cat {} ">"{}.out ::: input_file cat input_file.out -This is input_file echo This is input_file > input_file parallel -S $SERVER1 --trc {}.out cat {} ">"{}.out ::: input_file cat input_file.out -This is input_file echo common data > common_file parallel --basefile common_file -S $SERVER1 \ cat common_file\; echo {} ::: foo @@ -1107,7 +1080,6 @@ Warning: unknown mime-type for "Arguments @ARGV\n" -- using "application/octet-s Error: no such file "Arguments @ARGV\n" #!/usr/bin/parallel --shebang-wrap /usr/bin/python print 'Arguments', str(sys.argv) -/usr/bin/bash: -c: line 4: syntax error near unexpected token `(' /usr/bin/bash: -c: line 4: ` print 'Arguments', str(sys.argv)' #!/usr/bin/parallel --shebang-wrap /bin/bash echo Arguments "$@" @@ -1121,11 +1093,9 @@ Arguments #!/usr/bin/parallel --shebang-wrap /usr/bin/Rscript --vanilla --slave args <- commandArgs(trailingOnly = TRUE) print(paste("Arguments ",args)) -/usr/bin/bash: -c: line 3: syntax error near unexpected token `(' /usr/bin/bash: -c: line 3: ` args <- commandArgs(trailingOnly = TRUE)' #!/usr/bin/parallel --shebang-wrap ARG={} /usr/bin/gnuplot print "Arguments ", system('echo $ARG') -/usr/bin/bash: -c: line 3: syntax error near unexpected token `(' /usr/bin/bash: -c: line 3: ` print "Arguments ", system('echo $ARG')' #!/usr/bin/parallel --shebang-wrap /usr/bin/ruby print "Arguments " @@ -1140,7 +1110,6 @@ Error: no such file "Arguments " printf (" %s", arg_list{i}); endfor printf ("\n"); -/usr/bin/bash: -c: line 3: syntax error near unexpected token `"Arguments"' /usr/bin/bash: -c: line 3: ` printf ("Arguments");' #!/usr/bin/parallel --shebang-wrap /usr/bin/clisp (format t "~&~S~&" 'Arguments) @@ -1158,12 +1127,10 @@ Error: no such file "Arguments " ?> Arguments /usr/bin/bash: line 2: ?php: No such file or directory -/usr/bin/bash: -c: line 4: syntax error near unexpected token `array_slice' /usr/bin/bash: -c: line 4: ` foreach(array_slice($argv,1) as $v)' #!/usr/bin/parallel --shebang-wrap /usr/bin/node var myArgs = process.argv.slice(2); console.log('Arguments ', myArgs); -/usr/bin/bash: -c: line 1: syntax error near unexpected token `(' /usr/bin/bash: -c: line 1: ` var myArgs = process.argv.slice(2);' #!/usr/bin/parallel --shebang-wrap /usr/bin/lua io.write "Arguments" @@ -1173,12 +1140,10 @@ Arguments end print(") /usr/bin/bash: line 3: io.write: command not found -/usr/bin/bash: -c: line 4: syntax error near unexpected token `=' /usr/bin/bash: -c: line 4: ` for a = 1, #arg do' #!/usr/bin/parallel --shebang-wrap ARGV={} /usr/bin/csharp var argv = Environment.GetEnvironmentVariable("ARGV"); print("Arguments "+argv); -/usr/bin/bash: -c: line 3: syntax error near unexpected token `(' /usr/bin/bash: -c: line 3: ` var argv = Environment.GetEnvironmentVariable("ARGV");' sem 'sleep 1; echo The first finished' && echo The first is now running in the background &&