0998-文件描述符及重定向

1、介绍
文件描述符是与文件输入、输出相关的整数。它们用来跟踪已打开的文件。
最常见的文件描述符是stdin、stdout和stderr。
我们甚至可以将某个文件描述符的内容重定向到别一个文件描述符中。
下面给出一些对文件描述符进行操作和重定向的例子。

在编写脚本时会频繁使用标准输入、标准输出、标准错误。
通过内容把内容过滤将输出重定向到文件是我们平时里的基本任务之一。
当命令输出文本时,这些输出文本可能是错误信息,也可能是正常输出信息。
单靠查看输出的文本本身,我们没法区别那些是正常,那些是错误。
不过我们可以通过文件描述符解决这个问题,将那些与特定描述符关联的文本提取出来。

文件描述符是与某个打开的文件或数据流相关联的整数。
文件描述符0、1及2是系统预留的。
0-------stdin(标准输入)
1-------stdout(标准输出)
3-------stderr(标准错误)

2、将输出文本重定向或保存到一个文件中
echo "This is sample text 1">temp.txt

3、将文件追加到目标文件中,
echo "This is sample text 2">>temp.txt

4、什么是标准错误以及如何对它重定向。当命令输出错误是,stderr信息就会被打印出来,如:
ls +
ls: cannot access +: No such file or directory
+是一个非法参数,因此将返回错误信息。

成功和不成功的命令

当一个命令发生错误时,它会返回一个非0的退出状态;而当命成功完成时,它会返回数字0;
退出状态可以从特殊变量$?中获取,在命令中立即运行echo $?,就可以打印出退出状态。

下面的命令会将stderr文件打印到屏幕上,而不是文件中。(因为没有stdout的输出,所以out.txt没有内容);
ls + > out.txt

如果是如下这样,就有输出内容
ls >out.txt

下面的命令中,我们将stderr重定向到out.txt
ls + 2>out.txt

还可以把stderr单独重定向到一个文件,将stdout重定向到另一个文件
cmd 2>stderr.txt 1>stdout.txt
5、还可以利用下面的这个更好的方法将stderr转换成stdout,使得stderr和stdout都被重定向到一个文件中
cmd 2>&1 output.txt

6、如果你不想让终端中充斥着有关stderr的繁枝末节,可以将stderr的输出重定向到/dev/null,保证一切都会清除的干干净净。

7、下面的代码中,tree命令接收到来自stdin的数据。它将stdout的一份副本写入文件out.txt中。
同时将别一份副本作为后续命令的stdin。命令cat -n将从stdin中接收到的每一行数据前加上行号并写入stdout:
cat a* |tree out.txt |cat -n
cat: a1: Permission denied
1a1
2a1

cat out.txt
a1
a1
注意:cat: a1: Permission denied并没有在文件内容中出现。这是因为这些信息属于stderr,而tree只能从stdin中读取。

默认情况下,tree命令将文件覆盖,但它提供了一个-a选项,用于追加内容。
cat a* | tee -a out.txt | cat -n


8、>和>>前者是清内容,在写入;后者是追加内容,当使用重定向操作符时,输出内容不会打印在终端中,而是导向到文件中。
----------------------------
>等同于1>
>>等同于1>>
---------------------------
/dev/null是黑洞

9、将文件重定向到命令
cmd < file

10、<操作符用于从文件中读到stdin。

11、创建文件描述符
exec 3<input.txt#使用文件描述符3打开并读取文件

echo this is a test line > intut.txt
exec 3<input.txt

cat <&3

如果要再次读取,我们就不能继续使用文件描述符3了,而是需要用exec重新分配文件描述符3来进行二次读取。

我们创建一个文件描述符用于写入
exec 4 > output.txt
echo newline >&4
cat output.txt

创建一个文件描述符用于追加写入
exec 5>>input.txt
echo append line >&5
cat input.txt

你可能感兴趣的:(脚本)