假设我做一个递归ls
$ ls -R
在根目录上。
我收到很多这样的消息——
ls: cannot open directory ./var/lib/sendmail: Permission denied
ls: cannot open directory ./var/lib/sudo: Permission denied
...
有没有办法避免显示上述“ cannot open directory
”消息?
答案1
由于这些是错误消息,因此它们被发送到 stderr 而不是 stdout。解决方案是重定向 stderr:
ls -R 2>/dev/null
解释:
任何命令都有 3 个标准文件描述符:标准输入 (0)(通常是输入命令的终端)、标准输出 (1)(通常是命令打印其输出的终端)、标准错误 (2)(默认情况下是与标准输出相同)。
大多数(如果不是全部)程序/工具将警告和错误打印到标准错误文件描述符。现在,如果文件描述符被修复的话,它们就没有多大用处了;这就是为什么 shell 提供重定向:您可以将任何标准文件描述符重定向到您想要的任何文件。
重定向标准输入(从文件而不是键盘获取输入):
interactive_program 0< file_with_answers
正如您所看到的,这可以帮助您自动运行简单的程序,这些程序通过在标准输入上提供所谓的“答案文件”来提出很多问题。
这可以缩短为
interactive_program < file_with_answers
因为<
使重定向变得清晰(从文件到该程序)
1>...
类似地,stdout 可以通过or >...
or重定向>>...
(附加到现有文件而不是截断它)
标准错误重定向要求您显式指定文件描述符,如下所示:2>...
,因此上面的作用是将所有错误定向到特殊文件,/dev/null
该文件有点像位黑洞。
相关阅读关于 MattDMo 在下面的评论中提供的重定向。