Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 22 Aug 2002 04:56:03 -0700
From:      Luigi Rizzo <rizzo@icir.org>
To:        "M. Warner Losh" <imp@bsdimp.com>
Cc:        nbm@mithrandr.moria.org, arch@FreeBSD.ORG
Subject:   Re: ugliness in rc.* scripts
Message-ID:  <20020822045603.A66453@iguana.icir.org>
In-Reply-To: <20020821091942.B59085@iguana.icir.org>; from rizzo@icir.org on Wed, Aug 21, 2002 at 09:19:42AM -0700
References:  <20020820232538.A53816@iguana.icir.org> <20020821074819.GA58163@mithrandr.moria.org> <20020821061822.A56560@iguana.icir.org> <20020821.095726.109035410.imp@bsdimp.com> <20020821091942.B59085@iguana.icir.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Aug 21, 2002 at 09:19:42AM -0700, Luigi Rizzo wrote:
> On Wed, Aug 21, 2002 at 09:57:26AM -0600, M. Warner Losh wrote:
> > In message: <20020821061822.A56560@iguana.icir.org>
> >             Luigi Rizzo <rizzo@icir.org> writes:
> ...
> > : i think it is only one process -- echo is a builtin, tolower is a shell
> > : function. In any case, we never cared about performance in the rc scripts,
> > : not spawning processes (e.g. calling scripts with . instead of sh) has
> > : only to do with letting variable assignements be visible in the caller.
> > 
> > Actually, we have cared about the performance of shell scripts in the
> > past.  NetBSD got a nasty surprise when they went to their new rc

ok, I made a few tests with /bin/sh. Funny results.
Here, echo is a builtin command, /bin/echo an external one,
and "f() { echo $* ; }" and f2() { /bin/echo $*; }
are shell functions.

	echo "foo"		# does not fork
	a=`echo "foo"`		# does not fork
	/bin/echo "foo"		# forks once.
	a=`/bin/echo "foo"`	# forks once
	f "foo"			# does not fork
	a=`f "foo"`		# forks once.	XXX
	f2 "foo"		# forks once.
	a=`f2 "foo"`		# forks twice.	XXX

I guess the most surprising (to me) behaviour is the handling
of shell functions in backquotes -- but i suppose this is
because builtins do not have side effects on the environment
whereas shell functions can.

In any case -- to come back to the original problem of
folding strings into lowercase -- making "tr" a builtin
is trivial, see the attached patches (congratulations to
the designer of the builtin mechanism in /bin/sh).

It would be even more useful if "tr" could handle arguments
from the command line (or we hit again the problem of forking a
process to provide the data to translate on stdin)

	cheers
	luigi


Index: bin/sh/Makefile
===================================================================
RCS file: /home/ncvs/src/bin/sh/Makefile,v
retrieving revision 1.30.2.1
diff -u -r1.30.2.1 Makefile
--- bin/sh/Makefile	15 Dec 2001 10:05:18 -0000	1.30.2.1
+++ bin/sh/Makefile	22 Aug 2002 11:11:01 -0000
@@ -5,7 +5,7 @@
 SHSRCS=	alias.c arith.y arith_lex.l cd.c echo.c error.c eval.c exec.c expand.c \
 	histedit.c input.c jobs.c mail.c main.c memalloc.c miscbltin.c \
 	mystring.c options.c output.c parser.c printf.c redir.c show.c \
-	test.c trap.c var.c
+	str.c test.c tr.c trap.c var.c
 GENSRCS= builtins.c init.c nodes.c syntax.c
 GENHDRS= builtins.h nodes.h syntax.h token.h y.tab.h
 SRCS= ${SHSRCS} ${GENSRCS} ${GENHDRS} y.tab.h
@@ -24,7 +24,8 @@
 
 .PATH:	${.CURDIR}/bltin \
 	${.CURDIR}/../../usr.bin/printf \
-	${.CURDIR}/../../bin/test
+	${.CURDIR}/../../bin/test	\
+	${.CURDIR}/../../usr.bin/tr
 
 CLEANFILES+= mkinit mkinit.o mknodes mknodes.o \
 	mksyntax mksyntax.o
Index: bin/sh/builtins.def
===================================================================
RCS file: /home/ncvs/src/bin/sh/builtins.def,v
retrieving revision 1.7.2.1
diff -u -r1.7.2.1 builtins.def
--- bin/sh/builtins.def	15 Dec 2001 10:05:18 -0000	1.7.2.1
+++ bin/sh/builtins.def	21 Aug 2002 19:50:15 -0000
@@ -91,3 +91,4 @@
 aliascmd	alias
 ulimitcmd	ulimit
 testcmd		test [
+trcmd		tr
Index: usr.bin/tr/tr.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/tr/tr.c,v
retrieving revision 1.8
diff -u -r1.8 tr.c
--- usr.bin/tr/tr.c	28 Aug 1999 01:06:52 -0000	1.8
+++ usr.bin/tr/tr.c	21 Aug 2002 19:59:21 -0000
@@ -97,6 +97,11 @@
 static void setup __P((int *, char *, STR *, int));
 static void usage __P((void));
 
+#ifdef SHELL
+#define main	trcmd
+#define	exit	return
+#include "bltin/bltin.h"
+#endif
 int
 main(argc, argv)
 	int argc;

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




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