在shell脚本下exec为系统自带的脚本命令,其作用是用来执行其他程序:
语法格式:
exec (选项)(参数)
选项:
-c:在当前环境下执行命令,即在当前shell脚本下执行,而不是打开一个新的shell
参数:
要执行的脚本
示列:
exec -c echo linux
输出:
linux
其效果与:
echo linux
是一样的,并且exec还可以用来指定文件描述符
首先要知道什么是文件描述符:
文件描述符是一个非负的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表。
当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数。
在linux下我们可以手动指定文件描述符,无需让系统为我们指定,这里就要用到exec命令了:
exec 3<>hello.txt
这样3这个数字就会被视为文件描述符并与hello.txt文件关联,如果文件不存在则创建!
并且在关联之后3这个文件描述符就会被打开,我们可以对其进行读或者写:
//使用echo命令将"hello word"字符并使用重定向符号(<,>)重定向到文件描述符3中
echo "hello word">&3 #如果文件内容非空,则从头开始覆盖
注意如果持续写入的话,即会换行写入
比如:
echo "hello word">&3 #如果文件内容非空,则从头开始覆盖
echo "hello word">&3 #如果文件内容非空,则从头开始覆盖
echo "hello word">&3 #如果文件内容非空,则从头开始覆盖
则内容为:
hello word
hello word
hello word
并且在当前shell当前线程下可以使用多个文件描述符:
exec 1<>hello.txt
exec 2<>hello1.txt
//将hello1.txt里的内容读到hello.txt文件里
exec 1<&2
关闭读写:
exec 3>&- # 关闭写,禁止写,然而,实际上它也不能读了~
# 如果是exec 3<&-,关闭读,同时它也不能写了~
&-相当于关闭此描述符
要知道linux下一切皆文件,并且我们都知道标准I/O,这里终端屏幕上的标准输入输出文件描述符在linux下为100,这里我们可以让其重定向到文件里,这是linux已经创建了的文件描述符,并且用于描述终端屏幕上的输出I/O!
exec 1<>hello.txt
exec 100>&1
这样我们就使用重定向描述符将当前shell脚本,注意仅影响当前进程下的终端,Linux会以映射的方式将进程之间的共用描述符区分开,这样我们对它进行任何操作仅仅影响的是我们当前进程下的终端!
这样我们使用:
echo dd
会发现终端上并没有打印这行字,而是打印到hello.txt文件里去了!
注意,凡事任何会向输出I/O里输入任何数据都会被重定向到hello.txt文件里去了!
如果想让io恢复把它关闭即可恢复默认:
exec 100>&-
重定向输入:
exec 1<>dd.txt
exec 100<&1
这样我们使用cat命令将不再是将文本内容显示出来,而是从键盘接受数据并写入:
cat newfile
qqq
111
注意这里要说明一下IO文件描述符,IO只有一个文件,没有输入,输出两个文件,读即位输出,写即位输入,具体怎样重定向它还是看重定向描述符:<输入,>输出!
你会发现使用了此重定向,echo命令输出的文字也被写入到文件里去了,这里没有重定向输出呀!
答:
echo需要先将字符写入到IO文件里,然后在调用内核命令将IO文件里的内容输出到终端屏幕里,此时输入已经被重定向,所以echo输出的字符不会被显示而是被写入到重定向的输入文件里去了!
其实准确一点来说是没有输出的,因为输出只是将文件里的内容读取出来显示到指定区域里,所以c语言只定义了stdin输入缓冲区描述符,输入输出只是对缓冲区的可读性可写性更直观的表达而已!
对于输出缓冲区就拿dos窗口来说可以指定的,详细:输出缓冲区介绍
本文详细介绍了Shell脚本中的exec命令及其用法,包括如何在当前环境下执行命令、指定文件描述符来关联文件以及如何通过重定向进行读写操作。
544

被折叠的 条评论
为什么被折叠?



