diff --git a/src/uu/ls/src/quoting_style.rs b/src/uu/ls/src/quoting_style.rs index 4839370ee..149733cf9 100644 --- a/src/uu/ls/src/quoting_style.rs +++ b/src/uu/ls/src/quoting_style.rs @@ -287,7 +287,7 @@ pub(super) fn escape_name(name: &OsStr, style: &QuotingStyle) -> String { show_control, } => { let name = name.to_string_lossy(); - let (quotes, must_quote) = if name.contains('"') { + let (quotes, must_quote) = if name.contains(&['"', '`', '$', '\\'][..]) { (Quotes::Single, true) } else if name.contains('\'') { (Quotes::Double, true) @@ -694,4 +694,37 @@ mod tests { ); check_names("name#", vec![("name#", "shell"), ("name#", "shell-escape")]); } + + #[test] + fn test_special_chars_in_double_quotes() { + check_names( + "can'$t", + vec![ + ("'can'\\''$t'", "shell"), + ("'can'\\''$t'", "shell-always"), + ("'can'\\''$t'", "shell-escape"), + ("'can'\\''$t'", "shell-escape-always"), + ], + ); + + check_names( + "can'`t", + vec![ + ("'can'\\''`t'", "shell"), + ("'can'\\''`t'", "shell-always"), + ("'can'\\''`t'", "shell-escape"), + ("'can'\\''`t'", "shell-escape-always"), + ], + ); + + check_names( + "can'\\t", + vec![ + ("'can'\\''\\t'", "shell"), + ("'can'\\''\\t'", "shell-always"), + ("'can'\\''\\t'", "shell-escape"), + ("'can'\\''\\t'", "shell-escape-always"), + ], + ); + } }