@@ -136,7 +136,7 @@ pub async fn execute_with_pipes(
136136 . await ;
137137
138138 match result {
139- ExecuteResult :: Exit ( code, _) => code,
139+ ExecuteResult :: Exit ( code, _, _ ) => code,
140140 ExecuteResult :: Continue ( exit_code, _, _) => exit_code,
141141 }
142142}
@@ -191,7 +191,10 @@ pub fn execute_sequential_list(
191191 )
192192 . await ;
193193 match result {
194- ExecuteResult :: Exit ( exit_code, handles) => {
194+ ExecuteResult :: Exit ( exit_code, changes, handles) => {
195+ state. apply_changes ( & changes) ;
196+ state. set_shell_var ( "?" , & exit_code. to_string ( ) ) ;
197+ final_changes. extend ( changes) ;
195198 async_handles. extend ( handles) ;
196199 final_exit_code = exit_code;
197200 was_exit = true ;
@@ -223,7 +226,7 @@ pub fn execute_sequential_list(
223226 }
224227
225228 if was_exit {
226- ExecuteResult :: Exit ( final_exit_code, async_handles)
229+ ExecuteResult :: Exit ( final_exit_code, final_changes , async_handles)
227230 } else {
228231 ExecuteResult :: Continue (
229232 final_exit_code,
@@ -305,7 +308,7 @@ fn execute_sequence(
305308 )
306309 . await ;
307310 let ( exit_code, mut async_handles) = match first_result {
308- ExecuteResult :: Exit ( _, _) => return first_result,
311+ ExecuteResult :: Exit ( _, _, _ ) => return first_result,
309312 ExecuteResult :: Continue (
310313 exit_code,
311314 sub_changes,
@@ -340,9 +343,10 @@ fn execute_sequence(
340343 execute_sequence ( next, state, stdin, stdout, stderr)
341344 . await ;
342345 match next_result {
343- ExecuteResult :: Exit ( code, sub_handles) => {
346+ ExecuteResult :: Exit ( code, sub_changes, sub_handles) => {
347+ changes. extend ( sub_changes) ;
344348 async_handles. extend ( sub_handles) ;
345- ExecuteResult :: Exit ( code, async_handles)
349+ ExecuteResult :: Exit ( code, changes , async_handles)
346350 }
347351 ExecuteResult :: Continue (
348352 exit_code,
@@ -382,8 +386,8 @@ async fn execute_pipeline(
382386 . await ;
383387 if pipeline. negated {
384388 match result {
385- ExecuteResult :: Exit ( code, handles) => {
386- ExecuteResult :: Exit ( code, handles)
389+ ExecuteResult :: Exit ( code, changes , handles) => {
390+ ExecuteResult :: Exit ( code, changes , handles)
387391 }
388392 ExecuteResult :: Continue ( code, changes, handles) => {
389393 let new_code = if code == 0 { 1 } else { 0 } ;
@@ -617,8 +621,8 @@ async fn execute_command(
617621 CommandInner :: Subshell ( list) => {
618622 // Here the state can be changed but we can not pass by reference
619623 match execute_subshell ( list, state, stdin, stdout, stderr) . await {
620- ExecuteResult :: Exit ( code, handles) => {
621- ExecuteResult :: Exit ( code, handles)
624+ ExecuteResult :: Exit ( code, _ , handles) => {
625+ ExecuteResult :: Exit ( code, changes , handles)
622626 }
623627 ExecuteResult :: Continue ( code, _, handles) => {
624628 ExecuteResult :: Continue ( code, changes, handles)
@@ -705,7 +709,9 @@ async fn execute_while_clause(
705709 . await ;
706710
707711 match exec_result {
708- ExecuteResult :: Exit ( code, handles) => {
712+ ExecuteResult :: Exit ( code, env_changes, handles) => {
713+ state. apply_changes ( & env_changes) ;
714+ changes. extend ( env_changes) ;
709715 async_handles. extend ( handles) ;
710716 last_exit_code = code;
711717 break ;
@@ -730,7 +736,7 @@ async fn execute_while_clause(
730736 state. apply_changes ( & changes) ;
731737
732738 if state. exit_on_error ( ) && last_exit_code != 0 {
733- ExecuteResult :: Exit ( last_exit_code, async_handles)
739+ ExecuteResult :: Exit ( last_exit_code, changes , async_handles)
734740 } else {
735741 ExecuteResult :: Continue ( last_exit_code, changes, async_handles)
736742 }
@@ -776,7 +782,8 @@ async fn execute_for_clause(
776782 . await ;
777783
778784 match result {
779- ExecuteResult :: Exit ( code, handles) => {
785+ ExecuteResult :: Exit ( code, env_changes, handles) => {
786+ changes. extend ( env_changes) ;
780787 async_handles. extend ( handles) ;
781788 last_exit_code = code;
782789 break ;
@@ -792,7 +799,7 @@ async fn execute_for_clause(
792799 state. apply_changes ( & changes) ;
793800
794801 if state. exit_on_error ( ) && last_exit_code != 0 {
795- ExecuteResult :: Exit ( last_exit_code, async_handles)
802+ ExecuteResult :: Exit ( last_exit_code, changes , async_handles)
796803 } else {
797804 ExecuteResult :: Continue ( last_exit_code, changes, async_handles)
798805 }
@@ -1077,7 +1084,8 @@ async fn execute_pipe_sequence(
10771084 let mut changes: Vec < EnvChange > = changes. into_iter ( ) . flatten ( ) . collect ( ) ;
10781085
10791086 match last_result {
1080- ExecuteResult :: Exit ( code, mut handles) => {
1087+ ExecuteResult :: Exit ( code, env_changes, mut handles) => {
1088+ changes. extend ( env_changes) ;
10811089 handles. extend ( all_handles) ;
10821090 ExecuteResult :: Continue ( code, changes, handles)
10831091 }
@@ -1108,9 +1116,9 @@ async fn execute_subshell(
11081116 . await ;
11091117
11101118 match result {
1111- ExecuteResult :: Exit ( code, handles) => {
1119+ ExecuteResult :: Exit ( code, env_changes , handles) => {
11121120 // sub shells do not cause an exit
1113- ExecuteResult :: Continue ( code, Vec :: new ( ) , handles)
1121+ ExecuteResult :: Continue ( code, env_changes , handles)
11141122 }
11151123 ExecuteResult :: Continue ( code, env_changes, handles) => {
11161124 // env changes are not propagated
@@ -1155,8 +1163,9 @@ async fn execute_if_clause(
11551163 )
11561164 . await ;
11571165 match exec_result {
1158- ExecuteResult :: Exit ( code, handles) => {
1159- return ExecuteResult :: Exit ( code, handles) ;
1166+ ExecuteResult :: Exit ( code, env_changes, handles) => {
1167+ changes. extend ( env_changes) ;
1168+ return ExecuteResult :: Exit ( code, changes, handles) ;
11601169 }
11611170 ExecuteResult :: Continue ( code, env_changes, handles) => {
11621171 changes. extend ( env_changes) ;
@@ -1186,8 +1195,11 @@ async fn execute_if_clause(
11861195 )
11871196 . await ;
11881197 match exec_result {
1189- ExecuteResult :: Exit ( code, handles) => {
1190- return ExecuteResult :: Exit ( code, handles) ;
1198+ ExecuteResult :: Exit ( code, env_changes, handles) => {
1199+ changes. extend ( env_changes) ;
1200+ return ExecuteResult :: Exit (
1201+ code, changes, handles,
1202+ ) ;
11911203 }
11921204 ExecuteResult :: Continue (
11931205 code,
@@ -1438,8 +1450,9 @@ async fn execute_simple_command(
14381450
14391451 let result = execute_command_args ( args, state, stdin, stdout, stderr) . await ;
14401452 match result {
1441- ExecuteResult :: Exit ( code, handles) => {
1442- ExecuteResult :: Exit ( code, handles)
1453+ ExecuteResult :: Exit ( code, env_changes, handles) => {
1454+ changes. extend ( env_changes) ;
1455+ ExecuteResult :: Exit ( code, changes, handles)
14431456 }
14441457 ExecuteResult :: Continue ( code, env_changes, handles) => {
14451458 changes. extend ( env_changes) ;
0 commit comments