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, `type' outputs 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, `type' either returns the name of the disk
36 file that would be executed, or nothing if `type -t NAME' would not
39 If the -a flag is used, `type' displays all of the places that contain
40 an executable named `file'. This includes aliases and functions, if
41 and only if the -p flag is not also used.
46 #include "../bashtypes.h"
47 #include "../posixstat.h"
49 #if defined (HAVE_UNISTD_H)
54 #include "../bashansi.h"
57 #include "../findcmd.h"
58 #include "../hashcmd.h"
66 extern int find_reserved_word ();
68 /* For each word in LIST, find out what the shell is going to do with
69 it as a simple command. i.e., which file would this shell use to
70 execve, or if it is a builtin command, or an alias. Possible flag
72 -type Returns the "type" of the object, one of
73 `alias', `keyword', `function', `builtin',
76 -path Returns the pathname of the file if -type is
79 -all Returns all occurrences of words, whether they
80 be a filename in the path, alias, function,
93 int path_only, type_only, all, verbose;
97 return (EXECUTION_SUCCESS);
99 path_only = type_only = all = 0;
100 successful_finds = 0;
102 while (list && *(list->word->word) == '-')
104 char *flag = &(list->word->word[1]);
106 if (flag[0] == 't' && (!flag[1] || strcmp (flag + 1, "ype") == 0))
111 else if (flag[0] == 'p' && (!flag[1] || strcmp (flag + 1, "ath") == 0))
116 else if (flag[0] == 'a' && (!flag[1] || strcmp (flag + 1, "ll") == 0))
131 else if (path_only == 0)
142 found = describe_command (list->word->word, verbose, all);
144 if (!found && !path_only && !type_only)
145 builtin_error ("%s: not found", list->word->word);
147 successful_finds += found;
153 if (successful_finds != 0)
154 return (EXECUTION_SUCCESS);
156 return (EXECUTION_FAILURE);
160 * Describe COMMAND as required by the type builtin.
162 * If VERBOSE == 0, don't print anything
163 * If VERBOSE == 1, print short description as for `type -t'
164 * If VERBOSE == 2, print long description as for `type' and `command -V'
165 * If VERBOSE == 3, print path name only for disk files
166 * If VERBOSE == 4, print string used to invoke COMMAND, for `command -v'
168 * ALL says whether or not to look for all occurrences of COMMAND, or
169 * return after finding it once.
172 describe_command (command, verbose, all)
176 int found, i, found_file;
183 found = found_file = 0;
184 full_path = (char *)NULL;
187 /* Command is an alias? */
188 alias = find_alias (command);
194 else if (verbose == 2)
195 printf ("%s is aliased to `%s'\n", command, alias->value);
196 else if (verbose == 4)
198 char *x = single_quote (alias->value);
199 printf ("alias %s=%s\n", command, x);
210 /* Command is a shell reserved word? */
211 i = find_reserved_word (command);
216 else if (verbose == 2)
217 printf ("%s is a shell keyword\n", command);
218 else if (verbose == 4)
219 printf ("%s\n", command);
227 /* Command is a function? */
228 func = find_function (command);
234 else if (verbose == 2)
236 #define PRETTY_PRINT_FUNC 1
239 printf ("%s is a function\n", command);
241 /* We're blowing away THE_PRINTED_COMMAND here... */
243 result = named_function_string (command,
244 (COMMAND *) function_cell (func),
246 printf ("%s\n", result);
247 #undef PRETTY_PRINT_FUNC
249 else if (verbose == 4)
250 printf ("%s\n", command);
258 /* Command is a builtin? */
259 if (find_shell_builtin (command))
263 else if (verbose == 2)
264 printf ("%s is a shell builtin\n", command);
265 else if (verbose == 4)
266 printf ("%s\n", command);
274 /* Command is a disk file? */
275 /* If the command name given is already an absolute command, just
276 check to see if it is executable. */
277 if (absolute_program (command))
279 int f = file_status (command);
284 else if (verbose == 2)
285 printf ("%s is %s\n", command, command);
286 else if (verbose == 3 || verbose == 4)
287 printf ("%s\n", command);
289 /* There's no use looking in the hash table or in $PATH,
290 because they're not consulted when an absolute program
296 /* If the user isn't doing "-all", then we might care about
297 whether the file is present in our hash table. */
300 if ((full_path = find_hashed_filename (command)) != (char *)NULL)
304 else if (verbose == 2)
305 printf ("%s is hashed (%s)\n", command, full_path);
306 else if (verbose == 3 || verbose == 4)
307 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;