我最近在使用find
命令搜索文件时搜索了一种过滤掉“ Permission denied ”错误的方法,我找到了这个链接:
How can I exclude all "permission denied" messages from "find"?
以下是从链接中找到的答案:
find . -name "filename" 2>&1 | grep -v 'permission denied'
虽然这个答案有效,但我并不完全理解为什么我们需要2>&1
(将stderr重定向到stdout)。
命令find . -name "filename" | grep -v 'Permission denied'
的输出是否已重定向到stdout?
答案 0 :(得分:7)
因为'permission denied'
消息是在stderr而不是标准输出中打印的。
1
是stdout
2
是stderr
&
指定以下是文件描述符而不是文件名
2>&1
将stderr
重定向到stdout
,并将错误消息通过管道传输到grep
命令。
如果您只需要排除permission denied
消息,那么这样做就可以不使用grep
:
find . -name "filename" 2>/dev/null
答案 1 :(得分:1)
使用管道时,请记住只有标准输出被发送到另一个命令的输入,这就是为什么你需要将stderr重定向到stdout然后发送标准输出(2>& ; 1)。
$ grep -v "permission denied"
将显示不包含"权限被拒绝的行"。
这个解决方案有效,但它远非最佳。
无论何时你想摆脱错误,你都要把它发送到/ dev / null:
$ command 2> /dev/null
/ dev / null就像一个黑洞,你发送的任何东西都会丢失
另一个使用/ dev / null是截断文件(仅用于学习,有足够的功能来正确执行):
$ cat /dev/null > file
发出此命令后文件将为空 你还应该注意,bash所做的第一件事就是解释重定向,例如:
$ > foobar
将创建一个文件foobar
我们说我们要将stdout和一个命令的stderr发送到一个文件:
$ command > file 2>&1
或
$ command &> file
在第一个例子中,bash将:
1 /将stderr重定向到stdout
2 /将标准输出重定向到文件
3 /执行命令
这就是为什么:
$ command 2>&1 >file
没有按预期工作。
有时你会想把stdout发送到output.txt和stderr到error.txt:
$ command > ouput.txt 2> error.txt