深入理解linux shell 中的exec内置命令ubuntu bash

在这里插入图片描述

概览

每当我们在Bash shell 中运行任何命令时,默认情况下都会创建一个子 shell,并生成(分叉)一个新的子进程来执行该命令。但是,当使用 exec时,exec 后面的命令将替换当前 shell。这意味着不会创建任何子 shell,并且当前进程将替换为此新命令。

进程替换实验

  1. 先查看当前shell的PID

    jagitch@jagitch-MS-7B93:tmp$ echo $$
    280513
    
  2. 打开第二个shell,查看shell 1的进程信息

    jagitch@jagitch-MS-7B93:tmp$ ps -aef | grep 280513
    jagitch   280513   22748  0 11:37 pts/0    00:00:00 bash
    jagitch   281157  273610  0 11:38 pts/1    00:00:00 grep --color=auto 280513
    
  3. 在shell 1中执行exec命令

    jagitch@jagitch-MS-7B93:tmp$ exec sleep 40
    
  4. 在shell 2中再次查看shell 1的进程信息

    jagitch@jagitch-MS-7B93:tmp$ ps -aef | grep 280513
    jagitch   280513   22748  0 11:37 pts/0    00:00:00 sleep 40
    jagitch   281573  273610  0 11:38 pts/1    00:00:00 grep --color=auto 280513
    

    此时发现280513这个进程由之前的bash替换成了sleep 40,说明exec执行地命令不会创建子进程,而是替换掉当前进程的程序。这样可以达到节约计算机资源的目的。

  5. 等shell 1中地exec命令结束后,发现shell 1退出了,此时在shell 2中查看shell 1的进程ID

    jagitch@jagitch-MS-7B93:tmp$ ps -aef | grep 280513
    jagitch   281749  273610  0 11:39 pts/1    00:00:00 grep --color=auto 280513
    

    此时发现shell 1那个进程已经被销毁了,因为默认的bash进程被exec替换为了sleep命令,这个命令执行完后就会退出,而之前那个shell进程会一直循环解释执行用户输入的命令,它不会退出被销毁。

