linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。
1.5.1 预备知识
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操作系统中,当使用重定向操作符时,重定向的内容不会出现在终端,而是直接被导入文件。重定向操作符默认使用标准输出。如果想使用特定的文件描述符,你必须将描述符置于操作符之前。
复制代码代码示例:
$ 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
$ cat err.txt
观察下面的代码:
复制代码代码示例:
$ some_command 2>/dev/null
在这个示例中,来自stderr的输出被丢到文件/dev/null中。/dev/null是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃。 因此,null设备通常也被为位桶(bit bucket)或黑洞。 当对stderr或stdout进行重定向时,重定向的文本将传入文件。 因为文本已经被重定向到文件中,也就没剩下什么东西可以通过管道(|)传给接下来的命令,而这些命令是通过stdin来接收文本的。 但是有一个巧妙的方法可以一方面将数据重定向到文件,另一方面还可以提供一些重定向数据的副本作为后续命令的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.重定向脚本内部的文本块
复制代码代码示例:
#!/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 (责任编辑:IT) |