Force timeit to not capture stdout (#12465)

# Description
Fixes:  #11996

After this change `let t = timeit ^ls` will list current directory to
stdout.
```
❯ let t = timeit ^ls
CODE_OF_CONDUCT.md      Cargo.lock              Cross.toml              README.md               aaa                     benches                 devdocs                 here11                  scripts                 target                  toolkit.nu              wix
CONTRIBUTING.md         Cargo.toml              LICENSE                 a.txt                   assets                  crates                  docker                  rust-toolchain.toml     src                     tests                   typos.toml
```

If user don't want such behavior, he can redirect the stdout to `std
null-stream` easily
```
> use std
> let t = timeit { ^ls o> (std null-device) }
```

# User-Facing Changes
NaN

# Tests + Formatting
Done

# After Submitting
Nan

---------

Co-authored-by: Ian Manske <ian.manske@pm.me>
This commit is contained in:
Wind 2024-04-10 21:31:29 +08:00 committed by GitHub
parent 81c61f3243
commit 18ddf95d44
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 19 additions and 1 deletions

View File

@ -44,6 +44,8 @@ impl Command for TimeIt {
// Get the start time after all other computation has been done.
let start_time = Instant::now();
// reset outdest, so the command can write to stdout and stderr.
let stack = &mut stack.push_redirection(None, None);
if let Some(command_to_run) = command_to_run {
if let Some(block_id) = command_to_run.as_block() {
let eval_block = get_eval_block(engine_state);

View File

@ -0,0 +1 @@
mod timeit;

View File

@ -0,0 +1,14 @@
use nu_test_support::nu;
#[test]
fn timeit_show_stdout() {
let actual = nu!("let t = timeit nu --testbin cococo abcdefg");
assert_eq!(actual.out, "abcdefg");
}
#[test]
fn timeit_show_stderr() {
let actual = nu!(" with-env {FOO: bar, FOO2: baz} { let t = timeit { nu --testbin echo_env_mixed out-err FOO FOO2 } }");
assert!(actual.out.contains("bar"));
assert!(actual.err.contains("baz"));
}

View File

@ -113,6 +113,7 @@ mod ucp;
#[cfg(unix)]
mod ulimit;
mod debug;
mod umkdir;
mod uname;
mod uniq;

View File

@ -70,7 +70,7 @@ pub fn echo_env_mixed() {
}
/// Cross platform echo using println!()
/// Example: nu --testbin echo a b c
/// Example: nu --testbin cococo a b c
/// a b c
pub fn cococo() {
let args: Vec<String> = args();