diff --git a/src/uu/sort/src/sort.rs b/src/uu/sort/src/sort.rs index 19baead30..2e44fba29 100644 --- a/src/uu/sort/src/sort.rs +++ b/src/uu/sort/src/sort.rs @@ -156,6 +156,9 @@ pub enum SortError { #[error("{error}")] Uft8Error { error: Utf8Error }, + + #[error("multiple output files specified")] + MultipleOutputFiles, } impl UError for SortError { @@ -1034,6 +1037,14 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { } }; + // Prevent -o/--output to be specified multiple times + if matches + .get_occurrences::(options::OUTPUT) + .is_some_and(|out| out.len() > 1) + { + return Err(SortError::MultipleOutputFiles.into()); + } + settings.debug = matches.get_flag(options::DEBUG); // check whether user specified a zero terminated list of files for input, otherwise read files from args @@ -1427,7 +1438,9 @@ pub fn uu_app() -> Command { .long(options::OUTPUT) .help("write output to FILENAME instead of stdout") .value_name("FILENAME") - .value_hint(clap::ValueHint::FilePath), + .value_hint(clap::ValueHint::FilePath) + // To detect multiple occurrences and raise an error + .action(ArgAction::Append), ) .arg( Arg::new(options::REVERSE) diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index f827eafea..988360ca6 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -1345,3 +1345,12 @@ fn test_failed_write_is_reported() { .fails() .stderr_is("sort: write failed: 'standard output': No space left on device\n"); } + +#[test] +// Test for GNU tests/sort/sort.pl "o2" +fn test_multiple_output_files() { + new_ucmd!() + .args(&["-o", "foo", "-o", "bar"]) + .fails_with_code(2) + .stderr_is("sort: multiple output files specified\n"); +}