summaryrefslogtreecommitdiff
path: root/tests/misc
diff options
context:
space:
mode:
authorEric Blake <ebb9@byu.net>2009-10-26 13:32:49 -0600
committerEric Blake <ebb9@byu.net>2009-10-26 21:30:34 -0600
commitf00bbe33e41a9849351ea57c2706516d43e1e98d (patch)
tree1b8e228f7451a6624970850f97c5473f45957e79 /tests/misc
parent0f3f6bf6bf38f1ed9c85fe98d6ac7645bf10a6c3 (diff)
downloadcoreutils-f00bbe33e41a9849351ea57c2706516d43e1e98d.tar.xz
tests: clean up tests of env -- handling
The comment in env.c about -- handling has not matched the behavior in the code since the initial commit back in 1992. * src/env.c: Fix bogus comment. * tests/misc/env: Further tweaks, avoiding PATH problems inherent in testing -i, and testing program name containing =. * doc/coreutils.texi (env invocation): Mention that intermediate program is needed to invoke program with name containing =.
Diffstat (limited to 'tests/misc')
-rwxr-xr-xtests/misc/env50
1 files changed, 37 insertions, 13 deletions
diff --git a/tests/misc/env b/tests/misc/env
index e1e51ed29..fb3be2994 100755
--- a/tests/misc/env
+++ b/tests/misc/env
@@ -103,25 +103,49 @@ env also_unlikely && fail=1
test x`PATH=$PATH:unlikely_name env also_unlikely` = xpass || fail=1
test x`env PATH="$PATH":unlikely_name also_unlikely` = xpass || fail=1
-# Use -- to end arguments.
-ln -s "$abs_top_builddir/src/echo" ./-i || framework_failure
-case `PATH="$PATH:" env -i echo good` in
+# Explicitly put . on the PATH for the rest of this test.
+PATH=$PATH:
+export PATH
+
+# Use -- to end options (but not variable assignments).
+# On some systems, execve("-i") invokes a shebang script ./-i on PATH as
+# '/bin/sh -i', rather than '/bin/sh -- -i', which doesn't do what we want.
+# Avoid the issue by using an executable rather than a script.
+# Test -u, rather than -i, to minimize PATH problems.
+ln -s "$abs_top_builddir/src/echo" ./-u || framework_failure
+case `env -u echo echo good` in
good) ;;
*) fail=1 ;;
esac
-case `env -i -- PATH=. -i no-echo` in
- no-echo) ;;
+case `env -u echo -- echo good` in
+ good) ;;
+ *) fail=1 ;;
+esac
+case `env -- -u pass` in
+ pass) ;;
+ *) fail=1 ;;
+esac
+
+# After options have ended, the first argument not containing = is a program.
+env a=b -- true
+test $? = 127 || fail=1
+ln -s "$abs_top_builddir/src/echo" ./-- || framework_failure
+case `env a=b -- true || echo fail` in
+ true) ;;
*) fail=1 ;;
esac
-# FIXME - POSIX does not allow this; decide what we want to do
-# cat <<EOF >./c=d || framework_failure
-# #!/bin/sh
-# echo pass
-# EOF
-# chmod +x c=d || framework_failure
-# test "x`env c=d echo fail`" = xfail || fail=1
-# test "x`env -- c=d echo fail`" = xpass || fail=1
+# No way to directly invoke program name containing =.
+cat <<EOF >./c=d || framework_failure
+#!/bin/sh
+echo pass
+EOF
+chmod +x c=d || framework_failure
+test "x`env c=d echo fail`" = xfail || fail=1
+test "x`env -- c=d echo fail`" = xfail || fail=1
+test "x`env ./c=d echo fail`" = xfail || fail=1
+test "x$(env sh -c '\c=d echo fail')" = xpass || fail=1
+test "x$(env sh -c 'exec "$@"' sh c=d echo fail)" = xpass || fail=1
# catch unsetenv failure, broken through coreutils 8.0
env -u a=b true && fail=1