查找中的权限被拒绝:为啥我们需要 2>&1?
Posted
技术标签:
【中文标题】查找中的权限被拒绝:为啥我们需要 2>&1?【英文标题】:Permission denied in find: why do we need 2>&1?查找中的权限被拒绝:为什么我们需要 2>&1? 【发布时间】:2015-08-31 08:01:59 【问题描述】:我最近在寻找一种在使用find
命令搜索文件时过滤掉“权限被拒绝”错误的方法,我找到了这个链接:
How can I exclude all "permission denied" messages from "find"?
这是链接中对我有用的答案:
find . -name "filename" 2>&1 | grep -v 'permission denied'
虽然这个答案有效,但我不完全理解为什么我们需要2>&1
(将标准错误重定向到标准输出)。
命令find . -name "filename" | grep -v 'Permission denied'
的输出不是已经重定向到标准输出了吗?
【问题讨论】:
只需将stderr
转储到/dev/null
。无需管道到 grep。
理解修剪错误消息不会使查找成功非常重要。换句话说,即使您2>/dev/null
,您的查找仍然会失败(设置非零退出代码)。当使用 find 的脚本中有set -e
时,这尤其痛苦。
【参考方案1】:
使用管道时,您应该记住只有标准输出被发送到另一个命令的输入,这就是为什么您需要将 stderr 重定向到 stdout 然后发送 stdout (2>&1)。
$ grep -v "permission denied"
将显示不包含“permission denied”的行。 该解决方案有效,但远非最佳。 当你想摆脱错误时,你应该把它发送到 /dev/null:
$ command 2> /dev/null
/dev/null 就像一个黑洞,你发送到那里的任何东西都会丢失。 /dev/null 的另一个用途是截断文件(仅用于学习,有足够的功能可以正确执行此操作):
$ cat /dev/null > file
发出此命令后文件将为空。 您还应该注意,bash 所做的第一件事是解释重定向,例如:
$ > foobar
将创建一个文件 foobar 假设我们想将一个命令的标准输出和标准错误发送到一个文件:
$ command > file 2>&1
或
$ command &> file
在第一个示例中,bash 将: 1/将标准错误重定向到标准输出 2/ 将标准输出重定向到文件 3/执行命令 这就是为什么:
$ command 2>&1 >file
不会按预期工作。 有时您希望将标准输出发送到 output.txt 并将标准错误发送到 error.txt :
$ command > ouput.txt 2> error.txt
【讨论】:
【参考方案2】:因为'permission denied'
消息打印在标准错误而不是标准输出中。
1
是标准输出
2
是标准错误
&
指定后面的内容是文件描述符而不是文件名
2>&1
将stderr
重定向到stdout
并允许将错误消息通过管道传送到grep
命令中。
如果您只需要排除permission denied
消息,那么这将在不使用grep
的情况下完成:
find . -name "filename" 2>/dev/null
【讨论】:
但是如果打印到标准错误,为什么我每次都看到“find .'/path/to/file : Permission denied'”?在这种情况下,它似乎正在打印到标准输出...... @wizurd 不,终端打印 stderr(以防出错)和 stdout(以防正常操作)... 顺便说一句,比2>/dev/null
更好的解决方案是here以上是关于查找中的权限被拒绝:为啥我们需要 2>&1?的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试使用 EF 在 ASP.NET MVC5 中查询视图时,为啥会收到错误“数据库 'ELITEPROD' 中的 CREATE TABLE 权限被拒绝”?
批量用户订阅 Firebase 中的主题时出现权限被拒绝错误