如何在命令替换中抑制来自命令的 stderr 警告消息?

如何在命令替换中抑制来自命令的 stderr 警告消息?
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 '/' '\\')

或者通过重定向错误输出trtouch这不是您正在做的事情):

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 '/' '\\')

相关内容