configure shell game
Darren Tucker
dtucker at dtucker.net
Tue Jun 2 23:28:07 AEST 2026
Hi.
I was recently reminded of this nonsense from the Solaris /bin/sh while
running a regression test:
run test proxy-connect.sh ...
[...]/proxy-connect.sh: warning: line 6: `...` obsolete, use $(...)
[...]/proxy-connect.sh: warning: line 6: `...` obsolete, use $(...)
[...]/proxy-connect.sh: warning: line 15: `...` obsolete, use $(...)
One way to fix that is to use a shell that doesn't suck, of which there
are several candidates. Configure even already finds them: I started
on this a while back but chickened out as it was very close to a release
at the time.
There are some potential complications. Configure has several SHELL
variables, which AFAICT are:
1) SHELL: /bin/sh or equivalent, set real early in the guts of configure.
2) CONFIG_SHELL: The shell configure will feed itself to if it decides, or
is told, that /bin/sh is insufficiently capable to run it.
3) TEST_MINUS_S_SH: one we set configure, which is used for the sole
purpose of doing a single 'test -S [socket]' on what may be an prngd
socket.
4) SH: one I added that gets passed to SHELL in the Makefile when I started
this the first time.
5) TEST_SHELL: this is the shell the regression tests use to run themselves.
Unfortutely someone (almost certainly me) did this:
AC_SUBST([TEST_SHELL], [sh])
and
TEST_SHELL=$SHELL # let configure find us a capable shell
which sorta works, but is often the least-optimal of the candidates (#1)
for running the regression tests.
I want to merge #3 into #4 and use that instead. I also want to rename
it, since while 'SH' is relatively accurate, it's *real* hard to grep
for in a project named "OpenSSH".
Can anyone see any down sides of doing this?
diff --git a/.github/configs b/.github/configs
index a7bb698e2..5131e65b3 100755
--- a/.github/configs
+++ b/.github/configs
@@ -279,9 +279,7 @@ case "${TARGET_HOST}" in
# These are slow real or virtual machines so skip the slowest tests
# (which tend to be thw ones that transfer lots of data) so that the
# test run does not time out.
- # The agent-restrict test fails due to some quoting issue when run
- # with sh or ksh so specify bash for now.
- TEST_TARGET="t-exec unit TEST_SHELL=bash"
+ TEST_TARGET="t-exec unit"
SKIP_LTESTS="rekey sftp"
;;
dfly58*|dfly60*)
diff --git a/Makefile.in b/Makefile.in
index 730e598d0..19cceb150 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-SHELL=@SH@
+SHELL=@POSIX_SHELL@
AUTORECONF=autoreconf
@@ -30,7 +30,7 @@ SSH_SK_HELPER=$(libexecdir)/ssh-sk-helper
PRIVSEP_PATH=@PRIVSEP_PATH@
SSH_PRIVSEP_USER=@SSH_PRIVSEP_USER@
STRIP_OPT=@STRIP_OPT@
-TEST_SHELL=@TEST_SHELL@
+TEST_SHELL=@POSIX_SHELL@
BUILDDIR=@abs_top_builddir@
SK_STANDALONE=@SK_STANDALONE@
COMPATINCLUDES="$(BUILDDIR)/@COMPATINCLUDES@"
diff --git a/configure.ac b/configure.ac
index 530c8e316..36a6b34d5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -53,17 +53,11 @@ AC_CHECK_TOOLS([AR], [ar])
AC_PATH_PROG([CAT], [cat])
AC_PATH_PROG([KILL], [kill])
AC_PATH_PROG([SED], [sed])
-AC_PATH_PROG([TEST_MINUS_S_SH], [bash])
-AC_PATH_PROG([TEST_MINUS_S_SH], [ksh])
-AC_PATH_PROG([TEST_MINUS_S_SH], [sh])
-AC_PATH_PROG([SH], [bash])
-AC_PATH_PROG([SH], [ksh])
-AC_PATH_PROG([SH], [sh])
+AC_PATH_PROGS([POSIX_SHELL], [bash ksh sh])
AC_PATH_PROG([GROFF], [groff])
AC_PATH_PROGS([NROFF], [nroff awf])
AC_PATH_PROG([MANDOC], [mandoc])
AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no])
-AC_SUBST([TEST_SHELL], [sh])
dnl select manpage formatter to be used to build "cat" format pages.
if test "x$MANDOC" != "x" ; then
@@ -1282,7 +1276,6 @@ if (setsockopt(s, IPPROTO_IP, IP_TOS, &one, sizeof(one)) == -1)
fi
],
)
- TEST_SHELL=$SHELL # let configure find us a capable shell
;;
*-*-sunos4*)
CPPFLAGS="$CPPFLAGS -DSUNOS4"
@@ -1327,7 +1320,6 @@ if (setsockopt(s, IPPROTO_IP, IP_TOS, &one, sizeof(one)) == -1)
AC_DEFINE([BROKEN_SETREGID])
AC_DEFINE([PASSWD_NEEDS_USERNAME], [1], [must supply username to passwd])
AC_DEFINE([LOCKED_PASSWD_STRING], ["*LK*"])
- TEST_SHELL=$SHELL # let configure find us a capable shell
;;
# UnixWare 7.x, OpenUNIX 8
*-*-sysv5*)
@@ -1340,7 +1332,6 @@ if (setsockopt(s, IPPROTO_IP, IP_TOS, &one, sizeof(one)) == -1)
AC_DEFINE([BROKEN_SETREGID])
AC_DEFINE([PASSWD_NEEDS_USERNAME])
AC_DEFINE([BROKEN_TCGETATTR_ICANON])
- TEST_SHELL=$SHELL # let configure find us a capable shell
case "$host" in
*-*-sysv5SCO_SV*) # SCO OpenServer 6.x
maildir=/var/spool/mail
@@ -1379,7 +1370,6 @@ if (setsockopt(s, IPPROTO_IP, IP_TOS, &one, sizeof(one)) == -1)
AC_DEFINE([PASSWD_NEEDS_USERNAME])
AC_CHECK_FUNCS([getluid setluid])
MANTYPE=man
- TEST_SHELL=$SHELL # let configure find us a capable shell
SKIP_DISABLE_LASTLOG_DEFINE=yes
;;
*-dec-osf*)
@@ -3649,7 +3639,7 @@ AC_ARG_WITH([prngd-socket],
AC_MSG_CHECKING([for PRNGD/EGD socket])
# Insert other locations here
for sock in /var/run/egd-pool /dev/egd-pool /etc/entropy; do
- if test -r $sock && $TEST_MINUS_S_SH -c "test -S $sock -o -p $sock" ; then
+ if test -r $sock && $POSIX_SHELL -c "test -S $sock -o -p $sock" ; then
PRNGD_SOCKET="$sock"
AC_DEFINE_UNQUOTED([PRNGD_SOCKET], ["$PRNGD_SOCKET"])
break;
@@ -5908,6 +5898,7 @@ CFLAGS_NOPIE=`echo "$CFLAGS" | sed 's/^-fPIE //;s/ -fPIE//g'`
AC_SUBST([LDFLAGS_NOPIE])
AC_SUBST([CFLAGS_NOPIE])
AC_SUBST([COMPATINCLUDES])
+AC_SUBST([POSIX_SHELL])
AC_EXEEXT
AC_CONFIG_FILES([Makefile buildpkg.sh opensshd.init openssh.xml \
--
Darren Tucker (dtucker at dtucker.net)
GPG key 11EAA6FA / A86E 3E07 5B19 5880 E860 37F4 9357 ECEF 11EA A6FA
Good judgement comes with experience. Unfortunately, the experience
usually comes from bad judgement.
More information about the openssh-unix-dev
mailing list