查找权限被拒绝:为什么我们需要 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>&1
将 stderr
重定向到 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
我最近在使用 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>&1
将 stderr
重定向到 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