1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
#!/usr/bin/env pdksh
# This file must be sourced in pdksh:
#
# source `which env_parallel.pdksh`
#
# after which 'env_parallel' works
#
#
# 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
env_parallel() {
# env_parallel.pdksh
_names_of_ALIASES() {
compgen -a
}
_bodies_of_ALIASES() {
alias "$@" | perl -pe 's/^/alias /'
}
_names_of_FUNCTIONS() {
compgen -A function
}
_bodies_of_FUNCTIONS() {
typeset -f "$@"
}
_names_of_VARIABLES() {
compgen -A variable
}
_bodies_of_VARIABLES() {
typeset -p "$@"
}
_remove_bad_NAMES() {
_tmp_READONLY="$(mktemp)"
readonly > "$_tmp_READONLY"
# Do not transfer vars and funcs from env_parallel
grep -Ev '^(_names_of_ALIASES|_bodies_of_ALIASES|_names_of_maybe_FUNCTIONS|_names_of_FUNCTIONS|_bodies_of_FUNCTIONS|_names_of_VARIABLES|_bodies_of_VARIABLES|_remove_bad_NAMES|_prefix_PARALLEL_ENV|_get_ignored_VARS|_make_grep_REGEXP|_ignore_UNDERSCORE|_alias_NAMES|_list_alias_BODIES|_function_NAMES|_list_function_BODIES|_variable_NAMES|_list_variable_VALUES|_prefix_PARALLEL_ENV|PARALLEL_ENV|PARALLEL_TMP)$' |
# Filter names matching --env
grep -E "^$_grep_REGEXP"\$ | grep -vE "^$_ignore_UNDERSCORE"\$ |
grep -vFf $_tmp_READONLY |
grep -Ev '^(PIPESTATUS)'
rm $_tmp_READONLY
unset _tmp_READONLY
}
_prefix_PARALLEL_ENV() {
shopt 2>/dev/null |
perl -pe 's:\s+off:;: and s/^/shopt -u /;
s:\s+on:;: and s/^/shopt -s /;
s:;$:&>/dev/null;:';
echo 'shopt -s expand_aliases &>/dev/null';
}
_get_ignored_VARS() {
perl -e '
for(@ARGV){
$next_is_env and push @envvar, split/,/, $_;
$next_is_env=/^--env$/;
}
if(grep { /^_$/ } @envvar) {
if(not open(IN, "<", "$ENV{HOME}/.parallel/ignored_vars")) {
print STDERR "parallel: Error: ",
"Run \"parallel --record-env\" in a clean environment first.\n";
} else {
chomp(@ignored_vars = <IN>);
$vars = join "|",map { quotemeta $_ } @ignored_vars;
print $vars ? "($vars)" : "(,,nO,,VaRs,,)";
}
}
' -- "$@"
}
# Get the --env variables if set
# --env _ should be ignored
# and convert a b c to (a|b|c)
# If --env not set: Match everything (.*)
_make_grep_REGEXP() {
perl -e '
for(@ARGV){
/^_$/ and $next_is_env = 0;
$next_is_env and push @envvar, split/,/, $_;
$next_is_env = /^--env$/;
}
$vars = join "|",map { quotemeta $_ } @envvar;
print $vars ? "($vars)" : "(.*)";
' -- "$@"
}
if which parallel | grep 'no parallel in' >/dev/null; then
echo 'env_parallel: Error: parallel must be in $PATH.' >&2
return 1
fi
if which parallel >/dev/null; then
true which on linux
else
echo 'env_parallel: Error: parallel must be in $PATH.' >&2
return 1
fi
# Grep regexp for vars given by --env
_grep_REGEXP="`_make_grep_REGEXP \"$@\"`"
unset _make_grep_REGEXP
# Deal with --env _
_ignore_UNDERSCORE="`_get_ignored_VARS \"$@\"`"
unset _get_ignored_VARS
# --record-env
if perl -e 'exit grep { /^--record-env$/ } @ARGV' -- "$@"; then
true skip
else
(_names_of_ALIASES;
_names_of_FUNCTIONS;
_names_of_VARIABLES) |
cat > $HOME/.parallel/ignored_vars
return 0
fi
# Grep alias names
_alias_NAMES="`_names_of_ALIASES | _remove_bad_NAMES | xargs echo`"
_list_alias_BODIES="_bodies_of_ALIASES $_alias_NAMES"
if [ "$_alias_NAMES" = "" ] ; then
# no aliases selected
_list_alias_BODIES="true"
fi
unset _alias_NAMES
# Grep function names
_function_NAMES="`_names_of_FUNCTIONS | _remove_bad_NAMES | xargs echo`"
_list_function_BODIES="_bodies_of_FUNCTIONS $_function_NAMES"
if [ "$_function_NAMES" = "" ] ; then
# no functions selected
_list_function_BODIES="true"
fi
unset _function_NAMES
# Grep variable names
_variable_NAMES="`_names_of_VARIABLES | _remove_bad_NAMES | xargs echo`"
_list_variable_VALUES="_bodies_of_VARIABLES $_variable_NAMES"
if [ "$_variable_NAMES" = "" ] ; then
# no variables selected
_list_variable_VALUES="true"
fi
unset _variable_NAMES
# eval is needed for aliases - cannot explain why
export PARALLEL_ENV="`
eval $_list_alias_BODIES;
$_list_function_BODIES
$_list_variable_VALUES;
`";
unset _list_alias_BODIES _list_variable_VALUES _list_function_BODIES
unset _bodies_of_ALIASES _bodies_of_VARIABLES _bodies_of_FUNCTIONS
unset _names_of_ALIASES _names_of_VARIABLES _names_of_FUNCTIONS
unset _ignore_HARDCODED _ignore_READONLY _ignore_UNDERSCORE
unset _remove_bad_NAMES _grep_REGEXP
unset _prefix_PARALLEL_ENV
`which parallel` "$@"
_parallel_exit_CODE=$?
unset PARALLEL_ENV;
unset _which_PAR _which_TRUE
unset _warning_PAR _error_PAR
# Unset _parallel_exit_CODE before return
eval "unset _parallel_exit_CODE; return $_parallel_exit_CODE"
}
|