2017-04-14 22:00:21 +00:00
|
|
|
#!/usr/bin/perl -w
|
|
|
|
|
|
|
|
=encoding utf8
|
|
|
|
|
|
|
|
=head1 NAME
|
|
|
|
|
|
|
|
parset - set shell variables in parallel
|
|
|
|
|
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
|
|
|
|
B<parset> I<variablename> [options for GNU Parallel]
|
|
|
|
|
2018-03-24 23:19:08 +00:00
|
|
|
B<env_parset> I<variablename> [options for GNU Parallel]
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
|
|
|
|
B<parset> is a shell function that puts the output from GNU
|
|
|
|
B<parallel> into shell variables.
|
|
|
|
|
2017-11-26 15:18:55 +00:00
|
|
|
B<env_parset> is a shell function that puts the output from
|
|
|
|
B<env_parallel> into shell variables.
|
|
|
|
|
|
|
|
The B<parset> and B<env_parset> functions are defined as part of
|
|
|
|
B<env_parallel>.
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
If I<variablename> is a single variable name, this will be treated as
|
2017-06-29 02:21:44 +00:00
|
|
|
the destination variable and made into an array.
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
If I<variablename> contains multiple names separated by ',' or space,
|
2018-08-26 23:54:11 +00:00
|
|
|
the names will be the destination variables. The number of names must
|
|
|
|
be at least the number of jobs - otherwise some tmp files will not be
|
|
|
|
cleaned up.
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
=head1 OPTIONS
|
|
|
|
|
2017-04-17 14:25:58 +00:00
|
|
|
Same as GNU B<parallel>, but they are put I<after> the destination
|
|
|
|
variable.
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
=head1 SUPPORTED SHELLS
|
|
|
|
|
2018-08-26 23:54:11 +00:00
|
|
|
=head2 Bash/Zsh/Ksh/Mksh
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
=head3 Examples
|
|
|
|
|
|
|
|
Put output into B<myarray>:
|
|
|
|
|
|
|
|
parset myarray seq 3 ::: 4 5 6
|
|
|
|
echo "${myarray[1]}"
|
|
|
|
|
|
|
|
Put output into vars B<$seq, $pwd, $ls>:
|
|
|
|
|
|
|
|
parset "seq pwd ls" ::: "seq 10" pwd ls
|
|
|
|
echo "$ls"
|
|
|
|
|
|
|
|
Put output into vars B<$seq, $pwd, $ls>:
|
|
|
|
|
|
|
|
into_vars=(seq pwd ls)
|
|
|
|
parset "${into_vars[*]}" ::: "seq 10" pwd ls
|
|
|
|
echo "$ls"
|
2017-07-20 19:38:45 +00:00
|
|
|
|
2017-04-14 22:00:21 +00:00
|
|
|
The commands to run can be an array:
|
|
|
|
|
2017-11-26 15:18:55 +00:00
|
|
|
cmd=("echo first" "echo '<<joe \"double space\" cartoon>>'" "pwd")
|
2017-04-14 22:00:21 +00:00
|
|
|
parset data ::: "${cmd[@]}"
|
|
|
|
echo "${data[1]}"
|
2017-11-26 15:18:55 +00:00
|
|
|
echo "${data[2]}"
|
2017-07-20 19:38:45 +00:00
|
|
|
|
2019-06-16 23:21:45 +00:00
|
|
|
B<parset> can read from stdin (standard input) if it is a file:
|
|
|
|
|
|
|
|
parset res echo < parallel_input_file
|
|
|
|
|
|
|
|
but B<parset> can not be part of a pipe. In particular this means it
|
|
|
|
cannot read from a pipe or write to a pipe:
|
2017-07-20 19:38:45 +00:00
|
|
|
|
|
|
|
seq 10 | parset res echo Does not work
|
|
|
|
|
|
|
|
but must instead use a tempfile:
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
seq 10 > parallel_input
|
|
|
|
parset res echo :::: parallel_input
|
2017-11-26 15:18:55 +00:00
|
|
|
echo "${res[1]}"
|
2017-04-14 22:00:21 +00:00
|
|
|
echo "${res[9]}"
|
2017-06-29 02:21:44 +00:00
|
|
|
|
2017-07-20 19:38:45 +00:00
|
|
|
or a FIFO:
|
|
|
|
|
|
|
|
mkfifo input_fifo
|
|
|
|
seq 30 > input_fifo &
|
|
|
|
parset res echo :::: input_fifo
|
2017-11-26 15:18:55 +00:00
|
|
|
echo "${res[1]}"
|
2017-07-20 19:38:45 +00:00
|
|
|
echo "${res[29]}"
|
|
|
|
|
2017-11-26 15:18:55 +00:00
|
|
|
or Bash/Zsh/Ksh process substitution:
|
2017-06-29 02:21:44 +00:00
|
|
|
|
|
|
|
parset res echo :::: <(seq 100)
|
2017-11-26 15:18:55 +00:00
|
|
|
echo "${res[1]}"
|
2017-06-29 02:21:44 +00:00
|
|
|
echo "${res[99]}"
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
=head3 Installation
|
|
|
|
|
2017-11-26 15:18:55 +00:00
|
|
|
Put this in the relevant B<$HOME/.bashrc> or B<$HOME/.zshenv> or B<$HOME/.kshrc>:
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
. `which env_parallel.bash`
|
2017-11-26 15:18:55 +00:00
|
|
|
. `which env_parallel.zsh`
|
|
|
|
source `which env_parallel.ksh`
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
E.g. by doing:
|
|
|
|
|
|
|
|
echo '. `which env_parallel.bash`' >> $HOME/.bashrc
|
2017-11-26 15:18:55 +00:00
|
|
|
echo '. `which env_parallel.zsh`' >> $HOME/.zshenv
|
|
|
|
echo 'source `which env_parallel.ksh`' >> $HOME/.kshrc
|
|
|
|
|
|
|
|
or by doing:
|
|
|
|
|
|
|
|
env_parallel --install
|
|
|
|
|
|
|
|
|
|
|
|
=head2 ash/dash (FreeBSD's /bin/sh)
|
|
|
|
|
|
|
|
=head3 Examples
|
|
|
|
|
|
|
|
ash does not support arrays.
|
|
|
|
|
|
|
|
Put output into vars B<$seq, $pwd, $ls>:
|
|
|
|
|
|
|
|
parset "seq pwd ls" ::: "seq 10" pwd ls
|
|
|
|
echo "$ls"
|
|
|
|
|
2019-06-16 23:21:45 +00:00
|
|
|
B<parset> can read from stdin (standard input) if it is a file:
|
|
|
|
|
|
|
|
parset res1,res2,res3 echo < parallel_input_file
|
|
|
|
|
|
|
|
but B<parset> can not be part of a pipe. In particular this means it
|
|
|
|
cannot read from a pipe or write to a pipe:
|
2017-11-26 15:18:55 +00:00
|
|
|
|
|
|
|
seq 3 | parset res1,res2,res3 echo Does not work
|
|
|
|
|
|
|
|
but must instead use a tempfile:
|
|
|
|
|
|
|
|
seq 3 > parallel_input
|
|
|
|
parset res1,res2,res3 echo :::: parallel_input
|
2018-01-14 04:27:48 +00:00
|
|
|
echo "$res1"
|
|
|
|
echo "$res2"
|
|
|
|
echo "$res3"
|
2017-11-26 15:18:55 +00:00
|
|
|
|
|
|
|
or a FIFO:
|
|
|
|
|
|
|
|
mkfifo input_fifo
|
|
|
|
seq 3 > input_fifo &
|
|
|
|
parset res1,res2,res3 echo :::: input_fifo
|
2018-01-14 04:27:48 +00:00
|
|
|
echo "$res1"
|
|
|
|
echo "$res2"
|
|
|
|
echo "$res3"
|
2017-11-26 15:18:55 +00:00
|
|
|
|
|
|
|
=head3 Installation
|
|
|
|
|
|
|
|
Put the relevant one of these into B<$HOME/.profile>:
|
|
|
|
|
|
|
|
. `which env_parallel.sh`
|
|
|
|
. `which env_parallel.ash`
|
|
|
|
. `which env_parallel.dash`
|
|
|
|
|
|
|
|
E.g. by doing:
|
|
|
|
|
|
|
|
echo '. `which env_parallel.ash`' >> $HOME/.bashrc
|
|
|
|
|
|
|
|
or by doing:
|
|
|
|
|
|
|
|
env_parallel --install
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
=head1 EXIT STATUS
|
|
|
|
|
|
|
|
Same as GNU B<parallel>.
|
|
|
|
|
|
|
|
|
|
|
|
=head1 AUTHOR
|
|
|
|
|
|
|
|
When using GNU B<parallel> for a publication please cite:
|
|
|
|
|
|
|
|
O. Tange (2011): GNU Parallel - The Command-Line Power Tool, ;login:
|
|
|
|
The USENIX Magazine, February 2011:42-47.
|
|
|
|
|
|
|
|
This helps funding further development; and it won't cost you a cent.
|
|
|
|
If you pay 10000 EUR you should feel free to use GNU Parallel without citing.
|
|
|
|
|
|
|
|
Copyright (C) 2007-10-18 Ole Tange, http://ole.tange.dk
|
|
|
|
|
2018-09-06 15:00:29 +00:00
|
|
|
Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
|
2017-04-14 22:00:21 +00:00
|
|
|
|
2020-12-30 12:42:02 +00:00
|
|
|
Copyright (C) 2010-2021 Ole Tange, http://ole.tange.dk and Free
|
2018-12-28 11:47:25 +00:00
|
|
|
Software Foundation, Inc.
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
=head1 LICENSE
|
|
|
|
|
|
|
|
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/>.
|
|
|
|
|
|
|
|
=head2 Documentation license I
|
|
|
|
|
|
|
|
Permission is granted to copy, distribute and/or modify this documentation
|
|
|
|
under the terms of the GNU Free Documentation License, Version 1.3 or
|
|
|
|
any later version published by the Free Software Foundation; with no
|
|
|
|
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
|
|
|
|
Texts. A copy of the license is included in the file fdl.txt.
|
|
|
|
|
|
|
|
=head2 Documentation license II
|
|
|
|
|
|
|
|
You are free:
|
|
|
|
|
|
|
|
=over 9
|
|
|
|
|
|
|
|
=item B<to Share>
|
|
|
|
|
|
|
|
to copy, distribute and transmit the work
|
|
|
|
|
|
|
|
=item B<to Remix>
|
|
|
|
|
|
|
|
to adapt the work
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
Under the following conditions:
|
|
|
|
|
|
|
|
=over 9
|
|
|
|
|
|
|
|
=item B<Attribution>
|
|
|
|
|
|
|
|
You must attribute the work in the manner specified by the author or
|
|
|
|
licensor (but not in any way that suggests that they endorse you or
|
|
|
|
your use of the work).
|
|
|
|
|
|
|
|
=item B<Share Alike>
|
|
|
|
|
|
|
|
If you alter, transform, or build upon this work, you may distribute
|
|
|
|
the resulting work only under the same, similar or a compatible
|
|
|
|
license.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
With the understanding that:
|
|
|
|
|
|
|
|
=over 9
|
|
|
|
|
|
|
|
=item B<Waiver>
|
|
|
|
|
|
|
|
Any of the above conditions can be waived if you get permission from
|
|
|
|
the copyright holder.
|
|
|
|
|
|
|
|
=item B<Public Domain>
|
|
|
|
|
|
|
|
Where the work or any of its elements is in the public domain under
|
|
|
|
applicable law, that status is in no way affected by the license.
|
|
|
|
|
|
|
|
=item B<Other Rights>
|
|
|
|
|
|
|
|
In no way are any of the following rights affected by the license:
|
|
|
|
|
|
|
|
=over 2
|
|
|
|
|
|
|
|
=item *
|
|
|
|
|
|
|
|
Your fair dealing or fair use rights, or other applicable
|
|
|
|
copyright exceptions and limitations;
|
|
|
|
|
|
|
|
=item *
|
|
|
|
|
|
|
|
The author's moral rights;
|
|
|
|
|
|
|
|
=item *
|
|
|
|
|
|
|
|
Rights other persons may have either in the work itself or in
|
|
|
|
how the work is used, such as publicity or privacy rights.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
=over 9
|
|
|
|
|
|
|
|
=item B<Notice>
|
|
|
|
|
|
|
|
For any reuse or distribution, you must make clear to others the
|
|
|
|
license terms of this work.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
A copy of the full license is included in the file as cc-by-sa.txt.
|
|
|
|
|
|
|
|
|
|
|
|
=head1 DEPENDENCIES
|
|
|
|
|
2017-04-17 14:25:58 +00:00
|
|
|
B<parset> uses GNU B<parallel>.
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
=head1 SEE ALSO
|
|
|
|
|
2017-04-30 17:00:37 +00:00
|
|
|
B<parallel>(1), B<env_parallel>(1), B<bash>(1).
|
2017-04-14 22:00:21 +00:00
|
|
|
|
|
|
|
|
|
|
|
=cut
|