shell exec命令_楼.耶路隋兰的博客-程序员秘密_shell_exec

技术标签: shell  Linux shell  

exec 是 Shell 内置命令,它有两种用法,一种是执行 Shell 命令,一种是操作文件描述符。本节只讲解后面一种,前面一种请大家自行学习
使用 exec 命令可以永久性地重定向,后续命令的输入输出方向也被确定了,直到再次遇到 exec 命令才会改变重定向的方向;换句话说,一次重定向,永久有效。
嗯?什么意思?难道说我们以前使用的重定向都是临时的吗?是的!前面使用的重定向都是临时的,它们只对当前的命令有效,对后面的命令无效。
请看下面的例子:
[[email protected] ~]$ echo “c.biancheng.net” > log.txt
[[email protected] ~]$ echo “C语言中文网”
C语言中文网
[[email protected] ~]$ cat log.txt
c.biancheng.net
第一个 echo 命令使用了重定向,将内容输出到 log.txt 文件;第二个 echo 命令没有再次使用重定向,内容就直接输出到显示器上了。很明显,重定向只对第一个 echo 有效,对第二个 echo 无效。
有些脚本文件的输出内容很多,我们不希望直接输出到显示器上,或者我们需要把输出内容备份到文件中,方便以后检索,按照以前的思路,必须在每个命令后面都使用一次重定向,写起来非常麻烦。如果以后想修改重定向的方向,那工作量也是不小的。
exec 命令就是为解决这种困境而生的,它可以让重定向对当前 Shell 进程中的所有命令有效,它的用法为:

exec 文件描述符操作
在《结合Linux文件描述符谈重定向,彻底理解重定向的本质》一节讲到的所有对文件描述符的操作方式 exec 都支持,请看下面的例子:
[[email protected] ~]$ echo “重定向未发生”
重定向未发生
[[email protected] ~]$ exec >log.txt
[[email protected] ~]$ echo “c.biancheng.net”
[[email protected] ~]$ echo “C语言中文网”
[[email protected] ~]$ exec >&2
[[email protected] ~]$ echo “重定向已恢复”
重定向已恢复
[[email protected] ~]$ cat log.txt
c.biancheng.net
C语言中文网
对代码的说明:
exec >log.txt将当前 Shell 进程的所有标准输出重定向到 log.txt 文件,它等价于exec 1>log.txt。

后面的两个 echo 命令都没有在显示器上输出,而是输出到了 log.txt 文件。

exec >&2用来恢复重定向,让标准输出重新回到显示器,它等价于exec 1>&2。2 是标准错误输出的文件描述符,它也是输出到显示器,并且没有遭到破坏,我们用 2 来覆盖 1,就能修复 1,让 1 重新指向显示器。

接下来的 echo 命令将结果输出到显示器上,证明exec >&2奏效了。

最后我们用 cat 命令来查看 log.txt 文件的内容,发现就是中间两个 echo 命令的输出。

重定向的恢复
类似echo “1234” >log.txt这样的重定向只是临时的,当前命名执行完毕后会自动恢复到显示器,我们不用担心。但是诸如exec >log.txt这种使用 exec 命令的重定向都是持久的,如果我们想再次回到显示器,就必须手动恢复。

以输出重定向为例,手动恢复的方法有两种:
/dev/tty 文件代表的就是显示器,将标准输出重定向到 /dev/tty 即可,也就是 exec >/dev/tty。

如果还有别的文件描述符指向了显示器,那么也可以别的文件描述符来恢复标号为 1 的文件描述符,例如 exec >&2。注意,如果文件描述符 2 也被重定向了,那么这种方式就无效了。

下面的例子演示了输入重定向的恢复:
#!/bin/bashexec 6<&0 #先将0号文件描述符保存exec <nums.txt #输入重定向sum=0while read n; do ((sum += n))doneecho "sum=KaTeX parse error: Expected 'EOF', got '&' at position 12: sum"exec 0<&̲6 6<&- #恢复输入重定…name已经$age岁了,它的网址是 u r l &quot; 将 代 码 保 存 到 t e s t . t x t , 并 执 行 下 面 的 命 令 : [ m o z h i y a n @ l o c a l h o s t   ] url&quot; 将代码保存到 test.txt,并执行下面的命令: [[email protected] ~] url"test.txt[mozhiyan@localhost ] cat nums.txt
80
33
129
71
100
222
8
[[email protected] ~]$ bash ./test.sh
sum=643
请输入名字、网址和年龄:C语言中文网 http://c.biancheng.net 7
C语言中文网已经7岁了,它的网址是 http://c.biancheng.net

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011041307/article/details/100555888

智能推荐

qt creator php,qt-creator_weixin_39722917的博客-程序员秘密

Qt CreatorQt Creator is a cross-platform IDE for development with the Qt framework.Supported PlatformsThe standalone binary packages support the following platforms:Windows 7 or later(K)Ubuntu Linux 1...

python 列表的中位数__气呀呀呀的博客-程序员秘密

找出列表的中位数class Solution: def medianFind(self,lst): #先将列表进行排序 lst.sort() half = len(lst)//2 #得到中间序列,~half为负索引,列表元素可能为偶数,需要获取中间两个数 #转化成float,中位数可能为浮点数类型,如测试用例

