ls: use single quotes when $, \ or ` are present in a filename
@@ -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"),
+ ],
+ );
+ }
}
