1 This file is command.def
, from which is created command.c.
2 It implements the builtin
"command" in Bush.
4 Copyright (C
) 1987-2020 Free Software Foundation
, Inc.
6 This file is part of GNU Bush
, the Bourne Again SHell.
8 Bush 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 Bush 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 Bush. 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 "../src/bushansi.h"
53 #include "../src/shell.h"
54 #include "../src/execute_cmd.h"
55 #include "../src/flags.h"
56 #include "bushgetopt.h"
59 #if defined (_CS_PATH) && defined (HAVE_CONFSTR) && !HAVE_DECL_CONFSTR
60 extern size_t confstr PARAMS((int, char *, size_t));
63 /* Run the commands mentioned in LIST without paying attention to shell
66 command_builtin (list)
69 int result, verbose, use_standard_path, opt;
72 verbose = use_standard_path = 0;
73 reset_internal_getopt ();
74 while ((opt = internal_getopt (list, "pvV")) != -1)
79 use_standard_path = CDESC_STDPATH;
82 verbose = CDESC_SHORTDESC|CDESC_ABSPATH; /* look in common.h for constants */
85 verbose = CDESC_REUSABLE; /* ditto */
96 return (EXECUTION_SUCCESS);
98 #if defined (RESTRICTED_SHELL)
99 if (use_standard_path && restricted)
101 sh_restricted ("-p");
102 return (EXECUTION_FAILURE);
108 int found, any_found;
110 for (any_found = 0; list; list = list->next)
112 found = describe_command (list->word->word, verbose|use_standard_path);
114 if (found == 0 && verbose != CDESC_REUSABLE)
115 sh_notfound (list->word->word);
120 return (any_found ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
123 begin_unwind_frame ("command_builtin");
125 #define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN | (use_standard_path ? CMD_STDPATH : 0))
128 itrace("command_builtin: running execute_command for `%s'", list->word->word);
131 /* We don't want this to be reparsed (consider command echo 'foo &'), so
132 just make a simple_command structure and call execute_command with it. */
133 command = make_bare_simple_command ();
134 command->value.Simple->words = (WORD_LIST *)copy_word_list (list);
135 command->value.Simple->redirects = (REDIRECT *)NULL;
136 command->flags |= COMMAND_BUILTIN_FLAGS;
137 command->value.Simple->flags |= COMMAND_BUILTIN_FLAGS;
139 add_unwind_protect ((char *)dispose_command, command);
140 result = execute_command (command);
142 run_unwind_frame ("command_builtin
");