1 This file is command.def, from which is created command.c.
2 It implements the builtin "command" in Bash.
4 Copyright (C) 1987-2009 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
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.
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.
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/>.
24 $FUNCTION command_builtin
25 $SHORT_DOC command [-pVv] command [arg ...]
26 Execute a simple command or display information about commands.
28 Runs COMMAND with ARGS suppressing shell function lookup, or display
29 information about the specified COMMANDs. Can be used to invoke commands
30 on disk when a function with the same name exists.
33 -p use a default value for PATH that is guaranteed to find all of
34 the standard utilities
35 -v print a description of COMMAND similar to the `type' builtin
36 -V print a more verbose description of each COMMAND
39 Returns exit status of COMMAND, or failure if COMMAND is not found.
44 #if defined (HAVE_UNISTD_H)
46 # include <sys/types.h>
51 #include "../bashansi.h"
54 #include "../execute_cmd.h"
56 #include "bashgetopt.h"
59 #if defined (_CS_PATH) && defined (HAVE_CONFSTR) && !HAVE_DECL_CONFSTR
60 extern size_t confstr __P((int, char *, size_t));
63 extern int subshell_environment;
65 static void restore_path __P((char *));
66 static char *get_standard_path __P((void));
68 /* Run the commands mentioned in LIST without paying attention to shell
71 command_builtin (list)
74 int result, verbose, use_standard_path, opt;
75 char *old_path, *standard_path;
78 verbose = use_standard_path = 0;
79 reset_internal_getopt ();
80 while ((opt = internal_getopt (list, "pvV")) != -1)
85 use_standard_path = 1;
88 verbose = CDESC_SHORTDESC|CDESC_ABSPATH; /* look in common.h for constants */
91 verbose = CDESC_REUSABLE; /* ditto */
101 return (EXECUTION_SUCCESS);
105 int found, any_found;
107 for (any_found = 0; list; list = list->next)
109 found = describe_command (list->word->word, verbose);
111 if (found == 0 && verbose != CDESC_REUSABLE)
112 sh_notfound (list->word->word);
116 return (any_found ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
119 #if defined (RESTRICTED_SHELL)
120 if (use_standard_path && restricted)
122 sh_restricted ("-p");
123 return (EXECUTION_FAILURE);
127 begin_unwind_frame ("command_builtin");
129 /* We don't want this to be reparsed (consider command echo 'foo &'), so
130 just make a simple_command structure and call execute_command with it. */
131 if (use_standard_path)
133 old_path = get_string_value ("PATH");
134 /* If old_path is NULL, $PATH is unset. If so, we want to make sure
135 it's unset after this command completes. */
137 old_path = savestring (old_path);
138 add_unwind_protect ((Function *)restore_path, old_path);
140 standard_path = get_standard_path ();
141 bind_variable ("PATH", standard_path ? standard_path : "", 0);
142 FREE (standard_path);
145 #define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN)
147 command = make_bare_simple_command ();
148 command->value.Simple->words = (WORD_LIST *)copy_word_list (list);
149 command->value.Simple->redirects = (REDIRECT *)NULL;
150 command->flags |= COMMAND_BUILTIN_FLAGS;
151 command->value.Simple->flags |= COMMAND_BUILTIN_FLAGS;
153 /* This breaks for things like ( cd /tmp ; command z ababa ; echo next )
154 or $(command echo a ; command echo b;) or even
155 { command echo a; command echo b; } & */
156 /* If we're in a subshell, see if we can get away without forking
157 again, since we've already forked to run this builtin. */
158 if (subshell_environment)
160 command->flags |= CMD_NO_FORK;
161 command->value.Simple->flags |= CMD_NO_FORK;
164 add_unwind_protect ((char *)dispose_command, command);
165 result = execute_command (command);
167 run_unwind_frame ("command_builtin");
172 /* Restore the value of the $PATH variable after replacing it when
173 executing `command -p'. */
180 bind_variable ("PATH", var, 0);
184 unbind_variable ("PATH");
187 /* Return a value for PATH that is guaranteed to find all of the standard
188 utilities. This uses Posix.2 configuration variables, if present. It
189 uses a value defined in config.h as a last resort. */
193 #if defined (_CS_PATH) && defined (HAVE_CONFSTR)
197 len = (size_t)confstr (_CS_PATH, (char *)NULL, (size_t)0);
200 p = (char *)xmalloc (len + 2);
202 confstr (_CS_PATH, p, len);
206 return (savestring (STANDARD_UTILS_PATH));
207 #else /* !_CS_PATH || !HAVE_CONFSTR */
208 # if defined (CS_PATH)
209 return (savestring (CS_PATH));
211 return (savestring (STANDARD_UTILS_PATH));
212 # endif /* !CS_PATH */
213 #endif /* !_CS_PATH || !HAVE_CONFSTR */