diff --git a/src/uu/who/src/platform/unix.rs b/src/uu/who/src/platform/unix.rs index 8917ac70190..31b5c3114e2 100644 --- a/src/uu/who/src/platform/unix.rs +++ b/src/uu/who/src/platform/unix.rs @@ -209,8 +209,9 @@ impl Who { .filter(UtmpxRecord::is_user_process) .map(|ut| ut.user()) .collect::>(); - println!("{}", users.join(" ")); - println!("{}", translate!("who-user-count", "count" => users.len())); + let mut out = stdout().lock(); + writeln!(out, "{}", users.join(" "))?; + writeln!(out, "{}", translate!("who-user-count", "count" => users.len()))?; } else { let records = utmpx::Utmpx::iter_all_records_from(f); diff --git a/tests/by-util/test_who.rs b/tests/by-util/test_who.rs index fddb2268174..f022b3842f9 100644 --- a/tests/by-util/test_who.rs +++ b/tests/by-util/test_who.rs @@ -292,3 +292,22 @@ fn test_piped_to_dev_full() { .fails() .stderr_is("who: No space left on device\n"); } + +#[cfg(target_os = "linux")] +#[test] +fn test_count_write_error() { + // Before the fix, `who -q` used `println!` which panics on a write error. + // The short-list branch must propagate stdout failures gracefully (#13388). + let ts = TestScenario::new(util_name!()); + + let dev_full = std::fs::OpenOptions::new() + .write(true) + .open("/dev/full") + .unwrap(); + + ts.ucmd() + .arg("--count") + .set_stdout(dev_full) + .fails() + .stderr_is("who: No space left on device\n"); +}