@linux中exec操作文件描述符及文件重定向

exec操作文件描述符

exec命令可以用来替代当前shell;
换句话说,并没有启动子shell,使用这一命令时任何环境都将被清除,并重新启动一个shell

linux默认文件描述符:
每打开一个shell就会打开默认的三个文件描述符描0,1,2分别代表【标准输入】和【标准输出】及【标准错误输出

一、exec的基本形式

描述exec命令最贴切通俗的说法是:它践踏了你当前的shell

linux每一个打开文件都会关联一个文件描述符,需要的时候我们可以使用exec命令指定一个大于3的数字作为文件

   exec command 其中,command通常是一个shell脚本

   当这个脚本结束了,相应的会话可能也就结束了。

   但是,exec在对文件描述符进行操作的时候(也只有在这个时候),它不会覆盖你当前的shell

二、案例

1、基础命令

   1)#  exec 3</tmp/1.txt     //以“只读方式”打开/tmp/1.txt,文件描述符对应为3

   2)#  exec 3>/tmp/1.txt    //以“只写方式”打开/tmp/1.txt,文件描述符对应为3

   3)#  exec 3<>/tmp/1.txt   //以“读写方式”打开/tmp/1.txt,文件描述符对应为3

   4)#  exec 3<&-            //关闭文件描述符3

2、脚本测试

#脚本测试
#!/bin/bash
exec 4>&1         #用4记录标准输出
exec 1>/tmp/abc   #重定向标准输出
echo "123"
echo "456"
exec 1>&4         #恢复标准输出
exec 4>&-         #关闭4
   (运行此脚本,脚本中的echo输出会输出到/tmp/abc文件中,脚本第二行用4>&1 是为了记录标准输出的文件描述符便于执行完毕后恢复标准输出,恢复标准输出也可以用exec 1>/dev/tty)


#注:
   echo "hello" >&4 向文件描述符中输入内容只使用 > 不能用 >> ,此时的 > 不会清空文件,是否清空文件需要在exec命令关联文件描述符到文件的时候区别使用 >>>
#例如下脚本:
#!/bin/bash
exec 4>/tmp/abc
echo "123" >&4
echo "456" >&4
exec 4>&-

   则每次执行完脚本后/tmp/abc文件内容都是123\n456,若把第二行换成exec 4>>/tmp/abc则会追加进去(文件的清空操作是在exec命令的操作时进行的)

三、常见的文件(重定向)

    command(命令)> filename(文件名称)  #把标准输出重定向到一个新文件中
    command >> filename              #把标准输出重定向到一个文件中(追加)
    command 1 > fielname             #把标准输出重定向到一个文件中
    command > filename 2>&1          #把标准输出和标准错误一起重定向到一个文件中
    command 2 > filename             #把标准错误重定向到一个文件中
    command 2 >> filename            #把标准输出重定向到一个文件中(追加)
    command >> filename 2>&1         #把标准输出和标准错误一起重定向到一个文件中(追加)
    command < filename >filename2    #把command命令以filename文件作为标准输入,以filename2文件作为标准输出
    command < filename               #把command命令以filename文件作为标准输入
    command << delimiter             #把从标准输入中读入,直至遇到delimiter分界符
    command <&m                      #把文件描述符m作为标准输入
    command >&m                      #把标准输出重定向到文件描述符m中
    command &m<&-                    #关闭文件描述符m
posted @ 2021-06-26 21:09  ଲ一笑奈&何  阅读(206)  评论(0编辑  收藏  举报