副标题[/!--empirenews.page--]
了解如何将 “&” 与尖括号结合使用,并从命令行中获得更多信息。
在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(& 、| 、; 、> 、< 、{ 、[ 、( 、) 、] 、} 等等)的任务中,我们一直在仔细研究 & 符号。
上次,我们看到了如何使用 & 把可能需要很长时间运行的进程放到后台运行。但是,& 与尖括号 < 结合使用,也可用于将输出或输出通过管道导向其他地方。
在 前面的 尖括号教程中,你看到了如何使用 > ,如下:
ls > list.txt
将 ls 输出传递给 list.txt 文件。
现在我们看到的是简写:
ls 1> list.txt
在这种情况下,1 是一个文件描述符,指向标准输出(stdout )。
以类似的方式,2 指向标准错误输出(stderr ):
ls 2> error.log
所有错误消息都通过管道传递给 error.log 文件。
回顾一下:1> 是标准输出(stdout ),2> 是标准错误输出(stderr )。
第三个标准文件描述符,0< 是标准输入(stdin )。你可以看到它是一个输入,因为箭头(< )指向0 ,而对于 1 和 2 ,箭头(> )是指向外部的。
标准文件描述符有什么用?
如果你在阅读本系列以后,你已经多次使用标准输出(1> )的简写形式:> 。
例如,当(假如)你知道你的命令会抛出一个错误时,像 stderr (2 )这样的东西也很方便,但是 Bash 告诉你的东西是没有用的,你不需要看到它。如果要在 home/ 目录中创建目录,例如:
mkdir newdir
如果 newdir/ 已经存在,mkdir 将显示错误。但你为什么要关心这些呢?(好吧,在某些情况下你可能会关心,但并非总是如此。)在一天结束时,newdir 会以某种方式让你填入一些东西。你可以通过将错误消息推入虚空(即 `/dev/null )来抑制错误消息:
mkdir newdir 2> /dev/null
这不仅仅是 “让我们不要看到丑陋和无关的错误消息,因为它们很烦人”,因为在某些情况下,错误消息可能会在其他地方引起一连串错误。比如说,你想找到 /etc 下所有的 .service 文件。你可以这样做:
find /etc -iname "*.service"
但事实证明,在大多数系统中,find 显示的错误会有许多行,因为普通用户对 /etc 下的某些文件夹没有读取访问权限。它使读取正确的输出变得很麻烦,如果 find 是更大的脚本的一部分,它可能会导致行中的下一个命令排队。
相反,你可以这样做:
find /etc -iname "*.service" 2> /dev/null
而且你只得到你想要的结果。
文件描述符入门
单独的文件描述符 stdout 和 stderr 还有一些注意事项。如果要将输出存储在文件中,请执行以下操作:
find /etc -iname "*.service" 1> services.txt
工作正常,因为 1> 意味着 “发送标准输出且自身标准输出(非标准错误)到某个地方”。
但这里存在一个问题:如果你想把命令抛出的错误信息记录到文件,而结果中没有错误信息你该怎么做?上面的命令并不会这样做,因为它只写入 find 正确的结果,而:
find /etc -iname "*.service" 2> services.txt
只会写入命令抛出的错误信息。
我们如何得到两者?请尝试以下命令:
find /etc -iname "*.service" &> services.txt
…… 再次和 & 打个招呼!
我们一直在说 stdin (0 )、stdout (1 )和 stderr (2 )是“文件描述符”。文件描述符是一种特殊构造,是指向文件的通道,用于读取或写入,或两者兼而有之。这来自于将所有内容都视为文件的旧 UNIX 理念。想写一个设备?将其视为文件。想写入套接字并通过网络发送数据?将其视为文件。想要读取和写入文件?嗯,显然,将其视为文件。
因此,在管理命令的输出和错误的位置时,将目标视为文件。因此,当你打开它们来读取和写入它们时,它们都会获得文件描述符。
(编辑:宜春站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|