5
5
# If `after` is given, the dir is inserted after `after` in the `var`
6
6
# instead of at the end of var.
7
7
function ap() {
8
- local OPTARG OPTIND after= dir= nonempty=0 var=PATH verbose=0
8
+ local OPTARG OPTIND append after= dir= nonempty=0
9
+ local usage var=PATH vecho verbose=0
9
10
10
- ap_usage () {
11
- echo "usage: ap [-nv] [-p var ] [ after ] dir"
11
+ function usage () {
12
+ echo "usage: ap [-nv] [ -a after ] [-p var ] dir... "
12
13
echo ""
13
14
echo " -n only add if the directory is not empty"
14
15
echo " -v be verbose about what we do"
15
16
}
16
17
17
- vecho() {
18
+ function vecho() {
18
19
if [[ $verbose -eq 1 ]] ; then
19
20
echo "$@"
20
21
fi
21
22
}
22
23
23
- while getopts "hnp:v" opt
24
+ function append() {
25
+ local dir="$1"
26
+
27
+ if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
28
+ ("${!var}" =~ ":${dir}"$) ]]
29
+ then
30
+ vecho "${dir} is already in the ${var}"
31
+ return
32
+ fi
33
+
34
+ if [[ ! -d "${dir}" ]]; then
35
+ vecho "${dir} doesn't exist"
36
+ return
37
+ fi
38
+
39
+ if [[ ${nonempty} -eq 1 ]]; then
40
+ local dotglob=0
41
+ if [[ "$(shopt dotglob)" =~ on ]]; then
42
+ dotglob=1
43
+ fi
44
+ shopt -s dotglob
45
+ if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
46
+ vecho "${dir} is empty, not adding to ${var}"
47
+ if [[ $dotglob = 0 ]]; then
48
+ shopt -u dotglob
49
+ fi
50
+ return
51
+ else
52
+ if [[ $dotglob = 0 ]]; then
53
+ shopt -u dotglob
54
+ fi
55
+ fi
56
+ fi
57
+
58
+ if [[ "${after}" == "" ]]; then
59
+ export ${var}="${!var}:${dir}"
60
+ vecho "${dir} appended to ${var}"
61
+ return
62
+ fi
63
+
64
+ if [[ ( "${!var}" = "${after}" ) || ( "${!var}" =~ ^"${after}:" ) ]] then
65
+ export ${var}=${!var/${after}/"${after}:${dir}"}
66
+ vecho "${dir} added to ${var} after ${after}"
67
+ elif [[ "${!var}" =~ ":${after}:" ]] then
68
+ export ${var}=${!var/:${after}:/:"${after}:${dir}":}
69
+ vecho "${dir} added to ${var} after ${after}"
70
+ elif [[ "${!var}" =~ ":${after}"$ ]] then
71
+ export ${var}=${!var/:${after}/:"${after}:${dir}"}
72
+ vecho "${dir} added to ${var} after ${after}"
73
+ else
74
+ vecho "${after} isn't in the ${var}"
75
+ fi
76
+ }
77
+
78
+ while getopts "a:hnp:v" opt
24
79
do
25
80
case ${opt} in
81
+ a) after=${OPTARG} ;;
26
82
n) nonempty=1 ;;
27
83
p) var=${OPTARG} ;;
28
84
v) verbose=1 ;;
29
85
h | ?)
30
- ap_usage
86
+ usage
31
87
return
32
88
;;
33
89
esac
34
90
done
35
91
36
92
shift $(( $OPTIND - 1))
37
- if [[ $# -eq 2 ]]; then
38
- after=$1
39
- dir=$2
40
- elif [[ $# -eq 1 ]]; then
41
- dir=$1
42
- else
43
- ap_usage
44
- return
45
- fi
46
93
47
- if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
48
- ("${!var}" =~ ":${dir}"$) ]]
49
- then
50
- vecho "${dir} is already in the ${var}"
94
+ if [[ $# -eq 0 ]]; then
95
+ usage
51
96
return
52
97
fi
53
98
54
- if [[ ! -d "${dir}" ]]; then
55
- vecho "${dir} doesn't exist "
56
- return
99
+ if [[ ("${!var}" == "") && ("${after}" == "") ]]; then
100
+ export ${var}="$1 "
101
+ shift
57
102
fi
58
103
59
- if [[ ${nonempty} -eq 1 ]]; then
60
- local dotglob=0
61
- if [[ "$(shopt dotglob)" =~ on ]]; then
62
- dotglob=1
104
+ while [[ $# -gt 0 ]]; do
105
+ if [[ -d "$1" ]]; then
106
+ append "$1"
107
+ after="$1"
63
108
fi
64
- shopt -s dotglob
65
- if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
66
- vecho "${dir} is empty, not adding to ${var}"
67
- if [[ $dotglob = 0 ]]; then
68
- shopt -u dotglob
69
- fi
70
- return
71
- else
72
- if [[ $dotglob = 0 ]]; then
73
- shopt -u dotglob
74
- fi
75
- fi
76
- fi
77
-
78
- if [[ "${after}" == "" ]]; then
79
- export ${var}="${!var}:${dir}"
80
- vecho "${dir} appended to ${var}"
81
- return
82
- fi
83
-
84
- if [[ "${!var}" =~ "${after}" ]]; then
85
- export ${var}="${!var/${after}/"${after}:${dir}"}"
86
- vecho "${dir} added to ${var} after ${after}"
87
- else
88
- vecho "${after} isn't in the ${var}"
89
- fi
109
+ shift
110
+ done
90
111
}
91
112
92
113
function and() {
@@ -172,18 +193,20 @@ function home() {
172
193
cd "$HOME/$@"
173
194
}
174
195
175
- # ip - insert directory `dir` at the front of the `var` env variable if it's
176
- # not already there and `dir` exists .
196
+ # ip - insert directories `dir` at the front of the `var` env variable if
197
+ # they are not already in `var` and they exist .
177
198
# `var` defaults to PATH if not given
199
+ # `-b` inserts before `before` in `var`, rather than at the very
200
+ # front of `var`.
178
201
# `-n` requires `dir` to be nonempty
179
202
# `-v` be verbose about what happens
180
- # If `before` is given, the dir is inserted before `before` instead
181
- # of at the front of var.
182
203
function ip() {
183
- local OPTARG OPTIND before= dir= nonempty=0 usage var=PATH vecho verbose=0
204
+ local OPTARG OPTIND before= dir= nonempty=0 prepend usage var=PATH vecho
205
+ local opt_nonempty opt_v
206
+ local verbose=0
184
207
185
208
usage() {
186
- echo "usage: ip [-nv] [-p var] dir [ before ] "
209
+ echo "usage: ip [-nv] [ -b before ] [-p var] dir... "
187
210
echo ""
188
211
echo " -n only add if the directory is not empty"
189
212
echo " -v be verbose about what we do"
@@ -195,12 +218,63 @@ function ip() {
195
218
fi
196
219
}
197
220
198
- while getopts "hnp:v" opt
221
+ function prepend () {
222
+ local dir="$1"
223
+
224
+ if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
225
+ ("${!var}" =~ ":${dir}"$) ]]
226
+ then
227
+ vecho "${dir} is already in the ${var}"
228
+ return
229
+ fi
230
+
231
+ if [[ ! -d "${dir}" ]]; then
232
+ vecho "${dir} doesn't exist"
233
+ return
234
+ fi
235
+
236
+ if [[ ${nonempty} -eq 1 ]]; then
237
+ local dotglob=0
238
+ if [[ "$(shopt dotglob)" =~ on ]]; then
239
+ dotglob=1
240
+ fi
241
+ shopt -s dotglob
242
+ if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
243
+ vecho "${dir} is empty, not adding to ${var}"
244
+ if [[ $dotglob = 0 ]]; then
245
+ shopt -u dotglob
246
+ fi
247
+ return
248
+ else
249
+ if [[ $dotglob = 0 ]]; then
250
+ shopt -u dotglob
251
+ fi
252
+ fi
253
+ fi
254
+
255
+ if [[ "${before}" == "" ]]; then
256
+ export ${var}="${dir}:${!var}"
257
+ vecho "${dir} prepended to ${var}"
258
+ return
259
+ fi
260
+
261
+ if [[ "${!var}" =~ "${before}" ]]; then
262
+ export ${var}="${!var/${before}/"${dir}:${before}"}"
263
+ vecho "${dir} added to ${var} before ${before}"
264
+ else
265
+ vecho "${before} isn't in the ${var}"
266
+ fi
267
+
268
+ return
269
+ }
270
+
271
+ while getopts "b:hnp:v" opt
199
272
do
200
273
case ${opt} in
201
- n) nonempty=1 ;;
274
+ b) before=${OPTARG} ;;
275
+ n) nonempty=1 ; opt_nonempty="-n";;
202
276
p) var=${OPTARG} ;;
203
- v) verbose=1 ;;
277
+ v) verbose=1 ; opt_v="-v" ; ;
204
278
h | ?)
205
279
usage
206
280
return
@@ -209,61 +283,24 @@ function ip() {
209
283
done
210
284
211
285
shift $(( $OPTIND - 1))
212
- if [[ $# -eq 2 ]]; then
213
- dir=$1
214
- before=$2
215
- elif [[ $# -eq 1 ]]; then
216
- dir=$1
217
- else
286
+ if [[ $# -eq 0 ]]; then
218
287
usage
219
288
return
220
289
fi
221
290
222
- if [[ ("${!var}" =~ ":${dir}:") || ("${!var}" =~ ^"${dir}:") || \
223
- ("${!var}" =~ ":${dir}"$) ]]
224
- then
225
- vecho "${dir} is already in the ${var}"
226
- return
227
- fi
228
-
229
- if [[ ! -d "${dir}" ]]; then
230
- vecho "${dir} doesn't exist"
231
- return
232
- fi
233
-
234
- if [[ ${nonempty} -eq 1 ]]; then
235
- local dotglob=0
236
- if [[ "$(shopt dotglob)" =~ on ]]; then
237
- dotglob=1
238
- fi
239
- shopt -s dotglob
240
- if [[ $(echo -n "$dir/*") = "$dir/*" ]]; then
241
- vecho "${dir} is empty, not adding to ${var}"
242
- if [[ $dotglob = 0 ]]; then
243
- shopt -u dotglob
244
- fi
245
- return
246
- else
247
- if [[ $dotglob = 0 ]]; then
248
- shopt -u dotglob
249
- fi
250
- fi
251
- fi
252
-
253
- if [[ "${before}" == "" ]]; then
254
- export ${var}="${dir}:${!var}"
255
- vecho "${dir} prepended to ${var}"
256
- return
257
- fi
291
+ first="$1"
258
292
259
- if [[ "${!var}" =~ "${before}" ]]; then
260
- export ${var}="${!var/${before}/"${dir}:${before}" }"
261
- vecho "${dir} added to ${var} before ${before}"
293
+ if [[ ( "${!var}" == "") && ("${after}" == "") ]]; then
294
+ export ${var}="${first }"
295
+ shift
262
296
else
263
- vecho "${before} isn't in the ${var}"
297
+ prepend "${first}"
298
+ shift
264
299
fi
265
300
266
- return
301
+ if [[ $# -gt 0 ]]; then
302
+ ap -a "${first}" -p "${var}" $opt_nonempty $opt_v "$@"
303
+ fi
267
304
}
268
305
269
306
alias ls='ls -F'
@@ -299,36 +336,42 @@ function repeat() {
299
336
done
300
337
}
301
338
302
- # rp - remove path component
303
- # usage: rp [var] component
339
+ # rp - remove directories from path-like env var
340
+ # usage: rp [-p var] dir...
304
341
function rp() {
305
- # set -x
306
342
local comp var
343
+
307
344
if [ $# -eq 2 ]
308
345
then
309
- var=$1
346
+ var="$1"
310
347
shift
311
348
else
312
349
var=PATH
313
350
fi
314
- comp=$1
315
- if [[ "${!var}" =~ ^"$1:" ]]
316
- then
317
- # front
318
- export ${var}=${!var/#$comp:/}
319
- elif [[ "${!var}" =~ ":$1:" ]]
320
- then
321
- # middle
322
- export ${var}=${PATH/:$comp:/:}
323
- elif [[ "${!var}" =~ ":$1"$ ]]
324
- then
325
- # end
326
- export ${var}=${!var/%:$comp/}
327
- else
328
- # not found
329
- :
330
- fi
331
- # set +x
351
+
352
+ while [[ $# -gt 0 ]]; do
353
+ comp="$1"
354
+ if [[ "${!var}" = "${comp}" ]]
355
+ then
356
+ export ${!var}=
357
+ elif [[ "${!var}" =~ ^"${comp}:" ]]
358
+ then
359
+ # front
360
+ export ${var}=${!var/#${comp}:/}
361
+ elif [[ "${!var}" =~ ":${comp}:" ]]
362
+ then
363
+ # middle
364
+ export ${var}=${PATH/:${comp}:/:}
365
+ elif [[ "${!var}" =~ ":${comp}"$ ]]
366
+ then
367
+ # end
368
+ export ${var}=${!var/%:$comp/}
369
+ else
370
+ # not found
371
+ :
372
+ fi
373
+ shift
374
+ done
332
375
}
333
376
334
377
0 commit comments