@@ -455,6 +455,7 @@ def __init__(self, bash: pexpect.spawn, sendintr: bool = False):
455
455
456
456
self .bash = bash
457
457
self .cwd_changed : bool = False
458
+ self .saved_set : Dict [str , bash_env_saved .saved_state ] = {}
458
459
self .saved_shopt : Dict [str , bash_env_saved .saved_state ] = {}
459
460
self .saved_variables : Dict [str , bash_env_saved .saved_state ] = {}
460
461
self .sendintr = sendintr
@@ -520,6 +521,30 @@ def _save_cwd(self):
520
521
self .cwd_changed = True
521
522
self ._copy_variable ("PWD" , "%s_OLDPWD" % self .prefix )
522
523
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
+
523
548
def _check_shopt (self , name : str ):
524
549
if (
525
550
self .saved_shopt [name ]
@@ -614,6 +639,13 @@ def _restore_env(self):
614
639
self ._unset_variable ("%s_NEWSHOPT_%s" % (self .prefix , name ))
615
640
self .saved_shopt = {}
616
641
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
+
617
649
self .noexcept = False
618
650
if self .captured_error :
619
651
raise self .captured_error
@@ -625,6 +657,18 @@ def chdir(self, path: str):
625
657
self ._safe_exec ("command cd -- %s" % shlex .quote (path ))
626
658
self ._protect_variable ("OLDPWD" )
627
659
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
+
628
672
def shopt (self , name : str , value : bool ):
629
673
self ._unprotect_shopt (name )
630
674
if value :
0 commit comments