diff --git a/src/uu/printf/src/printf.rs b/src/uu/printf/src/printf.rs index f278affae..bbcc50c00 100644 --- a/src/uu/printf/src/printf.rs +++ b/src/uu/printf/src/printf.rs @@ -7,7 +7,7 @@ use std::io::stdout; use std::ops::ControlFlow; use uucore::error::{UResult, UUsageError}; use uucore::format::{parse_spec_and_escape, FormatArgument, FormatItem}; -use uucore::{format_usage, help_about, help_section, help_usage}; +use uucore::{format_usage, help_about, help_section, help_usage, show_warning}; const VERSION: &str = "version"; const HELP: &str = "help"; @@ -48,6 +48,13 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { // Without format specs in the string, the iter would not consume any args, // leading to an infinite loop. Thus, we exit early. if !format_seen { + if let Some(arg) = args.next() { + use FormatArgument::*; + let Unparsed(arg_str) = arg else { + unreachable!("All args are transformed to Unparsed") + }; + show_warning!("ignoring excess arguments, starting with '{arg_str}'"); + } return Ok(()); } @@ -59,6 +66,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { }; } } + Ok(()) } diff --git a/tests/by-util/test_printf.rs b/tests/by-util/test_printf.rs index 9b29c404c..044817214 100644 --- a/tests/by-util/test_printf.rs +++ b/tests/by-util/test_printf.rs @@ -679,7 +679,11 @@ fn char_as_byte() { #[test] fn no_infinite_loop() { - new_ucmd!().args(&["a", "b"]).succeeds().stdout_only("a"); + new_ucmd!() + .args(&["a", "b"]) + .succeeds() + .stdout_is("a") + .stderr_contains("warning: ignoring excess arguments, starting with 'b'"); } #[test]