1 This file is type.def, from which is created type.c.
2 It implements the builtin "type" in Bash.
4 Copyright (C) 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
6 This file is part of GNU Bash, the Bourne Again SHell.
8 Bash is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 1, or (at your option) any later
13 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License along
19 with Bash; see the file COPYING. If not, write to the Free Software
20 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
25 $FUNCTION type_builtin
26 $SHORT_DOC type [-apt] name [name ...]
27 For each NAME, indicate how it would be interpreted if used as a
30 If the -t option is used, returns a single word which is one of
31 `alias', `keyword', `function', `builtin', `file' or `', if NAME is an
32 alias, shell reserved word, shell function, shell builtin, disk file,
33 or unfound, respectively.
35 If the -p flag is used, either returns the name of the disk file
36 that would be executed, or nothing if -t would not return `file'.
38 If the -a flag is used, displays all of the places that contain an
39 executable named `file'. This includes aliases and functions, if and
40 only if the -p flag is not also used.
42 Type accepts -all, -path, and -type in place of -a, -p, and -t,
48 #include "../bashtypes.h"
49 #include "../posixstat.h"
51 #if defined (HAVE_UNISTD_H)
56 #include "../bashansi.h"
59 #include "../execute_cmd.h"
67 extern int find_reserved_word ();
69 /* For each word in LIST, find out what the shell is going to do with
70 it as a simple command. i.e., which file would this shell use to
71 execve, or if it is a builtin command, or an alias. Possible flag
73 -type Returns the "type" of the object, one of
74 `alias', `keyword', `function', `builtin',
77 -path Returns the pathname of the file if -type is
80 -all Returns all occurrences of words, whether they
81 be a filename in the path, alias, function,
94 int path_only, type_only, all, verbose;
98 return (EXECUTION_SUCCESS);
100 path_only = type_only = all = 0;
101 successful_finds = 0;
103 while (list && *(list->word->word) == '-')
105 char *flag = &(list->word->word[1]);
107 if (flag[0] == 't' && (!flag[1] || strcmp (flag + 1, "ype") == 0))
112 else if (flag[0] == 'p' && (!flag[1] || strcmp (flag + 1, "ath") == 0))
117 else if (flag[0] == 'a' && (!flag[1] || strcmp (flag + 1, "ll") == 0))
132 else if (path_only == 0)
143 found = describe_command (list->word->word, verbose, all);
145 if (!found && !path_only && !type_only)
146 builtin_error ("%s: not found", list->word->word);
148 successful_finds += found;
154 if (successful_finds != 0)
155 return (EXECUTION_SUCCESS);
157 return (EXECUTION_FAILURE);
161 * Describe COMMAND as required by the type builtin.
163 * If VERBOSE == 0, don't print anything
164 * If VERBOSE == 1, print short description as for `type -t'
165 * If VERBOSE == 2, print long description as for `type' and `command -V'
166 * If VERBOSE == 3, print path name only for disk files
167 * If VERBOSE == 4, print string used to invoke COMMAND, for `command -v'
169 * ALL says whether or not to look for all occurrences of COMMAND, or
170 * return after finding it once.
173 describe_command (command, verbose, all)
177 int found, i, found_file;
184 found = found_file = 0;
185 full_path = (char *)NULL;
188 /* Command is an alias? */
189 alias = find_alias (command);
195 else if (verbose == 2)
196 printf ("%s is aliased to `%s'\n", command, alias->value);
197 else if (verbose == 4)
199 char *x = single_quote (alias->value);
200 printf ("alias %s=%s\n", command, x);
211 /* Command is a shell reserved word? */
212 i = find_reserved_word (command);
217 else if (verbose == 2)
218 printf ("%s is a shell keyword\n", command);
219 else if (verbose == 4)
220 printf ("%s\n", command);
228 /* Command is a function? */
229 func = find_function (command);
235 else if (verbose == 2)
237 #define PRETTY_PRINT_FUNC 1
240 printf ("%s is a function\n", command);
242 /* We're blowing away THE_PRINTED_COMMAND here... */
244 result = named_function_string (command,
245 (COMMAND *) function_cell (func),
247 printf ("%s\n", result);
248 #undef PRETTY_PRINT_FUNC
250 else if (verbose == 4)
251 printf ("%s\n", command);
259 /* Command is a builtin? */
260 if (find_shell_builtin (command))
264 else if (verbose == 2)
265 printf ("%s is a shell builtin\n", command);
266 else if (verbose == 4)
267 printf ("%s\n", command);
275 /* Command is a disk file? */
276 /* If the command name given is already an absolute command, just
277 check to see if it is executable. */
278 if (absolute_program (command))
280 int f = file_status (command);
285 else if (verbose == 2)
286 printf ("%s is %s\n", command, command);
287 else if (verbose == 3 || verbose == 4)
288 printf ("%s\n", command);
290 /* There's no use looking in the hash table or in $PATH,
291 because they're not consulted when an absolute program
297 /* If the user isn't doing "-all", then we might care about
298 whether the file is present in our hash table. */
301 if ((full_path = find_hashed_filename (command)) != (char *)NULL)
305 else if (verbose == 2)
306 printf ("%s is hashed (%s)\n", command, full_path);
307 else if (verbose == 3 || verbose == 4)
308 printf ("%s\n", full_path);
314 /* Now search through $PATH. */
318 full_path = find_user_command (command);
321 user_command_matches (command, FS_EXEC_ONLY, found_file);
322 /* XXX - should that be FS_EXEC_PREFERRED? */
332 else if (verbose == 2)
333 printf ("%s is %s\n", command, full_path);
334 else if (verbose == 3 || verbose == 4)
335 printf ("%s\n", full_path);
338 full_path = (char *)NULL;