2017-09-02 81 views
0

當我意識到輸出重定向&>在腳本中不起作用時,我試圖製作一個小腳本。如果我在終端如何在bash中抑制stdout和stderr

dpkg -s firefox &> /dev/null 

dpkg -s firefox 2>&1 /dev/null 

寫我沒有得到任何輸出,但如果我在腳本中插入它,它就會顯示輸出。奇怪的是,如果我寫腳本

dpkg -s firefox 1> /dev/null 

dpkg -s firefox 2> /dev/null 

命令的輸出被抑制。我怎樣才能抑制stderrstdout

+0

難道你不是指「壓制stdout和stderr」嗎? – pedromss

+0

是的,我的錯! –

+1

您確定腳本正在使用'/ bin/bash'運行,而不是'/ bin/sh'嗎? '#!'行的外觀是什麼? '&>'是一個'bash'擴展名,所以它可能無法在其他shell中使用。 – Barmar

回答

4

&>是bash擴展名:&>filename等同於POSIX標準>filename 2>&1

確保腳本以#!/bin/bash開頭,所以它能夠使用bash擴展名。 #!/bin/sh運行不同的shell(或者它可能是bash的鏈接,但是當它看到它以該名稱運行時,它會切換到更多POSIX兼容模式)。

你幾乎是正確的2>&1 >/dev/null,但順序是重要的。重定向從左到右執行,因此您的版本將舊的stdout複製到stderr,然後將stdout重定向到/dev/null

3

製作文件描述符2(錯誤),其中文件描述符1(標準輸出)正在寫

dpkg -s firefox >/dev/null 2>&1 

這將抑制這兩個來源寫不出來。