]> git.ipfire.org Git - thirdparty/bash.git/blob - builtins/command.def
bash-5.0 distribution sources and documentation
[thirdparty/bash.git] / builtins / command.def
1 This file is command.def, from which is created command.c.
2 It implements the builtin "command" in Bash.
3
4 Copyright (C) 1987-2015 Free Software Foundation, Inc.
5
6 This file is part of GNU Bash, the Bourne Again SHell.
7
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.
12
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.
17
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/>.
20
21 $PRODUCES command.c
22
23 $BUILTIN command
24 $FUNCTION command_builtin
25 $SHORT_DOC command [-pVv] command [arg ...]
26 Execute a simple command or display information about commands.
27
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.
31
32 Options:
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
37
38 Exit Status:
39 Returns exit status of COMMAND, or failure if COMMAND is not found.
40 $END
41
42 #include <config.h>
43
44 #if defined (HAVE_UNISTD_H)
45 # ifdef _MINIX
46 # include <sys/types.h>
47 # endif
48 # include <unistd.h>
49 #endif
50
51 #include "../bashansi.h"
52
53 #include "../shell.h"
54 #include "../execute_cmd.h"
55 #include "../flags.h"
56 #include "bashgetopt.h"
57 #include "common.h"
58
59 #if defined (_CS_PATH) && defined (HAVE_CONFSTR) && !HAVE_DECL_CONFSTR
60 extern size_t confstr __P((int, char *, size_t));
61 #endif
62
63 /* Run the commands mentioned in LIST without paying attention to shell
64 functions. */
65 int
66 command_builtin (list)
67 WORD_LIST *list;
68 {
69 int result, verbose, use_standard_path, opt;
70 COMMAND *command;
71
72 verbose = use_standard_path = 0;
73 reset_internal_getopt ();
74 while ((opt = internal_getopt (list, "pvV")) != -1)
75 {
76 switch (opt)
77 {
78 case 'p':
79 use_standard_path = CDESC_STDPATH;
80 break;
81 case 'V':
82 verbose = CDESC_SHORTDESC|CDESC_ABSPATH; /* look in common.h for constants */
83 break;
84 case 'v':
85 verbose = CDESC_REUSABLE; /* ditto */
86 break;
87 CASE_HELPOPT;
88 default:
89 builtin_usage ();
90 return (EX_USAGE);
91 }
92 }
93 list = loptend;
94
95 if (list == 0)
96 return (EXECUTION_SUCCESS);
97
98 #if defined (RESTRICTED_SHELL)
99 if (use_standard_path && restricted)
100 {
101 sh_restricted ("-p");
102 return (EXECUTION_FAILURE);
103 }
104 #endif
105
106 if (verbose)
107 {
108 int found, any_found;
109
110 for (any_found = 0; list; list = list->next)
111 {
112 found = describe_command (list->word->word, verbose|use_standard_path);
113
114 if (found == 0 && verbose != CDESC_REUSABLE)
115 sh_notfound (list->word->word);
116
117 any_found += found;
118 }
119
120 return (any_found ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
121 }
122
123 begin_unwind_frame ("command_builtin");
124
125 #define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN | (use_standard_path ? CMD_STDPATH : 0))
126
127 /* We don't want this to be reparsed (consider command echo 'foo &'), so
128 just make a simple_command structure and call execute_command with it. */
129 command = make_bare_simple_command ();
130 command->value.Simple->words = (WORD_LIST *)copy_word_list (list);
131 command->value.Simple->redirects = (REDIRECT *)NULL;
132 command->flags |= COMMAND_BUILTIN_FLAGS;
133 command->value.Simple->flags |= COMMAND_BUILTIN_FLAGS;
134
135 add_unwind_protect ((char *)dispose_command, command);
136 result = execute_command (command);
137
138 run_unwind_frame ("command_builtin");
139
140 return (result);
141 }