Linux 输入输出(I/O)重定向(2)

shell遇到 > 操作符,会判断右边文件是否存在,如果存在就先删除,并且创建新文件。不存在直接创建。 无论左边命令执行是否成功。右边文件都会变为空。

>> 操作符,判断右边文件是否存在,如果不存在,先创建。以添加方式打开文件,会分配一个文件描述符[不特别指定,默认为1]然后,与左边对应的输出绑定。

一条命令在执行前,先会检查输出是否正确,如果输出设备错误,将不会进行命令执行

3、输入重定向 格式

command {<} [File] {<<} [Word]

这里的 < 与 << 意义不是类似于输出重定向的操作符,< 是从文件中取出数据到指定的文件中

示例

[divent@bash]$ cat > newfile 123 abc 456 [divent@bash]$cat newfile 123 abc 456 #这里使用 Ctrl + D 可以结束输入,从键盘输入的数据会保存存到 newfile 文件中

cat 命令直接使用的话可以直接接收键盘的输入

现在来尝试从文件中输入

#这里的示例我们使用刚才创建的 test3 文件 [divent@bash]$ cat test3 ls: cannot access test: No such file or directory test2 [divent@bash]$ cat > newfile < test3 [divent@bash]$ cat newfile ls: cannot access test: No such file or directory test2

这里的先将文件中的数据提取到了命令 cat 中 ,然后由 cat 写入到 newfile 中

4、自定义输入输出设备 解释

除了使用系统给你定义的文件描述符以外,用户还可以自己自定义文件描述符,首先使用 ulimit -n 来查看文件描述符的上限,然后使用命令 exec 来为一个文件添加文件描述符

示例

#首先查看一下现在已经被占用的文件描述符 [divent@bash]$ ls /proc/self/fd 0 1 2 3 #这个时候我们可以使用 exec 命令来为一个文件赋予一个文件描述符 [divent@bash]$ touch /tmp/test && exec 5>/tmp/test #然后我们再查看文件描述符 5 [divent@bash]$ ls -al /proc/self/fd/5 l-wx------. 1 divent divent 64 Aug 15 14:54 /proc/self/fd/5 -> /tmp/test #现在我们使用自己自定义的文件描述符来重定向输出 [divent@bash]$ ls -l /etc >&5 #然后我们再来查看文件中的数据, 因为文件中有数据,这里就只取出前 5 行作为示例 [divent@bash]$ head -n 5 /tmp/test total 1936 drwxr-xr-x. 3 root root 4096 Jun 10 22:12 abrt -rw-r--r--. 1 root root 16 Jun 9 16:56 adjtime -rw-r--r--. 1 root root 1518 Feb 22 22:11 aliases drwxr-xr-x. 2 root root 4096 Jun 10 22:11 alsa #我们也可以使用 exec 来将文件的默认输出指向文件 [divent@bash]$ exec 1>&5 [divent@bash]$ ls -l /etc #这个时候就会发现没有输出了,已经输出内容已经到了 /tmp/test 中了 #如果想要恢复输出,将默认输出重新指向当前 /dev/pts/0 即可 [divent@bash]$ exec 1>/dev/pts/0 #关闭文件描述符 [divent@bash]$ exec 5>&- #最后我们查看一下 [divent@bash]$ ls /proc/self/fd 0 1 2 3

最后说两句

如果不是很好理解的话,一定要贯彻 Linux 一切皆文件的理念,文件描述符最终也是指向的是文件

使用自己自定义的描述符可以简化一些备份之类的任务

在 shell 脚本中,输入输出重定向是经常使用的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/15062.html