我有以下命令:
find / -name libGL.so.1
它傳回許多帶有“權限被拒絕”的行。我想排除這些行,所以我添加了以下內容:
find / -name libGL.so.1 | grep -v 'denied'
但輸出是相同的 - mygrep -v 'denied'
沒有過濾掉帶有 的行Permission denied
。我嘗試了很多變體,查看了 grep 教程,但我無法找出問題所在。有什麼建議麼?
答案1
這無關grep
- 這是因為管道|
重定向標準輸出流stdout
,而Permission denied
訊息位於標準錯誤流中stderr
。您可以透過使用組合流來實現您想要的結果2>&1
(將檔案描述符為的流重定向2
到檔案描述符為的流1
),以便stderr
透過stdout
管道傳輸到 grep 命令的輸入
find / -name libGL.so.1 2>&1 | grep -v 'denied'
但更常見的做法是stderr
直接將其重定向到完全丟棄/dev/null
find / -name libGL.so.1 2>/dev/null
使用 |& 代替 2>&1 |
如果您查看 Bash 手冊頁,您可能會注意到以下簡介:
如果
|&
使用,則command的標準錯誤透過管道連接到command2的標準輸入;它是 的簡寫2>&1 |
。
因此,如果您想連接 STDERR 和 STDOUT,您也可以使用此構造:
find / -name libGL.so.1 |& grep -v 'denied'
答案2
你的命令應該是:
find / -name libGL.so.1 2>/dev/null
Find 抱怨標準錯誤 (fd2) 的權限。為了消除這些行,請將標準輸出重定向 (>) 到位儲存桶 (/dev/null)。
答案3
「權限被拒絕」行將進入 stderr(標準錯誤)流,但您正在通過 grep 管道 stdout(標準輸出)。
您可以完全重定向 stderr
find / -name libGL.so.1 2> /dev/null
答案4
您是否嘗試過使用以下命令呼叫命令須藤?
sudo find / -name libGL.so.1
如果它仍然顯示該訊息,請使用已經提到的重定向stderr (fd=2) 到涅槃 (/dev/null):
sudo find / -name libGL.so.1 2> /dev/null
更多想法這裡, 祝你好運!