假设我做一个递归 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 在下面的评论中提供了有关重定向的相关阅读。