如何“静音” ls 命令?

Cod*_*lue 9 ls

假设我做一个递归 ls

$ ls -R 
Run Code Online (Sandbox Code Playgroud)

在根目录上。

我收到很多这样的消息——

ls: cannot open directory ./var/lib/sendmail: Permission denied
ls: cannot open directory ./var/lib/sudo: Permission denied
...
Run Code Online (Sandbox Code Playgroud)

有没有办法避免显示上述“ cannot open directory”消息?

Jos*_* R. 24

由于这些是错误消息,它们被发送到 stderr 而不是 stdout。解决方案是您重定向 stderr:

ls -R 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

解释:

任何命令都有 3 个标准文件描述符:标准输入 (0)(通常是您键入命令的终端),标准输出 (1)(通常是命令打印其输出的终端)标准错误 (2)(默认情况下它是与标准输出相同)。

大多数(如果不是全部)程序/工具将警告和错误打印到标准错误文件描述符。现在,如果文件描述符被修复,它们将没有多大用处;这就是 shell 提供重定向的原因:您可以将任何标准文件描述符重定向到您想要的任何文件。

重定向标准输入(从文件而不是键盘获取输入):

interactive_program 0< file_with_answers
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这可以帮助您自动运行简单程序,这些程序通过在标准输入上提供所谓的“答案文件”来提出很多问题。

这可以缩短为

 interactive_program < file_with_answers
Run Code Online (Sandbox Code Playgroud)

因为<使重定向清晰(文件程序)

类似地,标准输出可以通过被重定向1>...>...>>...(追加到现有文件,而不是截断它)

标准错误重定向要求您像这样明确指定文件描述符:2>...,因此上面所做的是将所有错误定向到特殊文件/dev/null,该文件有点像位黑洞。

MattDMo 在下面的评论中提供了有关重定向的相关阅读

  • 这是一个重定向命令。`&gt;` 将重定向 `stdout` 或标准输出,`2&gt;` 重定向 `stderr` 或标准错误。`1&gt;` 与 `&gt;` 相同,因此您可以看到 `2` 的来源。您可以在 Linux 文档项目中阅读有关 I/O 重定向的更多信息 [此处](http://www.tldp.org/LDP/abs/html/io-redirection.html)。 (3认同)