[关闭]
@kuailezhishang 2014-12-23T14:08:31.000000Z 字数 1600 阅读 3069

1.文件描述符&重定向

Shell


1.1基础

1.预备知识

标准输入(stdin)、标准输出(stdout)和标准错误(stderr)是编写脚本的时候经常使用的,因为输出的信息可能是上述的一种。

文件描述符 是与打开的某个文件或者数据流相关联的整数。文件描述符0,1,2是系统预留的。

2.实例

echo This is a sample. > temp.txt

可将文本输出到 temp.txt 中,是通过截断文件的方式,也就是说在echo命令写入前先将文件中的内容清空。

echo This is a sample. >> temp.txt

上述命令是追加的方式。

说明重定向之前先了解一下什么是成功和不成功的命令。

当一个命令发生错误并退出的时候,它会返回一个非0的值。成功后会返回0。可以通过 $? 查看返回的值。

ls 2> out.txt

将错误输出到文件中。

你也可以这样:

cmd 2> out.txt 1> temp.txt

将标准错误和标准输出重定向到两个文件中。当然,还有更精简的方式输出到同一个文件中:

cmd 2>&1 out.txt

有时候你并不想保存错误输出,那就将它引向一个“黑洞”(/dev/null)吧,就像错误输出没有产生过一样。

这个时候,如果你既想把输出保存起来,同时又想查看输出,怎么办呢?

command | tee out.txt | cat -n

这个时候command 的结果会保存在 out.txt 中,同时也会通过管道最为标准输出向下传递。 cat -n 将结果加上行号输出。

我们也可以使用 stdin 作为命令参数。只需要将-作为命令的文件名即可。

  1. $ echo who is this | tee -
  2. who is this
  3. eho is this

3.原理

默认的重定向操作符使用标准输出。因此 > 等同于 1>

4.补充

stdin 读取输入的命令能以多种方式接受数据。

将文件重定向到命令,借助重定向,我们可以像使用 stdin 那样从文件中读取数据。

$ cmd < file

自定义文件描述符:

创建一个文件描述符进行文件读取:

$ exec 3<input.txt # 使用文件描述符3打开并读取文件

我们可以这样使用它:

  1. $ echo this is a test > input.txt
  2. $ exec 3<input.txt

这就可以在命令中使用文件描述符3了。

  1. $ cat <&3
  2. this is a test

如果想再次读取就不能使用3了,需要再次分配读取。

创建文件描述符用于写入:

  1. $ exec 4>output.txt
  2. $ echo newline > &4
  3. $ cat outline
  4. newline

dev/stdin -> proc/self/fd/0 -> dev/pts/1

标准操作下的输入输出,指向了虚拟目录下当前进程的终端中。

1.2重定向&管道 原理:

重定向

$ tail -f /var/log/message  > abc

然后挂起。 ps 查看一下该进程的进程号是 15551 .

$ cat /proc/15551/fd/?

可以看到:

  1. /proc/15551/fd/0 -> /dev/pts/1
  2. /proc/15551/fd/1 -> /roor/test/abc #上述命令的重定向输出文件
  3. /proc/15551/fd/2 -> /dev/pts/1
  4. /proc/15551/fd/3 -> /var/log/message
  5. /proc/15551/fd/4 -> inotify

重定向就是将链接指向执行的文件。

管道

将前面命令的标准输出作为后面命令的标准输入。

注意是 标准输出 也就是说,在管道传递的时候标准错误输出已经被过滤掉了。所以,前面命令的标准错误输出都会打印在终端上.

有很多命令不直接支持标准输入的形式作为输入。

$ which find | ls -l

不能输出 find 的信息。使用如下的方式即可。

$ which find | xargs ls -l 
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注