【问题标题】: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 时,这尤其痛苦。

标签: bash error-handling find io-redirection


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2019-05-29
    • 2011-03-29
    • 1970-01-01
    • 2019-10-01
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多