From 67e7fdfc2ec2a7e7ce4b204355a712ec0e1169ad Mon Sep 17 00:00:00 2001 From: Terts Diepraam Date: Mon, 30 Aug 2021 02:00:06 +0200 Subject: [PATCH] ls: use single quotes when $, \ or ` are present in a filename --- src/uu/ls/src/quoting_style.rs | 35 +++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/uu/ls/src/quoting_style.rs b/src/uu/ls/src/quoting_style.rs index 5f421b2ee..9f075afff 100644 --- a/src/uu/ls/src/quoting_style.rs +++ b/src/uu/ls/src/quoting_style.rs @@ -283,7 +283,7 @@ pub(super) fn escape_name(name: &str, style: &QuotingStyle) -> String { always_quote, show_control, } => { - let (quotes, must_quote) = if name.contains('"') { + let (quotes, must_quote) = if name.contains(&['"', '`', '$', '\\'][..]) { (Quotes::Single, true) } else if name.contains('\'') { (Quotes::Double, true) @@ -690,4 +690,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"), + ], + ); + } }