查找中的权限被拒绝:为啥我们需要 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>&1stderr 重定向到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 中的主题时出现权限被拒绝错误

Django Rest:为啥访问被拒绝,尽管 AccessAny 被设置为权限?

当一批用户订阅Firebase中的主题时,权限被拒绝错误

为啥 Python pyusb usb.core 访问由于权限而被拒绝,为啥 rules.d 不能修复它?