Linux

命令標準輸出到 /dev/null

  • October 23, 2019

我有一個非常簡單的命令,可以生成我想做的 STDOUT,/dev/null但不知何故它不起作用,或者我在這裡遺漏了一些東西。

$ ldapsearch -Y GSSAPI -b "cn=users,cn=accounts,dc=example,dc=com" "uid=foo" | grep krbPasswordExpiration | tail -n1 | awk '{print $2}'
SASL/GSSAPI authentication started
SASL username: admin@EXAMPLE.COM
SASL SSF: 256
SASL data security layer installed.
20200608022954Z     <---- This is my krbPasswordExpiration value.

但是,如果您在上面的命令SASL行中看到這只是我想要執行的標準輸出,/dev/null那麼我嘗試了以下操作,但它似乎不起作用。

$ ldapsearch -Y GSSAPI -b "cn=users,cn=accounts,dc=example,dc=com" "uid=foo" | grep krbPasswordExpiration | tail -n1 | awk '{print $2}' 2> /dev/null

我還有什麼辦法可以擺脫它?

您需要了解正在向 stderr 執行輸出的命令,並確保重定向與該命令相關聯。

您可以將管道視為在命令周圍有 ()

所以

a | b | c

可以認為是

( a ) | ( b ) | (c )

(這不是字面上的工作方式,而是一種心理模型)。

並且重定向發生在括號內。

所以很明顯

( a ) | ( b ) | ( c 2>/dev/null )

不會從“a”重定向錯誤消息

( a 2>/dev/null) | ( b ) | ( c )

因此,您的命令重定向了命令中的錯誤awk。您真的想將錯誤從ldapsearch.

所以

$ ldapsearch -Y GSSAPI -b "cn=users,cn=accounts,dc=example,dc=com" "uid=foo" 2>/dev/null | grep krbPasswordExpiration | tail -n1 | awk '{print $2}'

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