Mac OS 的一点历史: Mac OS, Mac OSX 与Darwin_stevenkoh的博客-程序员秘密_darwin mac

Mac OS 的一点历史: Mac OS, Mac OSX 与DarwinOS X的版本和Darwin的版本之间有一个简单的关系。除了OS X 10.0对应Darwin 1.3.x之外,其他的版本都服从以下简单的公式:If (OSX.version == 10.x.y)Darwin.version = (4+x).y因此,例如Mountain Lion的10.8...

澳大利亚每日电价和需求文本数据(2015-2020)_share_data的博客-程序员秘密

date:日期时间,记录的日期需求:浮动,每日总电力需求(兆瓦时)RRP:浮动,建议零售价为AUD $ / MWhdemand_pos_RRP:浮动,以Rh为正的每日总需求量(MWh)RRP_positive:浮动,平均正RRP,由相应的当日需求加权,以AUD $ / MWhdemand_neg_RRP:浮动,每日总需求为负RRP,以MWh为单位RRP_negative:浮动,平均负RRP,由相应的当日需求加权,以AUD $ / MWhfrac_at_neg_RRP:浮动,...

win10安装CUDA和cuDNN_dayday学习的博客-程序员秘密_windows下cuda cudnn安装

win10安装CUDA和cuDNN1.WIN10安装CUDA101.WIN10安装CUDA10CUDA Toolkit 10.0 Download:https://developer.nvidia.com/cuda-downloads下载后安装

vue中使用echarts实现柱状图点击事件_风如也的博客-程序员秘密_点击柱形图下转vue

drawBar(){ // 告警次数TOPN 柱状图 // 基于准备好的dom,初始化echarts实例 let ref = this.$refs.bar if (ref &amp;&amp; ref !== undefined) { let myChart = this.$echarts.init(ref) // 绘制图表 myChart.setOption({ color: ['#f16e6b'], tooltip: { tr

随便推点

tensorflow和python基于bp神经网络预测_Tensorflow 用训练好的模型预测_杨仲慈的博客-程序员秘密

本节涉及点:从命令行参数读取需要预测的数据从文件中读取数据进行预测从任意字符串中读取数据进行预测一、从命令行参数读取需要预测的数据训练神经网络是让神经网络具备可用性,真正使用神经网络时,需要对新的输入数据进行预测,这些输入数据 不像训练数据那样是有目标值(标准答案),而是需要通过神经网络计算来获得预测的结果。通过命令行参数输入数据:importnumpy as npimportsyspredict...

iOS 当前网络类型判断(2G/3G/4G/5G)_new_dev的博客-程序员秘密_网络类型nr什么意思

由于一直在做iOT方面的工作,所以app跟硬件设备之间的交互就做的特别多,自然而然的手机当前连接的ssid是什么类型的就尤为重要,之前在判断网络的发现发现xcode12竟然没有5G相关的key,今天升级到Xcode12.1发现多了CTRadioAccessTechnologyNRNSA和CTRadioAccessTechnologyNR。从而是的判断当前网络连接类型变得更完善。NR是New Radio的缩写,新无线(5G)的意思,NRNSA表示5G NR的非独立组网(NSA)模式。+ (...

JVM监控及诊断工具命令行篇之jps_每天都要进步一点点的博客-程序员秘密_sun.tools.jps.jps

目录一、概述二、jps:查看正在运行的Java进程一、概述性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。 体会2:无监

基于.net6的跨平台物联网网关。 通过可视化配置,轻松的连接到你的任何设备和系统(如PLC、扫码枪_「已注销」的博客-程序员秘密_多协议物联网网关配置 web

通过可视化配置,轻松的连接到你的任何设备和系统(如PLC、扫码枪、CNC、数据库、串口设备、上位机、OPC Server、OPC UA Server、Mqtt Server等),从而与 Thingsboard、IoTSharp或您自己的物联网平台进行双向数据通讯。物联网网关mqtt+opcua双通道实时输出,支持thingsboard、iotsharp等第三方平台。内置Mqtt服务端,支持websocket,进行标准mqtt输出。目前只支持遥测数据上传,后续支持属性的双向通信。内置欧姆龙PLC驱动。_1671465600

在 ParaView 中画截面上的流线__黄岛主_的博客-程序员秘密_openfoam绘制流线图

ParaView 的 Stream Tracer 无法直接作一个截面上的流线。比如,对于OpenFOAM的算例,即使是二维算例,截取一个面后,用 Stream tracer 无法得到流线。解决办法是存在的,本篇介绍如何通过一系列 filter 的组合来得到截面上的流线。后续具体步骤请参考:https://xiaopingqiu.github.io/2016/08/27/Paraview...

图片批量重命名(python实现)_他人是一面镜子,保持谦虚的态度的博客-程序员秘密

自己在采集数据时,有时候的数据命名方式并不满足一些开源程序的条件,如果我们可以自己随意去改变图像的命名,问题 就变得很容易解决;一、代码import ospath = "/media/hltt3838/DATA/dida_data/20210421_camera_IMU/dataset-dir/cam0"filelist = os.listdir(path)count=1403636580513555456for file in filelist: print(file)for

推荐文章

热门文章

相关标签