@@ -455,6 +455,7 @@ def __init__(self, bash: pexpect.spawn, sendintr: bool = False):
455455
456456 self .bash = bash
457457 self .cwd_changed : bool = False
458+ self .saved_set : Dict [str , bash_env_saved .saved_state ] = {}
458459 self .saved_shopt : Dict [str , bash_env_saved .saved_state ] = {}
459460 self .saved_variables : Dict [str , bash_env_saved .saved_state ] = {}
460461 self .sendintr = sendintr
@@ -520,6 +521,30 @@ def _save_cwd(self):
520521 self .cwd_changed = True
521522 self ._copy_variable ("PWD" , "%s_OLDPWD" % self .prefix )
522523
524+ def _check_set (self , name : str ):
525+ if self .saved_set [name ] != bash_env_saved .saved_state .ChangesDetected :
526+ return
527+ self ._safe_assert (
528+ '[[ $(shopt -po %s) == "${%s_NEWSHOPT_%s}" ]]'
529+ % (name , self .prefix , name ),
530+ )
531+
532+ def _unprotect_set (self , name : str ):
533+ if name not in self .saved_set :
534+ self .saved_set [name ] = bash_env_saved .saved_state .ChangesDetected
535+ self ._safe_exec (
536+ "%s_OLDSHOPT_%s=$(shopt -po %s || true)"
537+ % (self .prefix , name , name ),
538+ )
539+ else :
540+ self ._check_set (name )
541+
542+ def _protect_set (self , name : str ):
543+ self ._safe_exec (
544+ "%s_NEWSHOPT_%s=$(shopt -po %s || true)"
545+ % (self .prefix , name , name ),
546+ )
547+
523548 def _check_shopt (self , name : str ):
524549 if (
525550 self .saved_shopt [name ]
@@ -614,6 +639,13 @@ def _restore_env(self):
614639 self ._unset_variable ("%s_NEWSHOPT_%s" % (self .prefix , name ))
615640 self .saved_shopt = {}
616641
642+ for name in self .saved_set :
643+ self ._check_set (name )
644+ self ._safe_exec ('eval "$%s_OLDSHOPT_%s"' % (self .prefix , name ))
645+ self ._unset_variable ("%s_OLDSHOPT_%s" % (self .prefix , name ))
646+ self ._unset_variable ("%s_NEWSHOPT_%s" % (self .prefix , name ))
647+ self .saved_set = {}
648+
617649 self .noexcept = False
618650 if self .captured_error :
619651 raise self .captured_error
@@ -625,6 +657,18 @@ def chdir(self, path: str):
625657 self ._safe_exec ("command cd -- %s" % shlex .quote (path ))
626658 self ._protect_variable ("OLDPWD" )
627659
660+ def set (self , name : str , value : bool ):
661+ self ._unprotect_set (name )
662+ if value :
663+ self ._safe_exec ("set -u %s" % name )
664+ else :
665+ self ._safe_exec ("set +o %s" % name )
666+ self ._protect_set (name )
667+
668+ def save_set (self , name : str ):
669+ self ._unprotect_set (name )
670+ self .saved_set [name ] = bash_env_saved .saved_state .ChangesIgnored
671+
628672 def shopt (self , name : str , value : bool ):
629673 self ._unprotect_shopt (name )
630674 if value :
0 commit comments