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

时间:2015-06-15 17:49:29

标签: bash error-handling find io-redirection

我最近在使用find命令搜索文件时搜索了一种过滤掉“ Permission denied ”错误的方法,我找到了这个链接:

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

以下是从链接中找到的答案:

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

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

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

2 个答案:

答案 0 :(得分:7)

因为'permission denied'消息是在stderr而不是标准输出中打印的。

1是stdout

2是stderr

&指定以下是文件描述符而不是文件名

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

如果您只需要排除permission denied消息,那么这样做就可以不使用grep

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

答案 1 :(得分:1)

使用管道时,请记住只有标准输出被发送到另一个命令的输入,这就是为什么你需要将stderr重定向到stdout然后发送标准输出(2>& ; 1)。

 $ grep -v "permission denied"

将显示不包含"权限被拒绝的行"。
这个解决方案有效,但它远非最佳。
无论何时你想摆脱错误,你都要把它发送到/ dev / null:

$ command 2> /dev/null

/ dev / null就像一个黑洞,你发送的任何东西都会丢失 另一个使用/ dev / null是截断文件(仅用于学习,有足够的功能来正确执行):

   $ cat /dev/null > file

发出此命令后文件将为空 你还应该注意,bash所做的第一件事就是解释重定向,例如:

    $ > foobar


将创建一个文件foobar
我们说我们要将stdout和一个命令的stderr发送到一个文件:

$ command > file 2>&1

        $ command &> file

在第一个例子中,bash将:
1 /将stderr重定向到stdout
2 /将标准输出重定向到文件
3 /执行命令
这就是为什么:

    $ command 2>&1 >file

没有按预期工作。
有时你会想把stdout发送到output.txt和stderr到error.txt:

    $ command > ouput.txt 2> error.txt