mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Make PATH properly survive a shared-state ${ comsub; }
Reproducer:
$ ksh -c 'v=${ PATH=/dev/null; }; echo $PATH; whence ls'
/dev/null
/bin/ls
The PATH=/dev/null assignment should survive the shared-state
command substitution, and does, yet 'ls' is still found.
The variable became inconsistent with the internal pathlist.
This bugfix is from the 93v- beta.
src/cmd/ksh93/sh/subshell.c: sh_subshell():
- Do not save and restore pathlist for a subshare.
- A few other subshell tweaks from 93v- that made sense:
. reset shp->subdup (bitmask for dups of 1) after saving it
. use e_dot instead of "." for consistency
. retry close(1) if it was interrupted
src/cmd/ksh93/tests/path.sh:
- Add test for this bug.
This commit is contained in:
parent
e3882fe71b
commit
caf7ab6c71
2 changed files with 26 additions and 7 deletions
|
|
@ -731,6 +731,15 @@ got=$({ FPATH=$tmp/fun.$$ "$SHELL" -c self; } 2>&1)
|
|||
(((e = $?) == 126)) || err_exit 'Function autoload recursion loop:' \
|
||||
"got status $e$( ((e>128)) && print -n / && kill -l "$e"), $(printf %q "$got")"
|
||||
|
||||
# ======
|
||||
# If a shared-state ${ command substitution; } changed the value of $PATH, the variable
|
||||
# would change but the internal pathlist would not, making path searches inconsistent.
|
||||
savePATH=$PATH
|
||||
got=${ PATH=/dev/null; }
|
||||
got=$(whence ls)
|
||||
PATH=$savePATH
|
||||
[[ -z $got ]] || err_exit "PATH search inconsistent after changing PATH in subshare (got $(printf %q "$got"))"
|
||||
|
||||
# ======
|
||||
exit $((Errors<125?Errors:125))
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue