查找权限被拒绝:为什么我们需要 2>&1?

Permission denied in find: why do we need 2>&1?

我最近在使用 find 命令搜索文件时寻找一种方法来过滤掉“Permission denied”错误,我发现了这个 link:

How can I exclude all "permission denied" messages from "find"?

这是 link 对我有用的答案:

find . -name "filename" 2>&1 | grep -v 'permission denied'

虽然这个答案有效,但我不完全理解为什么我们需要 2>&1(将 stderr 重定向到 stdout)。

命令 find . -name "filename" | grep -v 'Permission denied' 的输出是否已经重定向到标准输出?

因为 'permission denied' 消息是在 stderr 而不是 stdout 中打印的。

1 是标准输出

2 是标准错误

& 指定后面是文件描述符而不是文件名

2>&1stderr 重定向到 stdout 并使错误消息能够通过管道传输到 grep 命令中。

如果您只需要排除 permission denied 消息,那么无需使用 grep:

find . -name "filename" 2>/dev/null

当使用管道时,你应该记住只有标准输出被发送到另一个命令的输入,这就是为什么你需要将 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/将 stderr 重定向到 stdout
2/ 将标准输出重定向到文件
3/执行命令
这就是为什么 :

    $ command 2>&1 >file


不会按预期工作。
有时您会希望将标准输出发送到 output.txt 并将标准错误发送到 error.txt :

    $ command > ouput.txt 2> error.txt