在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。 下面给出一些对文件描述符进行操作和重定向的例子。 1.5.1 预备知识 我们在编写脚本时会频繁使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。 通过内容过滤将输出重定向到文件是我们从事的基础任务之一。 当命令输出文本时,这些输出文本有可能是错误信息,也可能是正常的(非错误的)输出信息。 1.5.2 实战演练 将输出文本重定向或保存到一个文件中: 复制代码 代码如下:$echo"This is a sample text 1">temp.txt 这种方法通过截取文件的方式,将输出文本存储到文件temp.txt中,也就是说在把echo命令的输出写入文件之前,temp.txt中的内容首先会被清空。 复制代码 代码如下:$echo "this is sample text 2" >>temp.txt 这种方法会将文本追加到目标文件中。 复制代码 代码如下:$cat temp.txt this is sample text 1 this is sample text 2 在linux操作系统中,当使用重定向操作符时,重定向的内容不会出现在终端,而是直接被导入文件。重定向操作符默认使用标准输出。如果想使用特定的文件描述符,你必须将描述符置于操作符之前。 >等同于1>;对于>>来说,情况也类似(即>>等同于1>>)。 复制代码 代码如下:$ Is + Is:cannot access +:No such file or directory 这里,+是一个非法参数,因些将返回错误信息。 将stderr文本打印到屏幕上,而不是文件中。 复制代码 代码如下:$ Is+>out.txt Is:cannot access+:No such file or directory 然而在下面的命令中,stdout没有任何输出,因为错误已经重定向到out.txt中去了。 复制代码 代码如下:$ Is +2> out.txt # 正常运行 你可以将stderr单独重定向到一个文件,将stdout重定向到另一个文件: 复制代码 代码如下:$ cmd 2>stderr.txt 1>stdout.txt 还可以利用下面的方法将stderr转换成stdout,使得stderr和stdout都被重定向到同一个文件中: 复制代码 代码如下:$ cmd 2>&1 output.txt 或者采用下列方法: 复制代码 代码如下:$ cmd&> output.txt 有时候,在输出中可能包含一些不必要的信息(比如除错信息)。如果你不想让终端中充斥着有关stderr的繁枝末节,那么你可以将stderr的输出重定向到/dev/null, 保证一切都会被清除得干干净净。假设我们有三个文件,分别是a1、a2、a3。但是普通用户对a1没有“读一写一执行”权限。如果你需要打印文件名以a起始的所有文件的内容,你可以使用cat命令。 复制代码 代码如下:$ echo a1 >a1 $ cp a1 a2;cp a2 a3; $ chmod 000 a1 #清除所有权限 尽管可以使用通配符(a*)显示所有的文件内容,但是系统会显示一个出错信息,因为对文件a1没有可读权限。 复制代码 代码如下:$ cat a* cat:a1 permission denied a1 a1 其中,cat:a1:permission denied 属于stderr。我们可以将stderr信息重定向到一个文件中,而stdout 仍然保持不变。考虑如下代码: 复制代码 代码如下:$ cat a* 2>err.txt #stderr被重定向到err.txt a1 a1 $ cat err.txt cat:a1:permission denied 观察下面的代码: 复制代码 代码如下:$ some_command 2>/dev/null 本节是 玩转Linux文件描述符和重定向 第二页的内容,欢迎大家继续阅读。 在这个示例中,来自stderr的输出被丢到文件/dev/null中。/dev/null是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃。 因此,null设备通常也被为位桶(bit bucket)或黑洞。 因为文本已经被重定向到文件中,也就没剩下什么东西可以通过管道(|)传给接下来的命令,而这些命令是通过stdin来接收文本的。 这一切都可以使用tee来实现。 举个例子:要在终端中打印stdout,同时将它重定向到一个文件中,那么可以这样使用tee: 复制代码 代码如下:command | tee FILE1 FILE2 在下面的代码中,tee命令接收到来自stdin的数据。它将stdout的一份副写入文件out.txt,同时将别一份副本作为后续命令的stdin。命令cat -n将从stdin中接收到的每一行数据前加上行号并写入stdout: 复制代码 代码如下:$ cat a*| tee out.txt| cat -n cat: a1: permission denied 1 a1 2 a1 查看out.txt 的内容: 复制代码 代码如下:$ cat out.txt a1 a1 注意,cat:a1:permission denied并没有在任何文件内容中出现。这是因为这些信息属于stderr,而tee只能从stdin中进行读取。 复制代码 代码如下:$ cat a*| tee -a out.txt| cat -n. 带有参数的命令可以写成:command FILE1 FILE2依次类推,或者简简单单地用command FILE。 复制代码 代码如下:$ cmd1 |cmd2 |cmd - 例如: 复制代码 代码如下:$ echo who is this | tee- who is this who is this 或者我们也可以将/dev/stdin作为输出文件名来使用stdin。 补充内容: 复制代码 代码如下:$ cat file | cmd $ cmd1 | cmd2 1.将文件重定向到命令 复制代码 代码如下:$ cmd <file 2.重定向脚本内部的文本块 来看下面这段shell脚本吧,向log文件中写入头部数据,可以按照下面的方法完成: 复制代码 代码如下:#!/bin/bash cat <<EOF>log.txt LOG FILE HEADER This is a test log file Function:System statistics EOF 在cat <<EOF>log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据。log.txt文件的内容打印如下: 复制代码 代码如下:$ cat log.txt LOG FILE HEADER This is a test log file Function:System statistics |
请发表评论