summaryrefslogtreecommitdiffstats
path: root/src/parset
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xsrc/parset138
-rw-r--r--src/parset.pod327
2 files changed, 465 insertions, 0 deletions
diff --git a/src/parset b/src/parset
new file mode 100755
index 0000000..faf6a81
--- /dev/null
+++ b/src/parset
@@ -0,0 +1,138 @@
+#!/usr/bin/env bash
+
+# Copyright (C) 2016-2022 Ole Tange, http://ole.tange.dk 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
+#
+# SPDX-FileCopyrightText: 2021-2022 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+grepq() {
+ # grep -q for systems without -q
+ grep >/dev/null 2>/dev/null "$@"
+}
+
+installer() {
+ source="$1"
+ script="$2"
+ into="$3"
+ if grepq $script $into; then
+ true already installed
+ else
+ echo $source \`which $script\` >> $into
+ fi
+}
+
+while test $# -gt 0; do
+ key="$1"
+
+ case $key in
+ -i|--install)
+ installer . env_parallel.bash $HOME/.bashrc
+ installer . env_parallel.sh $HOME/.shrc
+ installer . env_parallel.zsh $HOME/.zshenv
+ installer source env_parallel.ksh $HOME/.kshrc
+ installer source env_parallel.mksh $HOME/.kshrc
+ echo $SHELL | grepq /pdksh &&
+ installer . env_parallel.pdksh $HOME/.profile
+ echo $SHELL | grepq /ash &&
+ installer . env_parallel.ash $HOME/.profile
+ echo $SHELL | grepq /dash &&
+ installer . env_parallel.dash $HOME/.profile
+ installer source env_parallel.csh $HOME/.cshrc
+ installer source env_parallel.tcsh $HOME/.tcshrc
+ mkdir -p $HOME/.config/fish
+ grepq env_parallel.fish $HOME/.config/fish/config.fish ||
+ echo '. (which env_parallel.fish)' >> $HOME/.config/fish/config.fish
+ echo 'Installed env_parallel in:'
+ echo " " $HOME/.bashrc
+ echo " " $HOME/.shrc
+ echo " " $HOME/.zshenv
+ echo " " $HOME/.config/fish/config.fish
+ echo " " $HOME/.kshrc
+ echo " " $HOME/.mkshrc
+ echo " " $HOME/.profile
+ echo " " $HOME/.cshrc
+ echo " " $HOME/.tcshrc
+ exit
+ ;;
+ *)
+ echo "Unknown option: $key"
+ ;;
+ esac
+ shift # past argument or value
+done
+
+
+cat <<'_EOS'
+
+parset only works if it is a function. The function is defined as part
+of env_parallel.
+
+Do the below and restart your shell.
+
+bash: Put this in $HOME/.bashrc: . `which env_parallel.bash`
+ E.g. by doing: echo '. `which env_parallel.bash`' >> $HOME/.bashrc
+ Supports: variables, aliases, functions, arrays
+
+ksh: Put this in $HOME/.kshrc: source `which env_parallel.ksh`
+ E.g. by doing: echo 'source `which env_parallel.ksh`' >> $HOME/.kshrc
+ Supports: variables, aliases, functions, arrays
+
+mksh: Put this in $HOME/.mkshrc: source `which env_parallel.mksh`
+ E.g. by doing: echo 'source `which env_parallel.mksh`' >> $HOME/.mkshrc
+ Supports: variables, aliases, functions, arrays
+
+pdksh: Put this in $HOME/.profile: source `which env_parallel.pdksh`
+ E.g. by doing: echo '. `which env_parallel.pdksh`' >> $HOME/.profile
+ Supports: variables, aliases, functions, arrays
+
+zsh: Put this in $HOME/.zshrc: . `which env_parallel.zsh`
+ E.g. by doing: echo '. `which env_parallel.zsh`' >> $HOME/.zshenv
+ Supports: variables, functions, arrays
+
+ash: Put this in $HOME/.profile: . `which env_parallel.ash`
+ E.g. by doing: echo '. `which env_parallel.ash`' >> $HOME/.profile
+ Supports: variables, aliases
+
+dash: Put this in $HOME/.profile: . `which env_parallel.dash`
+ E.g. by doing: echo '. `which env_parallel.dash`' >> $HOME/.profile
+ Supports: variables, aliases
+
+fish: Unsupported
+
+csh: Unsupported
+
+tcsh: Unsupported
+
+To install in all shells run:
+
+ parset --install
+
+In a script you need to run this before using parset:
+
+bash: . `which env_parallel.bash`
+ksh: source `which env_parallel.ksh`
+mksh: source `which env_parallel.mksh`
+pdksh: source `which env_parallel.pdksh`
+zsh: . `which env_parallel.zsh`
+ash: . `which env_parallel.ash`
+dash: . `which env_parallel.dash`
+
+For details: see man parset
+
+_EOS
diff --git a/src/parset.pod b/src/parset.pod
new file mode 100644
index 0000000..cb95ec6
--- /dev/null
+++ b/src/parset.pod
@@ -0,0 +1,327 @@
+#!/usr/bin/perl -w
+
+# SPDX-FileCopyrightText: 2021-2022 Ole Tange, http://ole.tange.dk and Free Software and Foundation, Inc.
+# SPDX-License-Identifier: GFDL-1.3-or-later
+# SPDX-License-Identifier: CC-BY-SA-4.0
+
+=encoding utf8
+
+=head1 NAME
+
+parset - set shell variables in parallel
+
+
+=head1 SYNOPSIS
+
+B<parset> I<variablename> [options for GNU Parallel]
+
+B<env_parset> I<variablename> [options for GNU Parallel]
+
+=head1 DESCRIPTION
+
+B<parset> is a shell function that puts the output from GNU
+B<parallel> into shell variables.
+
+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>.
+
+If I<variablename> is a single variable name, this will be treated as
+the destination variable. If the variable is defined as an associative
+array (using B<typeset -A myassoc>), this will be used. Otherwise the
+variable will be made into a normal array.
+
+If I<variablename> contains multiple names separated by ',' or space,
+the names will be the destination variables. The number of names must
+be at least the number of jobs.
+
+
+=head1 OPTIONS
+
+Same as GNU B<parallel>, but they are put I<after> the destination
+variable.
+
+
+=head1 SUPPORTED SHELLS
+
+=head2 Bash/Zsh/Ksh/Mksh
+
+=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"
+
+Put output into associative array B<myassoc> (not supported for mksh):
+
+ typeset -A myassoc
+ parset myassoc seq ::: 4 5 ::: 6 7
+ echo "${myassoc[4 7]}"
+
+The commands to run can be an array:
+
+ cmd=("echo first" "echo '<<joe \"double space\" cartoon>>'" "pwd")
+ parset data ::: "${cmd[@]}"
+ echo "${data[1]}"
+ echo "${data[2]}"
+
+B<parset> can read from stdin (standard input) if it is a file:
+
+ parset res echo < parallel_input_file
+
+but B<parset> can I<not> be part of a pipe. In particular this means
+it cannot read from a pipe or write to a pipe:
+
+ seq 10 | parset res echo Does not work
+
+but must instead use a tempfile:
+
+ seq 10 > parallel_input
+ parset res echo :::: parallel_input
+ echo "${res[1]}"
+ echo "${res[9]}"
+
+or a FIFO:
+
+ mkfifo input_fifo
+ seq 30 > input_fifo &
+ parset res echo :::: input_fifo
+ echo "${res[1]}"
+ echo "${res[29]}"
+
+or Bash/Zsh/Ksh process substitution:
+
+ parset res echo :::: <(seq 100)
+ echo "${res[1]}"
+ echo "${res[99]}"
+
+
+=head3 Installation
+
+Put this in the relevant B<$HOME/.bashrc> or B<$HOME/.zshenv> or B<$HOME/.kshrc>:
+
+ . `which env_parallel.bash`
+ . `which env_parallel.zsh`
+ source `which env_parallel.ksh`
+
+E.g. by doing:
+
+ echo '. `which env_parallel.bash`' >> $HOME/.bashrc
+ 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"
+
+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:
+
+ 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
+ echo "$res1"
+ echo "$res2"
+ echo "$res3"
+
+or a FIFO:
+
+ mkfifo input_fifo
+ seq 3 > input_fifo &
+ parset res1,res2,res3 echo :::: input_fifo
+ echo "$res1"
+ echo "$res2"
+ echo "$res3"
+
+=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
+
+
+=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
+
+Copyright (C) 2008-2010 Ole Tange, http://ole.tange.dk
+
+Copyright (C) 2010-2022 Ole Tange, http://ole.tange.dk and Free
+Software Foundation, Inc.
+
+
+=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 LICENSES/GFDL-1.3-or-later.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
+LICENCES/CC-BY-SA-4.0.txt
+
+=head1 DEPENDENCIES
+
+B<parset> uses GNU B<parallel>.
+
+
+=head1 SEE ALSO
+
+B<parallel>(1), B<env_parallel>(1), B<bash>(1).
+
+
+=cut