Linux下使用exec命令将文件与文件描述符关联

本文详细介绍了Shell脚本中的exec命令及其用法,包括如何在当前环境下执行命令、指定文件描述符来关联文件以及如何通过重定向进行读写操作。

在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编程中的核心概念,用于操作文件、设备或其他输入输出资源[^1]。在Unix和类Unix系统(如Linux)中,每个进程启动时都会默认打开3个文件描述符: - **标准输入(stdin)**:文件描述符为0,用于接收用户的输入,通常关联到键盘。例如,`cat` 命令在没有指定文件名时,会从标准输入读取内容。 ```bash cat ``` 当执行该命令后,用户可以在终端输入内容,按 `Ctrl + D` 结束输入。 - **标准输出(stdout)**:文件描述符为1,用于将程序的正常输出显示在终端上。例如,`ls` 命令的输出会显示在终端。 ```bash ls ``` - **标准错误(stderr)**:文件描述符为2,用于输出程序运行过程中产生的错误信息。例如,当尝试访问一个不存在的文件时,会输出错误信息。 ```bash cat non_existent_file ``` 在Shell中,可以使用重定向操作符来改变文件描述符的默认行为: - `>` 操作符用于截断模式的文件写入,会将标准输出重定向到指定文件,若文件存在则会清空原有内容;例如: ```bash ls > file_list.txt ``` 此命令会将 `ls` 命令的输出写入到 `file_list.txt` 文件中,如果该文件原本有内容,会被清空。 - `>>` 操作符用于追加模式的文件写入,将标准输出追加到指定文件的末尾,不会清空原有内容;例如: ```bash ls >> file_list.txt ``` 此命令会将 `ls` 命令的输出追加到 `file_list.txt` 文件的末尾。 - `2>` 用于将标准错误输出重定向到指定文件;例如: ```bash cat non_existent_file 2> error.log ``` 此命令会将 `cat` 命令尝试访问不存在文件时产生的错误信息写入到 `error.log` 文件中。 - `2>&1` 用于将标准错误输出重定向到标准输出所指向的位置;例如: ```bash ls non_existent_dir > output.txt 2>&1 ``` 此命令会将 `ls` 命令的标准输出和标准错误输出都重定向到 `output.txt` 文件中。 此外,还可以使用 `exec` 命令关联输入和输出文件描述符,以自定义文件描述符使用。例如: ```bash exec 3< input.txt read line <&3 echo $line exec 3>&- # 关闭文件描述符3 ``` 上述代码中,将文件 `input.txt` 关联文件描述符3,然后从文件描述符3读取一行内容并输出,最后关闭文件描述符3。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值