From 4ac2de925d4e9577a6c4b8f253d890e8c3ad57b6 Mon Sep 17 00:00:00 2001 From: Julio Rincon Date: Tue, 16 Oct 2018 22:10:53 +1100 Subject: [PATCH] tee: handle '-' as filename (POSIX spec) fix #1278 --- src/tee/tee.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) mode change 100644 => 100755 src/tee/tee.rs diff --git a/src/tee/tee.rs b/src/tee/tee.rs old mode 100644 new mode 100755 index 4285df568..abd769f7d --- a/src/tee/tee.rs +++ b/src/tee/tee.rs @@ -50,7 +50,7 @@ fn options(args: &[String]) -> Result { let version = format!("{} {}", NAME, VERSION); let arguments = "[OPTION]... [FILE]..."; let brief = "Copy standard input to each FILE, and also to standard output."; - let comment = "If a FILE is -, copy again to standard output."; + let comment = "If a FILE is -, it refers to a file named - ."; let help = format!( "{}\n\nUsage:\n {} {}\n\n{}\n{}", version, @@ -59,8 +59,7 @@ fn options(args: &[String]) -> Result { opts.usage(brief), comment ); - let mut names: Vec = m.free.clone().into_iter().collect(); - names.push("-".to_owned()); + let names: Vec = m.free.clone().into_iter().collect(); let to_print = if m.opt_present("help") { Some(help) } else if m.opt_present("version") { @@ -87,12 +86,13 @@ fn exec(options: Options) -> Result<()> { } fn tee(options: Options) -> Result<()> { - let writers: Vec> = options + let mut writers: Vec> = options .files .clone() .into_iter() .map(|file| open(file, options.append)) .collect(); + writers.push(Box::new(stdout())); let output = &mut MultiWriter { writers: writers }; let input = &mut NamedReader { inner: Box::new(stdin()) as Box, @@ -105,11 +105,8 @@ fn tee(options: Options) -> Result<()> { } fn open(name: String, append: bool) -> Box { - let is_stdout = name == "-"; let path = PathBuf::from(name); - let inner: Box = if is_stdout { - Box::new(stdout()) - } else { + let inner: Box = { let mut options = OpenOptions::new(); let mode = if append { options.append(true)