Bash
如何在命令替換中抑制來自命令的 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
一種。我不知道那是什麼意思 b. 我希望它不顯示
我試圖將 stderr 重定向到,
/dev/null
但它不起作用。我該如何壓制它?
一些擴展發生在重定向之前,因此您必須將其直接放置在您的
tr
命令中:touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null)
錯誤消息意味著您有一個未轉義的反斜杠。在 *nix 世界中,特殊字元通過在它們之前添加反斜杠來“轉義”。這意味著它們被解釋為簡單字元而不是特殊字元。例如:
$ printf 'foo\nbar' foo bar
The
\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)
但是,我不能過分強調使用反斜杠創建文件名**是一個非常糟糕的主意® 。**真的。以後將很難解析和處理它們。為什麼不使用另一個字元?