首页 文章

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

提问于
浏览
2

我最近在搜索使用 find 命令搜索文件时过滤掉“权限被拒绝”错误的方法,我找到了这个链接:

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 回答

  • 7

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

    1 是标准输出

    2 是stderr

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

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

    如果您只需要排除 permission denied 消息,那么这将在不使用 grep 的情况下执行:

    find . -name "filename" 2>/dev/null
    
  • 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
    假设我们想将一个命令的stdout和stderr发送到一个文件:

    $ command > file 2>&1
    

    要么

    $ command &> file
    

    在第一个例子中,bash将:
    1 /将stderr重定向到stdout
    2 /将stdout重定向到文件
    3 /执行命令
    这就是原因:

    $ command 2>&1 >file
    

    不会按预期工作 .
    有时您需要将stdout发送到output.txt并将stderr发送到error.txt:

    $ command > ouput.txt 2> error.txt
    

相关问题