為什麼即使我將 Bash 腳本重定向到 stderr,它仍然輸出到 stdout?

為什麼即使我將 Bash 腳本重定向到 stderr,它仍然輸出到 stdout?

我有一個 Bash 腳本:

#!/bin/bash
echo this should be visible only in the stderr output but it is not 1>&2
exit 0

另外,我有一個啟動此腳本的自訂應用程式。該應用程式捕獲標準輸出和標準錯誤。標準輸出為空,標準錯誤包含提供的文字。到目前為止,一切都很好。但是當我從控制台(實體終端)啟動腳本時:

./my_script.sh

我希望它不會在顯示器上列印任何內容,但它會列印。我嘗試了各種重定向組合,例如,,>&2等等>/dev/stderr,但結果是相同的。我還嘗試將 stdout 重定向到 null 1>&2 >/dev/null,但顯然它也將我的文字發送到 null 。

這是在哪裡配置的?如何使我的終端不顯示 stderr?

答案1

若要阻止腳本將其標準錯誤流傳送到終端,您需要將其重新導向至/dev/null檔案。

您可以透過呼叫帶有在命令列上重定向的標準錯誤流的腳本或讓腳本本身重定向其錯誤流來執行此操作。

若要將錯誤流重新導向到/dev/null命令列,請使用以下命令呼叫腳本

./my_script 2>/dev/null

如果您希望腳本自動丟棄其標準錯誤流,請將串流重新導向至/dev/null腳本內:

#!/bin/bash

# Discard any diagnostic output, errors, and interactive prompts.
exec 2>/dev/null

echo 'This should not be visible.' >&2
echo 'This should be visible.'

變更/dev/null為檔案的路徑名以將診斷輸出傳遞到該檔案。

標準輸出流不受標準錯誤流重定向到/dev/null檔案或重定向到檔案的影響。

請注意,腳本通常不應由 終止exit 0

答案2

要使這一特定腳本丟棄其標準輸出:

給定一個腳本:

date
date -r /var/empty/foo

編輯它成為群組命令。以這種方式將命令分組在一起允許處理組合命令的標準輸出和標準錯誤流(重定向、管道傳輸、丟棄等),就好像該組在邏輯上是單個命令一樣。

例如:

{
date
date -r /var/empty/foo
} > /dev/null

將丟棄標準輸出,但不會改變標準錯誤流的路由。

以下腳本:

{
date
date -r /var/empty/foo
} > /dev/null 2>&1

將其標準輸出重定向到 /dev/null,然後將其標準錯誤重定向到其標準輸出,從而丟棄 stderr 和 stdout。該特定語法相當於:

{
date
date -r /var/empty/foo
} > /dev/null 2>/dev/null

相關內容