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"
60 #include "../hashcmd.h"
68 extern int find_reserved_word ();
70 /* For each word in LIST, find out what the shell is going to do with
71 it as a simple command. i.e., which file would this shell use to
72 execve, or if it is a builtin command, or an alias. Possible flag
74 -type Returns the "type" of the object, one of
75 `alias', `keyword', `function', `builtin',
78 -path Returns the pathname of the file if -type is
81 -all Returns all occurrences of words, whether they
82 be a filename in the path, alias, function,
95 int path_only, type_only, all, verbose;
99 return (EXECUTION_SUCCESS);
101 path_only = type_only = all = 0;
102 successful_finds = 0;
104 while (list && *(list->word->word) == '-')
106 char *flag = &(list->word->word[1]);
108 if (flag[0] == 't' && (!flag[1] || strcmp (flag + 1, "ype") == 0))
113 else if (flag[0] == 'p' && (!flag[1] || strcmp (flag + 1, "ath") == 0))
118 else if (flag[0] == 'a' && (!flag[1] || strcmp (flag + 1, "ll") == 0))
133 else if (path_only == 0)
144 found = describe_command (list->word->word, verbose, all);
146 if (!found && !path_only && !type_only)
147 builtin_error ("%s: not found", list->word->word);
149 successful_finds += found;
155 if (successful_finds != 0)
156 return (EXECUTION_SUCCESS);
158 return (EXECUTION_FAILURE);
162 * Describe COMMAND as required by the type builtin.
164 * If VERBOSE == 0, don't print anything
165 * If VERBOSE == 1, print short description as for `type -t'
166 * If VERBOSE == 2, print long description as for `type' and `command -V'
167 * If VERBOSE == 3, print path name only for disk files
168 * If VERBOSE == 4, print string used to invoke COMMAND, for `command -v'
170 * ALL says whether or not to look for all occurrences of COMMAND, or
171 * return after finding it once.
174 describe_command (command, verbose, all)
178 int found, i, found_file;
185 found = found_file = 0;
186 full_path = (char *)NULL;
189 /* Command is an alias? */
190 alias = find_alias (command);
196 else if (verbose == 2)
197 printf ("%s is aliased to `%s'\n", command, alias->value);
198 else if (verbose == 4)
200 char *x = single_quote (alias->value);
201 printf ("alias %s=%s\n", command, x);
212 /* Command is a shell reserved word? */
213 i = find_reserved_word (command);
218 else if (verbose == 2)
219 printf ("%s is a shell keyword\n", command);
220 else if (verbose == 4)
221 printf ("%s\n", command);
229 /* Command is a function? */
230 func = find_function (command);
236 else if (verbose == 2)
238 #define PRETTY_PRINT_FUNC 1
241 printf ("%s is a function\n", command);
243 /* We're blowing away THE_PRINTED_COMMAND here... */
245 result = named_function_string (command,
246 (COMMAND *) function_cell (func),
248 printf ("%s\n", result);
249 #undef PRETTY_PRINT_FUNC
251 else if (verbose == 4)
252 printf ("%s\n", command);
260 /* Command is a builtin? */
261 if (find_shell_builtin (command))
265 else if (verbose == 2)
266 printf ("%s is a shell builtin\n", command);
267 else if (verbose == 4)
268 printf ("%s\n", command);
276 /* Command is a disk file? */
277 /* If the command name given is already an absolute command, just
278 check to see if it is executable. */
279 if (absolute_program (command))
281 int f = file_status (command);
286 else if (verbose == 2)
287 printf ("%s is %s\n", command, command);
288 else if (verbose == 3 || verbose == 4)
289 printf ("%s\n", command);
291 /* There's no use looking in the hash table or in $PATH,
292 because they're not consulted when an absolute program
298 /* If the user isn't doing "-all", then we might care about
299 whether the file is present in our hash table. */
302 if ((full_path = find_hashed_filename (command)) != (char *)NULL)
306 else if (verbose == 2)
307 printf ("%s is hashed (%s)\n", command, full_path);
308 else if (verbose == 3 || verbose == 4)
309 printf ("%s\n", full_path);
316 /* Now search through $PATH. */
320 full_path = find_user_command (command);
323 user_command_matches (command, FS_EXEC_ONLY, found_file);
324 /* XXX - should that be FS_EXEC_PREFERRED? */
334 else if (verbose == 2)
335 printf ("%s is %s\n", command, full_path);
336 else if (verbose == 3 || verbose == 4)
337 printf ("%s\n", full_path);
340 full_path = (char *)NULL;