exec的常用用法

  1. 脚本中进行命令替换

    jagitch@jagitch-MS-7B93:tmp$ cat ./execdemo.sh 
    #!/bin/bashecho first
    exec echo second
    echo lastjagitch@jagitch-MS-7B93:tmp$ chmod +x ./execdemo.sh 
    jagitch@jagitch-MS-7B93:tmp$ ./execdemo.sh 
    first
    second
    

    我们可以发现last没有被输出,因为./execdemo.sh在一个子进程中执行,第一个echo正常输出,但是遇到exec echo second后,这个子进程就被替换成echo second了,执行完这条命令该进程就退出销毁了,自然就不会执行后面的echo last了。

  2. 使用exec进行日志记录

    jagitch@jagitch-MS-7B93:tmp$ cat execlog.sh 
    #!/bin/bashLOG_FILE="output.log"exec &> "$LOG_FILE"echo "1. script started at $(date +'%Y-%m-%d')"echo "2. find all .txt files in current dir"
    find -type f -name "*.txt"echo "3. make some error"
    cat helloecho "4. script finished at $(date +'%Y-%m-%d')"jagitch@jagitch-MS-7B93:tmp$ bash execlog.sh
    jagitch@jagitch-MS-7B93:tmp$ cat output.log
    1. script started at 2024-06-28
    2. find all .txt files in current dir
    ./2.txt
    ./1.txt
    ./favorite colors.txt
    3. make some error
    cat: hello: 没有那个文件或目录
    4. script finished at 2024-06-28
    

    execlog.sh脚本中使用`exec &> "$LOG_FILE"将标准输出和标准错误都重定向到指定地文件中。

  3. 使用exec操作文件描述符

    jagitch@jagitch-MS-7B93:tmp$ cat execfd.sh
    #!/bin/bashexec 3> fruit.txt
    exec 1>&3
    echo "apple"
    echo "orange"
    exec 3>&-
    jagitch@jagitch-MS-7B93:tmp$ bash execfd.sh
    jagitch@jagitch-MS-7B93:tmp$ cat fruit.txt 
    apple
    orange
    

    exec 3> fruit.txt将文件描述符重定向到fruit.txt文件

    exec 1>&3把标准输出重定向到文件描述符为3的文件中

    exec 3>&-的意思是关闭文件描述符



每一次点赞,都是你独特的味道。每一次关注,都是我前行的动力。感谢有你,一起成长!

推荐阅读

1. 互联网、因特网和万维网傻傻分不清,一文带你彻底理解计算机中的各种网络

2. 十分钟带你入门Go语言(Golang)开发

3. 超级详细的Github双重验证开启教程&github Two-factor authentication

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高中数学之基本不等式】已知:x,y皆为正实数且x+3y=5xy,求3x+4y的最小值?

解:此题若使用“化二为一”法,会发现分母中出现了5x-3或是5y-1这样的式子,它可能导致负数的出现,已经违反了基本不等式中a,b皆大于零的应用条件。 此时应该迷途知返,及时易辙改弦。 此题适用“乘一法”,这…

第1章_搭建开发环境

文章目录 第1章 搭建开发环境1.1开发套件硬件接口资源介绍1.2资料下载1.3安装Keil MDK1.3.1**软件下载**1.3.2**软件安装**1.3.3 PACK 安装 1.4 安装 STM32CubeMX1.5 安装 STM32CubeProgrammer1.6 安装 ST-Link 驱动1.7 安装 CH340 驱动 第1章 搭建开发环境 1.1开发套件硬件接…

Redis基础教程(一):redis配置

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

星光云720全景VR系统源码

星光云720全景VR系统源码 系统体验地址项目介绍JDK版本后端主要依赖前端框架前端node 版本用户端框架介绍技术选型依赖全景内容简介系统图片部分功能截图系统体验地址 系统体验地址 VR全景系统体验地址 账号:18175760278 密码:12345678 项目介绍 JDK版…

图鸟模板-官网:基于Vue 3的前端技术探索与实践

摘要: 随着Web技术的不断发展,前端开发已经从简单的页面展示向功能丰富、交互体验优良的方向发展。Vue.js作为一款轻量级且功能强大的前端框架,自推出以来就受到了广泛的关注和应用。特别是Vue 3的发布,更是为前端开发带来了诸多新…

机器学习笔记 人脸识别技术全面回顾和小结(1)

一、简述 人脸识别是视觉模式识别的一个细分问题。人类一直在识别视觉模式,我们通过眼睛获得视觉信息。这些信息被大脑识别为有意义的概念。对于计算机来说,无论是图片还是视频,它都是许多像素的矩阵。机器应该找出数据的某一部分在数据中代表…

最近公共祖先(倍增,tarjan,树链剖分)

两个点的最近公共祖先&#xff0c;即两个点的所有公共祖先中&#xff0c;离根节点最远的一个节点。 倍增算法 1.dfs一遍&#xff0c;创建ST表 2.利用ST表求LCA 内容来源 D09 倍增算法 P3379【模板】最近公共祖先&#xff08;LCA&#xff09; #include<iostream> #in…

特斯拉下一代自动驾驶芯片的深度预测

引言 特斯拉一直以来都在自动驾驶技术上不断突破&#xff0c;随着AI大模型技术的爆发&#xff0c;其下一代自动驾驶芯片&#xff08;HW5.0&#xff09;也备受瞩目。本文将深入分析和预测特斯拉下一代自动驾驶芯片AI5的技术特点及其对行业的影响。 深入技术分析 现有自动驾驶…

React小记(五)_Hooks入门到进阶

React 16.8 版本 类组件 和 函数组件 两种组件共存&#xff0c;到目前 React 18 版本&#xff0c;官方已经不在推荐使用类组件&#xff0c;在函数组件中 hooks 是必不可少的&#xff0c;它允许我们函数组件像类组件一样可以使用组件的状态&#xff0c;并模拟组件的生命周期等一…

高效数据采集监控平台 一体化平台 数据可视化!

提高工作效率&#xff0c;一直是各种厂家在寻找的方法。任何一种有效且实用的方法都值得去尝试。数据采集监控平台是一种能高效处理数据的方式&#xff0c;其主要工作内容是从各个产生数据的仪器设备传感器中采集数据、对数据进行集中整理整合、分析、显示、绘制图表、存储、传…

java基于ssm+jsp 扶贫惠农推介系统

1管理员功能模块 管理员输入个人的用户名、密码、角色登录系统&#xff0c;这时候系统的数据库就会在进行查找相关的信息&#xff0c;如果我们输入的用户名、密码不正确&#xff0c;数据库就会提示出错误的信息提示&#xff0c;同时会提示管理员重新输入自己的用户名、密码&am…

DigiRL:让 AI 自己学会控制手机

类似于苹果此前发布的Ferret-UI 的安卓开源平替。主要用于在 Android 设备上识别 UI 和执行指令&#xff0c;不同的是它利用了离线到在线强化学习&#xff08;Offline-to-Online RL&#xff09;&#xff0c;能够快速适应应用更新或 UI 变化。

麒麟桌面系统CVE-2024-1086漏洞修复

原文链接&#xff1a;麒麟桌面操作系统上CVE-2024-1086漏洞修复 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在麒麟桌面操作系统上修复CVE-2024-1086漏洞的文章。漏洞CVE-2024-1086是一个新的安全漏洞&#xff0c;如果不及时修复&#xff0c;可能会对系统造成安全…

Windows和Linux C++判断磁盘空间是否充足

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…

自然语言处理-BERT处理框架-transformer

目录 1.介绍 2.Transformer 2.1 引言 2.2 传统RNN网络的问题 2.3 整体架构 2.4 Attention 2.5 Self-Attention如何计算 3.multi-headed机制 4. BERT训练方法 1.介绍 BERT&#xff1a;当前主流的解决框架&#xff0c;一站式搞定NLP任务。&#xff08;解决一个NLP任务时的考虑…

人工智能设备pbootcms网站模板源码

模板介绍 人工智能行业发展趋势不断攀升逐渐成为了新业态&#xff0c;小编精心为大家收集整理了一款HTML5人工智能设备pbootcms网站模板整站源码下载&#xff0c;可帮助您快速建站以展示企业的产品与业务&#xff0c;响应式自适应设计也会适配所有浏览设备。 模板截图 源码下…

文心一言4.0免费使用

领取&安装链接&#xff1a;Baidu Comate 领取季卡 有图有真相 原理&#xff1a;百度comate使用文心一言最新的4.0模型。百度comate目前免费使用&#xff0c;可以借助comate达到免费使用4.0模型目的。 如何获得 点击「Baidu Comate 领取季卡 -> 领取权益」&#xff0…

静态链表详解(C语言版)

顺序表和链表的优缺点 顺序表和链表是两种基本的线性数据结构&#xff0c;它们各自有不同的优缺点&#xff0c;适用于不同的应用场景。 顺序表&#xff08;Sequential List&#xff0c;通常指数组&#xff09; 优点&#xff1a; 随机访问&#xff1a;可以通过索引快速访问任…

使用Endnote中英文等的实现和GB7714格式

Endnote是一款被广泛使用的文献管理软件&#xff0c;其是SCI&#xff08;Thomson Scientific 公司&#xff09;的官方软件&#xff0c;支持国际期刊的参考文献格式有3776 种【也可以自定义期刊引用格式】。 软件非常方便科研狗进行文献整理&#xff0c;写笔记&#xff0c;做备…

Vue.js中的计算属性:如何让数据自动更新

引言 在Vue.js的世界里&#xff0c;computed属性就像是你的智能助手&#xff0c;它能自动追踪变化&#xff0c;帮你快速做出反应。想象一下&#xff0c;你在做一道菜&#xff0c;调料&#xff08;数据&#xff09;一变&#xff0c;味道&#xff08;界面&#xff09;立刻跟上。…