Bash

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

  • April 5, 2019
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)

但是,我不能過分強調使用反斜杠創建文件名**是一個非常糟糕的主意® 。**真的。以後將很難解析和處理它們。為什麼不使用另一個字元?

引用自:https://unix.stackexchange.com/questions/148761