]> git.ipfire.org Git - thirdparty/bash.git/blame - builtins/alias.def
Imported from ../bash-4.0-rc1.tar.gz.
[thirdparty/bash.git] / builtins / alias.def
CommitLineData
726f6388
JA
1This file is alias.def, from which is created alias.c
2It implements the builtins "alias" and "unalias" in Bash.
3
3185942a 4Copyright (C) 1987-2009 Free Software Foundation, Inc.
726f6388
JA
5
6This file is part of GNU Bash, the Bourne Again SHell.
7
3185942a
JA
8Bash is free software: you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation, either version 3 of the License, or
11(at your option) any later version.
726f6388 12
3185942a
JA
13Bash is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
726f6388 17
3185942a
JA
18You should have received a copy of the GNU General Public License
19along 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
26Define or display aliases.
27
28Without arguments, `alias' prints the list of aliases in the reusable
29form `alias NAME=VALUE' on standard output.
30
ccc6cda3
JA
31Otherwise, an alias is defined for each NAME whose VALUE is given.
32A trailing space in VALUE causes the next word to be checked for
3185942a
JA
33alias substitution when the alias is expanded.
34
35Options:
36 -p Print all defined aliases in a reusable format
37
38Exit Status:
39alias returns true unless a NAME is supplied for which no alias has been
40defined.
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
66static void print_alias __P((alias_t *, int));
67
68extern int posixly_correct;
726f6388
JA
69
70/* Hack the alias command in a Korn shell way. */
ccc6cda3 71int
726f6388
JA
72alias_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
160Remove each NAME from the list of defined aliases.
161
162Options:
163 -a remove all alias definitions.
164
165Return 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 170int
726f6388
JA
171unalias_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. */
226static void
b80f6443 227print_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 */