diff --git a/src/uu/echo/src/echo.rs b/src/uu/echo/src/echo.rs index 16de245e2..4df766348 100644 --- a/src/uu/echo/src/echo.rs +++ b/src/uu/echo/src/echo.rs @@ -9,7 +9,7 @@ use std::env; use std::ffi::{OsStr, OsString}; use std::io::{self, StdoutLock, Write}; use uucore::error::{UResult, USimpleError}; -use uucore::format::{EscapedChar, FormatChar, OctalParsing, parse_escape_only}; +use uucore::format::{FormatChar, OctalParsing, parse_escape_only}; use uucore::{format_usage, help_about, help_section, help_usage}; const ABOUT: &str = help_about!("echo.md"); @@ -191,10 +191,9 @@ fn execute( if escaped { for item in parse_escape_only(bytes, OctalParsing::ThreeDigits) { - match item { - EscapedChar::End => return Ok(()), - c => c.write(&mut *stdout_lock)?, - }; + if item.write(&mut *stdout_lock)?.is_break() { + return Ok(()); + } } } else { stdout_lock.write_all(bytes)?; diff --git a/src/uucore/src/lib/features/format/mod.rs b/src/uucore/src/lib/features/format/mod.rs index 0a887d075..ee17d96da 100644 --- a/src/uucore/src/lib/features/format/mod.rs +++ b/src/uucore/src/lib/features/format/mod.rs @@ -283,7 +283,9 @@ fn printf_writer<'a>( let args = args.into_iter().cloned().collect::>(); let mut args = FormatArguments::new(&args); for item in parse_spec_only(format_string.as_ref()) { - item?.write(&mut writer, &mut args)?; + if item?.write(&mut writer, &mut args)?.is_break() { + break; + } } Ok(()) } diff --git a/tests/by-util/test_echo.rs b/tests/by-util/test_echo.rs index 17545a788..0f314da96 100644 --- a/tests/by-util/test_echo.rs +++ b/tests/by-util/test_echo.rs @@ -762,3 +762,12 @@ fn test_uchild_when_run_no_wait_with_a_non_blocking_util() { // we should be able to call wait without panics and apply some assertions child.wait().unwrap().code_is(0).no_stdout().no_stderr(); } + +#[test] +fn test_escape_sequence_ctrl_c() { + new_ucmd!() + .args(&["-e", "show\\c123"]) + .run() + .success() + .stdout_only("show"); +}