我有一个非常简单的命令来生成我想做的 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: [email protected]
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
我还有什么方法可以摆脱它?
答案1
你需要知道什么命令正在向 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}'