break for, loop, while execution when external command runs to failed (#7475)

Fixes: #7467

# User-Facing Changes

## for
```
❯ for i in 1..2 { echo 1;  ^false }
1
```

## loop
```
❯ loop { echo bb; ^false }
bb
```

## while
```
❯ mut x = 1; while $x < 3 { $x = $x + 1; echo bb; ^false }
bb
```
This commit is contained in:
WindSoilder
2022-12-14 23:20:18 +08:00
committed by GitHub
parent 98b9839e3d
commit db3177a5aa
6 changed files with 64 additions and 4 deletions

View File

@ -118,7 +118,10 @@ impl Command for For {
return Err(err);
}
Ok(pipeline) => {
let _ = pipeline.print(&engine_state, stack, false, false)?;
let exit_code = pipeline.print(&engine_state, stack, false, false)?;
if exit_code != 0 {
break;
}
}
}
}
@ -157,7 +160,10 @@ impl Command for For {
return Err(err);
}
Ok(pipeline) => {
let _ = pipeline.print(&engine_state, stack, false, false)?;
let exit_code = pipeline.print(&engine_state, stack, false, false)?;
if exit_code != 0 {
break;
}
}
}
}

View File

@ -69,7 +69,10 @@ impl Command for Loop {
return Err(err);
}
Ok(pipeline) => {
let _ = pipeline.print(engine_state, stack, false, false)?;
let exit_code = pipeline.print(engine_state, stack, false, false)?;
if exit_code != 0 {
break;
}
}
}
}

View File

@ -77,7 +77,11 @@ impl Command for While {
return Err(err);
}
Ok(pipeline) => {
let _ = pipeline.print(engine_state, stack, false, false)?;
let exit_code =
pipeline.print(engine_state, stack, false, false)?;
if exit_code != 0 {
break;
}
}
}
} else {