Implement the P1003.2 `command' builtin command, which is used to suppress

shell function and alias lookup. The -p option has been implemented, the
UPE -v and -V options have not. The old `command' command has been renamed
to `builtin'.
This commit is contained in:
Tim J. Robbins 2002-07-21 06:49:14 +00:00
parent e300f53ca2
commit 2babaf74b5
4 changed files with 78 additions and 4 deletions

View File

@ -49,7 +49,8 @@
#
# NOTE: bltincmd must come first!
bltincmd command
bltincmd builtin
commandcmd command
#alloccmd alloc
bgcmd -j bg
breakcmd break continue

View File

@ -42,6 +42,7 @@ static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95";
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <paths.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h> /* For WIFSIGNALED(status) */
@ -747,7 +748,9 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
&& (cmdentry.cmdtype != CMDBUILTIN
|| cmdentry.u.index == CDCMD
|| cmdentry.u.index == DOTCMD
|| cmdentry.u.index == EVALCMD))) {
|| cmdentry.u.index == EVALCMD))
|| (cmdentry.cmdtype == CMDBUILTIN &&
cmdentry.u.index == COMMANDCMD)) {
jp = makejob(cmd, 1);
mode = cmd->ncmd.backgnd;
if (flags & EV_BACKCMD) {
@ -869,7 +872,8 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
#ifndef NO_HISTORY
|| cmdentry.u.index == HISTCMD
#endif
|| cmdentry.u.index == EXECCMD)
|| cmdentry.u.index == EXECCMD
|| cmdentry.u.index == COMMANDCMD)
exraise(e);
FORCEINTON;
}
@ -986,6 +990,54 @@ breakcmd(int argc, char **argv)
return 0;
}
/*
* The `command' command.
*/
int
commandcmd(int argc, char **argv)
{
static char stdpath[] = _PATH_STDPATH;
struct jmploc loc, *old;
struct strlist *sp;
char *path;
int ch;
for (sp = cmdenviron; sp ; sp = sp->next)
setvareq(sp->text, VEXPORT|VSTACK);
path = pathval();
optind = optreset = 1;
while ((ch = getopt(argc, argv, "p")) != -1) {
switch (ch) {
case 'p':
path = stdpath;
break;
case '?':
default:
error("unknown option: -%c", optopt);
}
}
argc -= optind;
argv += optind;
if (argc != 0) {
old = handler;
handler = &loc;
if (setjmp(handler->loc) == 0)
shellexec(argv, environment(), path, 0);
handler = old;
if (exception == EXEXEC)
exit(exerrno);
exraise(exception);
}
/*
* Do nothing successfully if no command was specified;
* ksh also does this.
*/
exit(0);
}
/*
* The return command.

View File

@ -60,6 +60,7 @@ int returncmd(int, char **);
int falsecmd(int, char **);
int truecmd(int, char **);
int execcmd(int, char **);
int commandcmd(int, char **);
/* in_function returns nonzero if we are currently evaluating a function */
#define in_function() funcnest

View File

@ -1274,7 +1274,7 @@ suitable for reinput to the shell.
Continue the specified jobs
(or the current job if no jobs are given)
in the background.
.It Ic command Ar cmd Op Ar arg ...
.It Ic builtin Ar cmd Op Ar arg ...
Execute the specified builtin command,
.Ar cmd .
This is useful when the user wishes to override a shell function
@ -1333,6 +1333,26 @@ A synonym for the
.Ic cd
builtin command.
.It Xo
.Ic command
.Op Fl p
.Oo
.Ar utility
.Op Ar argument ...
.Oc
.Xc
Execute the specified
.Ar utility
as a simple command (see the
.Sx Simple Commands
section).
.Pp
If the
.Fl p
option is specified, the command search is performed using a
default value of
.Ev PATH
that is guaranteed to find all of the standard utilities.
.It Xo
.Ic echo
.Op Fl e | Fl n
.Op Ar string