#stdout #stderr #stdio #redirect #silent #io-read

shh

Silence stderr and stdout, optionally rerouting it

5 releases (2 stable)

1.0.1 Jan 19, 2020
1.0.0 Mar 16, 2019
0.1.2 Mar 16, 2019
0.1.1 Mar 16, 2019
0.1.0 Mar 16, 2019

#1 in #silent

Download history 360/week @ 2023-12-05 292/week @ 2023-12-12 340/week @ 2023-12-19 83/week @ 2023-12-26 579/week @ 2024-01-02 198/week @ 2024-01-09 115/week @ 2024-01-16 109/week @ 2024-01-23 96/week @ 2024-01-30 158/week @ 2024-02-06 147/week @ 2024-02-13 202/week @ 2024-02-20 188/week @ 2024-02-27 138/week @ 2024-03-05 128/week @ 2024-03-12 176/week @ 2024-03-19

659 downloads per month
Used in 9 crates (4 directly)

MIT license

17KB
272 lines

(Rust) Silence stderr and stdout, optionally rerouting it.

Stdout Gagging

println!("STDOUT GAGGING", );
println!("you will see this");
let shh = shh::stdout().unwrap();
println!("but not this");
drop(shh);
println!("and this");

Stderr Gagging

println!("STDERR GAGGING", );
eprintln!("you will see this");
let shh = shh::stderr().unwrap();
eprintln!("but not this");
drop(shh);
eprintln!("and this");

Redirecting Example

println!("REDIRECTING", );
use std::io::{Read, Write};

std::thread::spawn(move || {
    let mut shh = shh::stdout().unwrap();
    let mut stderr = std::io::stderr();
    loop {
        let mut buf = Vec::new();
        shh.read_to_end(&mut buf).unwrap();
        stderr.write_all(&buf).unwrap();
    }
});

println!("This should be printed on stderr");
eprintln!("This will be printed on stderr as well");

// This will exit and close the spawned thread.
// In most cases you will want to setup a channel and send a break signal to the loop,
// and then join the thread back into it once you are finished.

Scoping

The struct Shh implements the Drop trait. Upon going out of scope, the redirection is reset and resources are cleaned up. A Shh will only last for the scope, and where no local variable is used, the silencing will not work.

Example - Silencing Dropped Early

println!("you will see this");
shh::stdout().unwrap();        // Shh struct is created, and dropped, here
println!("and expect not to see this, but you will");

To fix this, just assign a local variable

println!("you will see this");
let shh = shh::stdout().unwrap();        // Shh struct is created here
println!("and expect not to see this");
drop(shh);    // and dropped here
println!("now it works!");

Dependencies

~215KB