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