Skip to content

Commit

Permalink
Make exit code available in catch block (#12648)
Browse files Browse the repository at this point in the history
# Description
Bandaid fix for #12643, where it is not possible to get the exit code of
a failed external command while also having the external command inherit
nushell's stdout and stderr. This changes `try` so that the exit code of
external command is available in the `catch` block via the usual
`$env.LAST_EXIT_CODE`.

# Tests + Formatting
Added one test.

# After Submitting
Rework I/O redirection and possibly exit codes.
  • Loading branch information
IanManske committed Apr 26, 2024
1 parent d23a373 commit 1ecbb3e
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 3 deletions.
5 changes: 2 additions & 3 deletions crates/nu-cmd-lang/src/core_commands/try_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,8 @@ impl Command for Try {
Ok(pipeline) => {
let (pipeline, external_failed) = pipeline.check_external_failed();
if external_failed {
// Because external command errors aren't "real" errors,
// (unless do -c is in effect)
// they can't be passed in as Nushell values.
let exit_code = pipeline.drain_with_exit_code()?;
stack.add_env_var("LAST_EXIT_CODE".into(), Value::int(exit_code, call.head));
let err_value = Value::nothing(call.head);
handle_catch(err_value, catch_block, engine_state, stack, eval_block)
} else {
Expand Down
6 changes: 6 additions & 0 deletions crates/nu-command/tests/commands/try_.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,9 @@ fn can_catch_infinite_recursion() {
"#);
assert_eq!(actual.out, "Caught infinite recursion");
}

#[test]
fn exit_code_available_in_catch() {
let actual = nu!("try { nu -c 'exit 42' } catch { $env.LAST_EXIT_CODE }");
assert_eq!(actual.out, "42");
}

0 comments on commit 1ecbb3e

Please sign in to comment.