Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Feb 2002 16:27:24 +1100
From:      Tim Robbins <tim@robbins.dropbear.id.au>
To:        freebsd-standards@FreeBSD.ORG
Subject:   sh -h (-o trackall) option patch
Message-ID:  <20020224162724.A60220@descent.robbins.dropbear.id.au>

next in thread | raw e-mail | index | archive | help
Here's a patch to add the -h (-o trackall) option to sh. The P1003.1-2001
specification about this option is flawed, but I'm confident this is what
was intended.

(The flaw is that the -h option is listed in the SYNOPSIS section but not
in the OPTIONS section. It should be listed along with the other options
to the "set" builtin.) 

The name accepted by the -o option, trackall, is not specified by the
standard, but is the traditional Korn Shell name for it.


Index: options.h
===================================================================
RCS file: /home/ncvs/src/bin/sh/options.h,v
retrieving revision 1.11
diff -u -r1.11 options.h
--- options.h	2002/02/02 06:50:47	1.11
+++ options.h	2002/02/24 05:23:22
@@ -65,8 +65,9 @@
 #define	uflag optlist[14].val
 #define	privileged optlist[15].val
 #define	Tflag optlist[16].val
+#define hflag optlist[17].val
 
-#define NOPTS	17
+#define NOPTS	18
 
 struct optent {
 	const char *name;
@@ -93,6 +94,7 @@
 	{ "nounset",	'u',	0 },
 	{ "privileged",	'p',	0 },
 	{ "trapsasync",	'T',	0 },
+	{ "trackall",	'h',	0 },
 };
 #else
 extern struct optent optlist[NOPTS];
Index: parser.c
===================================================================
RCS file: /home/ncvs/src/bin/sh/parser.c,v
retrieving revision 1.38
diff -u -r1.38 parser.c
--- parser.c	2002/02/02 06:50:47	1.38
+++ parser.c	2002/02/24 05:23:25
@@ -60,6 +60,7 @@
 #include "alias.h"
 #include "show.h"
 #include "eval.h"
+#include "exec.h"
 #ifndef NO_HISTORY
 #include "myhistedit.h"
 #endif
@@ -97,6 +98,7 @@
 struct heredoc *heredoc;
 int quoteflag;			/* set if (part of) last token was quoted */
 int startlinno;			/* line # where last token started */
+int funclevel;			/* nesting level of functions */
 
 /* XXX When 'noaliases' is set to one, no alias expansion takes place. */
 static int noaliases = 0;
@@ -530,6 +532,7 @@
 STATIC union node *
 simplecmd(union node **rpp, union node *redir)
 {
+	struct cmdentry entry;
 	union node *args, **app;
 	union node **orig_rpp = rpp;
 	union node *n = NULL, *n2;
@@ -561,6 +564,9 @@
 			n->type = NARG;
 			n->narg.text = wordtext;
 			n->narg.backquote = backquotelist;
+			if (app == &args && funclevel > 0 && hflag)
+				/* Add hash entry for this command (-h option) */
+				find_command(wordtext, &entry, 0, pathval());
 			*app = n;
 			app = &n->narg.next;
 		} else if (lasttoken == TREDIR) {
@@ -577,7 +583,9 @@
 				synerror("Bad function name");
 #endif
 			n->type = NDEFUN;
+			funclevel++;
 			n->narg.next = command();
+			funclevel--;
 			goto checkneg;
 		} else {
 			tokpushback++;
Index: sh.1
===================================================================
RCS file: /home/ncvs/src/bin/sh/sh.1,v
retrieving revision 1.58
diff -u -r1.58 sh.1
--- sh.1	2001/11/20 18:41:01	1.58
+++ sh.1	2002/02/24 05:23:31
@@ -43,7 +43,7 @@
 .Nd command interpreter (shell)
 .Sh SYNOPSIS
 .Nm
-.Op Fl /+abCEefIimnpsTuVvx
+.Op Fl /+abCEefIhimnpsTuVvx
 .Op Fl /+o Ar longname
 .Op Fl c Ar string
 .Op Ar arg ...\&
@@ -218,6 +218,9 @@
 Ignore
 .Dv EOF Ns ' Ns s
 from input when in interactive mode.
+.It Fl h Li trackall
+Create tracked aliases for commands invoked by functions as they are defined.
+By default, tracked aliases are created when the functions are executed.
 .It Fl i Li interactive
 Force the shell to behave interactively.
 .It Fl m Li monitor

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-standards" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020224162724.A60220>