touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\') 2> /dev/null
其中 foo 是一个目录
它正在读取 foo 的完整路径名并将其创建为一个文件,用“\”替换所有“/”,并在前面放置一个directory_,以便该目录
/home/test/foo
将创建一个文件directory_\home\test\foo
它完全符合我的要求,除了不断打印警告之外tr: warning: an unescaped backslash at end of string is not portable
A。我不知道这意味着什么 B.我希望它不显示
我尝试将 stderr 重定向到/dev/null
,但没有成功。我该如何取消它?
答案1
该错误消息意味着您有一个未转义的反斜杠。在 *nix 世界中,特殊字符可以通过在其前面添加反斜杠来“转义”。这意味着它们被解释为简单字符而不是特殊字符。例如:
$ printf 'foo\nbar'
foo
bar
是\n
一个特殊字符,表示换行符。但如果我们逃避斜杠,我们会得到:
$ printf 'foo\\nbar'
foo\nbar
因此,您可以通过转义反斜杠来摆脱它:
touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\\')
或者通过重定向错误输出tr
(touch
这不是您正在做的事情):
touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\' 2> /dev/null)
然而,我必须强调的是这是一个非常糟糕的主意®创建带有反斜杠的文件名。真的。稍后解析和处理它们将是地狱。为什么不使用另一个角色呢?
答案2
一些扩展发生在重定向之前,因此您必须将其直接放在tr
命令中:
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null)
答案3
使用带双反斜杠的单引号,不会出现任何错误。
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\\')