sh: Forget all cached command locations on any PATH change.

POSIX requires this and it is simpler than the previous code that remembered
command locations when appending directories to PATH.

In particular,
  PATH=$PATH
is no longer a no-op but discards all cached command locations.
This commit is contained in:
Jilles Tjoelker 2011-02-05 14:01:46 +00:00
parent 604e8224f8
commit ef0cb80dd4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=218323
2 changed files with 13 additions and 24 deletions

View File

@ -494,30 +494,7 @@ hashcd(void)
void
changepath(const char *newval)
{
const char *old, *new;
int idx;
int firstchange;
old = pathval();
new = newval;
firstchange = 9999; /* assume no change */
idx = 0;
for (;;) {
if (*old != *new) {
firstchange = idx;
if ((*old == '\0' && *new == ':')
|| (*old == ':' && *new == '\0'))
firstchange++;
old = new; /* ignore subsequent differences */
}
if (*new == '\0')
break;
if (*new == ':') {
idx++;
}
new++, old++;
}
clearcmdentry(firstchange);
clearcmdentry(0);
}

View File

@ -0,0 +1,12 @@
# $FreeBSD$
T=`mktemp -d "${TMPDIR:-/tmp}/sh-test.XXXXXXXX"` || exit
trap 'rm -rf "${T}"' 0
PATH=$T:$PATH
ls -ld . >/dev/null
cat <<EOF >"$T/ls"
:
EOF
chmod 755 "$T/ls"
PATH=$PATH
ls -ld .