diff --git a/src/uu/tr/src/tr.rs b/src/uu/tr/src/tr.rs index 1d8f9a6e4..47747abac 100644 --- a/src/uu/tr/src/tr.rs +++ b/src/uu/tr/src/tr.rs @@ -57,15 +57,32 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if !(delete_flag || squeeze_flag) && sets_len < 2 { return Err(UUsageError::new( 1, - format!("missing operand after {}", sets[0].quote()), + format!( + "missing operand after {}\nTwo strings must be given when translating.", + sets[0].quote() + ), )); } - if delete_flag && !squeeze_flag && sets_len > 1 { - return Err(UUsageError::new( - 1, - format!("extra operand {}\nOnly one string may be given when deleting without squeezing repeats.", sets[1].quote()), - )); + if sets_len > 1 { + let start = "extra operand"; + if delete_flag && !squeeze_flag { + let op = sets[1].quote(); + let msg = if sets_len == 2 { + format!( + "{} {}\nOnly one string may be given when deleting without squeezing repeats.", + start, op, + ) + } else { + format!("{} {}", start, op,) + }; + return Err(UUsageError::new(1, msg)); + } + if sets_len > 2 { + let op = sets[2].quote(); + let msg = format!("{} {}", start, op); + return Err(UUsageError::new(1, msg)); + } } if let Some(first) = sets.first() { @@ -170,5 +187,5 @@ pub fn uu_app() -> Command { .help("first truncate SET1 to length of SET2") .action(ArgAction::SetTrue), ) - .arg(Arg::new(options::SETS).num_args(1..=2)) + .arg(Arg::new(options::SETS).num_args(1..)) } diff --git a/tests/by-util/test_tr.rs b/tests/by-util/test_tr.rs index 4f4b00c13..f1601c15b 100644 --- a/tests/by-util/test_tr.rs +++ b/tests/by-util/test_tr.rs @@ -1155,3 +1155,27 @@ fn test_delete_flag_takes_only_one_operand() { "extra operand 'p'\nOnly one string may be given when deleting without squeezing repeats.", ); } + +#[test] +fn test_truncate_flag_fails_with_more_than_two_operand() { + new_ucmd!() + .args(&["-t", "a", "b", "c"]) + .fails() + .stderr_contains("extra operand 'c'"); +} + +#[test] +fn test_squeeze_flag_fails_with_more_than_two_operand() { + new_ucmd!() + .args(&["-s", "a", "b", "c"]) + .fails() + .stderr_contains("extra operand 'c'"); +} + +#[test] +fn test_complement_flag_fails_with_more_than_two_operand() { + new_ucmd!() + .args(&["-c", "a", "b", "c"]) + .fails() + .stderr_contains("extra operand 'c'"); +}