mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-15 04:32:24 +00:00
Merge pull request #16 from JohnoKing/fix-optimized-variables
Remove a buggy optimization for variables in subshells Fixes #15
This commit is contained in:
commit
503a596a3e
3 changed files with 16 additions and 3 deletions
3
NEWS
3
NEWS
|
@ -7,6 +7,9 @@ Any uppercase BUG_* names are modernish shell bug IDs.
|
||||||
|
|
||||||
- The 'source' alias has been converted into a regular built-in command.
|
- The 'source' alias has been converted into a regular built-in command.
|
||||||
|
|
||||||
|
- Functions that set variables in a virtual subshell will no longer affect
|
||||||
|
variables of the same name outside of the virtual subshell's environment.
|
||||||
|
|
||||||
2020-06-14:
|
2020-06-14:
|
||||||
|
|
||||||
- 'read -S' is now able to correctly handle strings with double quotes
|
- 'read -S' is now able to correctly handle strings with double quotes
|
||||||
|
|
|
@ -251,9 +251,6 @@ Namval_t *sh_assignok(register Namval_t *np,int add)
|
||||||
/* don't bother with this */
|
/* don't bother with this */
|
||||||
if(!sp->shpwd || np==SH_LEVELNOD || np==L_ARGNOD || np==SH_SUBSCRNOD || np==SH_NAMENOD)
|
if(!sp->shpwd || np==SH_LEVELNOD || np==L_ARGNOD || np==SH_SUBSCRNOD || np==SH_NAMENOD)
|
||||||
return(np);
|
return(np);
|
||||||
/* don't bother to save if in newer scope */
|
|
||||||
if(sp->var!=shp->var_tree && sp->var!=shp->var_base && shp->last_root==shp->var_tree)
|
|
||||||
return(np);
|
|
||||||
if((ap=nv_arrayptr(np)) && (mp=nv_opensub(np)))
|
if((ap=nv_arrayptr(np)) && (mp=nv_opensub(np)))
|
||||||
{
|
{
|
||||||
shp->last_root = ap->table;
|
shp->last_root = ap->table;
|
||||||
|
|
|
@ -726,5 +726,18 @@ check_hash_table()
|
||||||
(hash cat)
|
(hash cat)
|
||||||
[[ $(hash) == "chmod=$(whence -p chmod)" ]] || err_exit $'changes to a subshell\'s hash table affect the parent shell'
|
[[ $(hash) == "chmod=$(whence -p chmod)" ]] || err_exit $'changes to a subshell\'s hash table affect the parent shell'
|
||||||
|
|
||||||
|
# ======
|
||||||
|
# Variables set in functions inside of a virtual subshell should not affect the
|
||||||
|
# outside environment. This regression test must be run from the disk.
|
||||||
|
testvars=$tmp/testvars.sh
|
||||||
|
cat >| "$testvars" << 'EOF'
|
||||||
|
c=0
|
||||||
|
function set_ac { a=1; c=1; }
|
||||||
|
function set_abc { ( set_ac ; b=1 ) }
|
||||||
|
set_abc
|
||||||
|
echo "a=$a b=$b c=$c"
|
||||||
|
EOF
|
||||||
|
v=$($SHELL $testvars) && [[ "$v" == "a= b= c=0" ]] || err_exit 'variables set in subshells are not confined to the subshell'
|
||||||
|
|
||||||
# ======
|
# ======
|
||||||
exit $((Errors<125?Errors:125))
|
exit $((Errors<125?Errors:125))
|
||||||
|
|
Loading…
Reference in a new issue