]>
Commit | Line | Data |
---|---|---|
726f6388 JA |
1 | This file is alias.def, from which is created alias.c |
2 | It implements the builtins "alias" and "unalias" in Bash. | |
3 | ||
3185942a | 4 | Copyright (C) 1987-2009 Free Software Foundation, Inc. |
726f6388 JA |
5 | |
6 | This file is part of GNU Bash, the Bourne Again SHell. | |
7 | ||
3185942a JA |
8 | Bash is free software: you can redistribute it and/or modify |
9 | it under the terms of the GNU General Public License as published by | |
10 | the Free Software Foundation, either version 3 of the License, or | |
11 | (at your option) any later version. | |
726f6388 | 12 | |
3185942a JA |
13 | Bash is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
726f6388 | 17 | |
3185942a JA |
18 | You should have received a copy of the GNU General Public License |
19 | along with Bash. If not, see <http://www.gnu.org/licenses/>. | |
726f6388 JA |
20 | |
21 | $BUILTIN alias | |
22 | $FUNCTION alias_builtin | |
23 | $DEPENDS_ON ALIAS | |
24 | $PRODUCES alias.c | |
ccc6cda3 | 25 | $SHORT_DOC alias [-p] [name[=value] ... ] |
3185942a JA |
26 | Define or display aliases. |
27 | ||
28 | Without arguments, `alias' prints the list of aliases in the reusable | |
29 | form `alias NAME=VALUE' on standard output. | |
30 | ||
ccc6cda3 JA |
31 | Otherwise, an alias is defined for each NAME whose VALUE is given. |
32 | A trailing space in VALUE causes the next word to be checked for | |
3185942a JA |
33 | alias substitution when the alias is expanded. |
34 | ||
35 | Options: | |
36 | -p Print all defined aliases in a reusable format | |
37 | ||
38 | Exit Status: | |
39 | alias returns true unless a NAME is supplied for which no alias has been | |
40 | defined. | |
726f6388 JA |
41 | $END |
42 | ||
ccc6cda3 | 43 | #include <config.h> |
726f6388 JA |
44 | |
45 | #if defined (ALIAS) | |
ccc6cda3 JA |
46 | |
47 | #if defined (HAVE_UNISTD_H) | |
cce855bc JA |
48 | # ifdef _MINIX |
49 | # include <sys/types.h> | |
50 | # endif | |
ccc6cda3 JA |
51 | # include <unistd.h> |
52 | #endif | |
53 | ||
d166f048 | 54 | # include "../bashansi.h" |
b80f6443 | 55 | # include "../bashintl.h" |
d166f048 | 56 | |
726f6388 JA |
57 | # include <stdio.h> |
58 | # include "../shell.h" | |
59 | # include "../alias.h" | |
60 | # include "common.h" | |
ccc6cda3 | 61 | # include "bashgetopt.h" |
726f6388 | 62 | |
b80f6443 JA |
63 | /* Flags for print_alias */ |
64 | #define AL_REUSABLE 0x01 | |
65 | ||
66 | static void print_alias __P((alias_t *, int)); | |
67 | ||
68 | extern int posixly_correct; | |
726f6388 JA |
69 | |
70 | /* Hack the alias command in a Korn shell way. */ | |
ccc6cda3 | 71 | int |
726f6388 JA |
72 | alias_builtin (list) |
73 | WORD_LIST *list; | |
74 | { | |
b80f6443 | 75 | int any_failed, offset, pflag, dflags; |
ccc6cda3 JA |
76 | alias_t **alias_list, *t; |
77 | char *name, *value; | |
726f6388 | 78 | |
b80f6443 | 79 | dflags = posixly_correct ? 0 : AL_REUSABLE; |
ccc6cda3 JA |
80 | pflag = 0; |
81 | reset_internal_getopt (); | |
82 | while ((offset = internal_getopt (list, "p")) != -1) | |
726f6388 | 83 | { |
ccc6cda3 JA |
84 | switch (offset) |
85 | { | |
86 | case 'p': | |
87 | pflag = 1; | |
b80f6443 | 88 | dflags |= AL_REUSABLE; |
ccc6cda3 JA |
89 | break; |
90 | default: | |
91 | builtin_usage (); | |
92 | return (EX_USAGE); | |
93 | } | |
94 | } | |
726f6388 | 95 | |
ccc6cda3 JA |
96 | list = loptend; |
97 | ||
98 | if (list == 0 || pflag) | |
99 | { | |
100 | if (aliases == 0) | |
cce855bc | 101 | return (EXECUTION_SUCCESS); |
726f6388 JA |
102 | |
103 | alias_list = all_aliases (); | |
104 | ||
ccc6cda3 | 105 | if (alias_list == 0) |
cce855bc | 106 | return (EXECUTION_SUCCESS); |
726f6388 | 107 | |
ccc6cda3 | 108 | for (offset = 0; alias_list[offset]; offset++) |
b80f6443 | 109 | print_alias (alias_list[offset], dflags); |
726f6388 JA |
110 | |
111 | free (alias_list); /* XXX - Do not free the strings. */ | |
ccc6cda3 JA |
112 | |
113 | if (list == 0) | |
3185942a | 114 | return (sh_chkwrite (EXECUTION_SUCCESS)); |
726f6388 | 115 | } |
ccc6cda3 JA |
116 | |
117 | any_failed = 0; | |
118 | while (list) | |
726f6388 | 119 | { |
ccc6cda3 | 120 | name = list->word->word; |
726f6388 | 121 | |
ccc6cda3 JA |
122 | for (offset = 0; name[offset] && name[offset] != '='; offset++) |
123 | ; | |
726f6388 | 124 | |
ccc6cda3 JA |
125 | if (offset && name[offset] == '=') |
126 | { | |
127 | name[offset] = '\0'; | |
128 | value = name + offset + 1; | |
726f6388 | 129 | |
b80f6443 JA |
130 | if (legal_alias_name (name, 0) == 0) |
131 | { | |
132 | builtin_error (_("`%s': invalid alias name"), name); | |
133 | any_failed++; | |
134 | } | |
135 | else | |
136 | add_alias (name, value); | |
ccc6cda3 JA |
137 | } |
138 | else | |
139 | { | |
140 | t = find_alias (name); | |
141 | if (t) | |
b80f6443 | 142 | print_alias (t, dflags); |
726f6388 JA |
143 | else |
144 | { | |
7117c2d2 | 145 | sh_notfound (name); |
ccc6cda3 | 146 | any_failed++; |
726f6388 | 147 | } |
726f6388 | 148 | } |
ccc6cda3 | 149 | list = list->next; |
726f6388 | 150 | } |
ccc6cda3 JA |
151 | |
152 | return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS); | |
726f6388 JA |
153 | } |
154 | #endif /* ALIAS */ | |
155 | ||
156 | $BUILTIN unalias | |
157 | $FUNCTION unalias_builtin | |
158 | $DEPENDS_ON ALIAS | |
b80f6443 | 159 | $SHORT_DOC unalias [-a] name [name ...] |
3185942a JA |
160 | Remove each NAME from the list of defined aliases. |
161 | ||
162 | Options: | |
163 | -a remove all alias definitions. | |
164 | ||
165 | Return success unless a NAME is not an existing alias. | |
726f6388 JA |
166 | $END |
167 | ||
168 | #if defined (ALIAS) | |
169 | /* Remove aliases named in LIST from the aliases database. */ | |
ccc6cda3 | 170 | int |
726f6388 JA |
171 | unalias_builtin (list) |
172 | register WORD_LIST *list; | |
173 | { | |
ccc6cda3 JA |
174 | register alias_t *alias; |
175 | int opt, aflag; | |
726f6388 | 176 | |
ccc6cda3 JA |
177 | aflag = 0; |
178 | reset_internal_getopt (); | |
179 | while ((opt = internal_getopt (list, "a")) != -1) | |
726f6388 | 180 | { |
ccc6cda3 | 181 | switch (opt) |
726f6388 | 182 | { |
ccc6cda3 JA |
183 | case 'a': |
184 | aflag = 1; | |
726f6388 | 185 | break; |
ccc6cda3 JA |
186 | default: |
187 | builtin_usage (); | |
188 | return (EX_USAGE); | |
726f6388 | 189 | } |
726f6388 JA |
190 | } |
191 | ||
ccc6cda3 JA |
192 | list = loptend; |
193 | ||
194 | if (aflag) | |
195 | { | |
196 | delete_all_aliases (); | |
197 | return (EXECUTION_SUCCESS); | |
198 | } | |
199 | ||
b80f6443 JA |
200 | if (list == 0) |
201 | { | |
202 | builtin_usage (); | |
203 | return (EX_USAGE); | |
204 | } | |
205 | ||
ccc6cda3 | 206 | aflag = 0; |
726f6388 JA |
207 | while (list) |
208 | { | |
209 | alias = find_alias (list->word->word); | |
210 | ||
211 | if (alias) | |
212 | remove_alias (alias->name); | |
213 | else | |
214 | { | |
7117c2d2 | 215 | sh_notfound (list->word->word); |
ccc6cda3 | 216 | aflag++; |
726f6388 JA |
217 | } |
218 | ||
219 | list = list->next; | |
220 | } | |
221 | ||
ccc6cda3 | 222 | return (aflag ? EXECUTION_FAILURE : EXECUTION_SUCCESS); |
726f6388 JA |
223 | } |
224 | ||
225 | /* Output ALIAS in such a way as to allow it to be read back in. */ | |
226 | static void | |
b80f6443 | 227 | print_alias (alias, flags) |
ccc6cda3 | 228 | alias_t *alias; |
b80f6443 | 229 | int flags; |
726f6388 | 230 | { |
ccc6cda3 | 231 | char *value; |
726f6388 | 232 | |
28ef6c31 | 233 | value = sh_single_quote (alias->value); |
b80f6443 JA |
234 | if (flags & AL_REUSABLE) |
235 | printf ("alias "); | |
236 | printf ("%s=%s\n", alias->name, value); | |
726f6388 JA |
237 | free (value); |
238 | ||
239 | fflush (stdout); | |
240 | } | |
241 | #endif /* ALIAS */ |