blob: b182c739ad4ae3648ae0891a0f1abb9a55ed3d4a (
plain) (
blame)
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
|
# Function to manage contents of PATH variable within the current shell
path() {
# Figure out command being called
local pathcmd=list
if (($#)) ; then
pathcmd=$1
shift
fi
# Switch between commands
case $pathcmd in
# Print help output (also done if command not found)
help|h|-h|--help|-\?)
printf '%s: Manage contents of PATH variable\n' "$FUNCNAME"
printf '\n'
printf 'USAGE:\n'
printf ' %s h[elp]\n' "$FUNCNAME"
printf ' Print this help message (also done if command not found)\n'
printf ' %s l[ist]\n' "$FUNCNAME"
printf ' Print the current dirs in PATH, one per line (default command)\n'
printf ' %s i[nsert] DIR\n' "$FUNCNAME"
printf ' Add a directory to the front of PATH, checking for existence and uniqueness\n'
printf ' %s a[ppend] DIR\n' "$FUNCNAME"
printf ' Add a directory to the end of PATH, checking for existence and uniqueness\n'
printf ' %s r[emove] DIR\n' "$FUNCNAME"
printf ' Remove all instances of a directory from PATH\n'
printf '\n'
printf 'INTERNALS:\n'
printf ' %s s[et] [DIR1 [DIR2...]]\n' "$FUNCNAME"
printf ' Set the PATH to the given directories without checking existence or uniqueness\n'
printf ' %s c[heck] DIR\n' "$FUNCNAME"
printf ' Return whether DIR is a component of PATH\n'
printf '\n'
;;
# Print the current contents of the path
list|l)
local -a patharr
IFS=: read -a patharr < <(printf '%s\n' "$PATH")
printf '%s\n' "${patharr[@]}"
;;
# Add a directory to the front of PATH, checking for existence and uniqueness
insert|i)
local -a patharr
IFS=: read -a patharr < <(printf '%s\n' "$PATH")
local dir=${1:?}
if [[ -z "$dir" ]] ; then
printf 'bash: %s: need a directory path to insert\n' \
"$FUNCNAME" >&2
return 1
fi
if [[ ! -d $dir ]] ; then
printf 'bash: %s: %s not a directory\n' \
"$FUNCNAME" "$dir" >&2
return 1
fi
if path check "$dir" ; then
printf 'bash: %s: %s already in PATH\n' \
"$FUNCNAME" "$dir" >&2
return 1
fi
patharr=("$dir" "${patharr[@]}")
path set "${patharr[@]}"
;;
# Add a directory to the end of PATH, checking for existence and uniqueness
append|add|a)
local -a patharr
IFS=: read -a patharr < <(printf '%s\n' "$PATH")
local dir=$1
if [[ -z "$dir" ]] ; then
printf 'bash: %s: need a directory path to append\n' \
"$FUNCNAME" >&2
return 1
fi
if [[ ! -d $dir ]] ; then
printf 'bash: %s: %s not a directory\n' \
"$FUNCNAME" "$dir" >&2
return 1
fi
if path check "$dir" ; then
printf 'bash: %s: %s already in PATH\n' \
"$FUNCNAME" "$dir" >&2
return 1
fi
patharr=("${patharr[@]}" "$dir")
path set "${patharr[@]}"
;;
# Remove all instances of a directory from PATH
remove|rm|r)
local -a patharr
IFS=: read -a patharr < <(printf '%s\n' "$PATH")
local dir=$1
if [[ -z "$dir" ]] ; then
printf 'bash: %s: need a directory path to remove\n' \
"$FUNCNAME" >&2
return 1
fi
if ! path check "$dir" ; then
printf 'bash: %s: %s not in PATH\n' \
"$FUNCNAME" "$dir" >&2
return 1
fi
local -a newpatharr
local part
for part in "${patharr[@]}" ; do
if [[ ${dir%/} != "${part%/}" ]] ; then
newpatharr=("${newpatharr[@]}" "$part")
fi
done
path set "${newpatharr[@]}"
;;
# Set the PATH to the given directories without checking existence or uniqueness
set|s)
local -a newpatharr
local part
for part in "$@" ; do
newpatharr=("${newpatharr[@]}" "${part%/}")
done
local IFS=:
PATH="${newpatharr[*]}"
;;
# Return whether DIR is a component of PATH
check|c)
local -a patharr
IFS=: read -a patharr < <(printf '%s\n' "$PATH")
local dir=${1:?}
if [[ -z "$dir" ]] ; then
printf 'bash: %s: need a directory path to check\n' \
"$FUNCNAME" >&2
return 1
fi
local part
for part in "${patharr[@]}" ; do
if [[ ${dir%/} == "${part%/}" ]] ; then
return 0
fi
done
return 1
;;
# Unknown command
*)
printf 'bash: %s: Unknown command %s\n' \
"$FUNCNAME" "$pathcmd" >&2
path help >&2
return 1
;;
esac
}
complete -W 'help list insert append remove set check' path
|