為什麼 grep 在這裡不使用管道工作?

為什麼 grep 在這裡不使用管道工作?

我有以下命令:

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

更多想法這裡, 祝你好運!

相關內容