Subject: Re: bug#17471: On Solaris 10, grep snapshot apparently hit by bleeding-edge Autoconf bug

From: Paul Eggert <[email-masked]>
Date: Mon, 12 May 2014 11:44:46 -0700

On 05/12/2014 10:33 AM, Jim Meyering wrote:
> Does anyone see a way to make it more efficient with a POSIX shell?

Yes. Eric's earlier message convinced me that grep shouldn't rely on 
Autoconf guaranteeing a shell that supports substrings in parameter 
expansion, so I came up with the attached patch (which keeps the shell 
efficient with a POSIX shell) and pushed it before I got around to 
reading your message.  I tested on Solaris 10 with the shell 
artificially set to /bin/sh, so I'm marking this as done.

 From an Autoconf point of view it might be nice to have a good way to 
say "I need a POSIX shell" or at least "I need a shell that does 
substrings", but that's merely a wishlist item.
>From 0ca1f6d79514189ef8db6e931f285cbaec9789ec Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Mon, 12 May 2014 11:38:28 -0700
Subject: [PATCH] egrep, fgrep: port to Solaris 10 /bin/sh

This old shell doesn't grok ${0%/*}; see: http://bugs.gnu.org/17471
* src/Makefile.am (egrep fgrep): Don't assume the shell does substrings.
* src/egrep.sh (dir): New var, so that the substring calculation is
done only once (which is a small win even with newer shells),
and so that the calculation is easier to edit on older shells.
---
 src/Makefile.am | 7 +++++++
 src/egrep.sh    | 5 +++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index f8c9415..e2c82a4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -47,7 +47,14 @@ EXTRA_DIST = dosbuf.c egrep.sh
 egrep fgrep: egrep.sh Makefile
 	$(AM_V_GEN)grep=`echo grep | sed -e '$(transform)'`	&& \
 	case $@ in egrep) option=-E;; fgrep) option=-F;; esac	&& \
+	shell_does_substrings='set x/y && d=$${1%/*} && test "$$d" = x' && \
+	if $(SHELL) -c "$$shell_does_substrings" 2>/dev/null; then \
+	  edit_substring='s,X,X,'; \
+	else \
+	  edit_substring='s,\$${0%/\*},`expr "X$$0" : '\''X\\(.*\\)/'\''`,g'; \
+	fi && \
 	sed -e 's|[@]SHELL@|$(SHELL)|g' \
+	    -e "$$edit_substring" \
 	    -e "s|[@]grep@|$$grep|g" \
 	    -e "s|[@]option@|$$option|g" <$(srcdir)/egrep.sh >$@-t
 	$(AM_V_at)chmod +x $@-t
diff --git a/src/egrep.sh b/src/egrep.sh
index f1b4146..1a03d2a 100644
--- a/src/egrep.sh
+++ b/src/egrep.sh
@@ -2,8 +2,9 @@
 grep=grep
 case $0 in
   */*)
-    if test -x "${0%/*}/@grep@"; then
-      PATH=${0%/*}:$PATH
+    dir=${0%/*}
+    if test -x "$dir/@grep@"; then
+      PATH=$dir:$PATH
       grep=@grep@
     fi;;
 esac
-- 
1.9.0