Linux:执行命令的命令eval与Bash解析命令的方式

相关阅读

Linuxicon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482


        eval命令用于接收参数,并将这些参数作为一行命令执行,这也许会使人困惑,为什么我不能直接执行命令而需要使用eval命令间接执行呢?本文将解开这些疑惑。

        eval命令的语法如下所示,可以看到它非常简单。

用法
eval [args]
参数
args 用于组成一行命令的参数

        下面简单了解一下Bash解析一行命令的过程,这有利于之后学习eval命令。

1、Bash首先根据在考虑双引号、单引号、转义符的前提下,根据空格、制表符、换行符、命令结束符(;)、管道命令符(|)、重定向命令符(>,<)、左右括号、后台运行符(&)等将一行命令拆成多个命令和每个命令相应的token。

2、随后Bash对每个命令的第一个token进行别名替换检查,如该token是一个别名,则会进行替换。

3、之后Bash会对第一条命令(注意不是全部命令),依次进行大括号替换(Brace Expansion)、波浪号替换(Tilde Expansion)、变量替换(Parameter Expansion)、命令替换(Command Expansion)、算数替换(Arithmetic Expansion)、Token重解析(Word Splitting)和路径名替换(Pathname Expansion)。

4、最后才是执行命令,即将第一个token当做命令名,其他token作为参数和选项。

        所以,下面这种执行命令的方式是可行的,即使其有点奇怪。

[***@EDA ~]$ command='echo Hello' #这里需要使用双引号或单引号,这样等号后面的字符串才会被解析为一个token
[***@EDA ~]$ $command #其经历了变量替换、Token重解析后变成了两个token:echo和hello,所以命令名为echo,参数为Hello
Hello
[***@EDA ~]$ 'echo Hello' #直接使用字符串是不行的,因为其会被解析为一个token,直到最后被当做一个命令名
bash: echo Hello: command not found... #报错,无法找到命令

        但是直接使用变量替换去执行命令也是有问题的,它可行完全是因为Token重解析,如果此时变量的字符串代表两条命令,则会出现问题,如下所示。

[***@EDA ~]$ command='echo Hello;echo World'  #本意是想输出Hello World
[***@EDA ~]$ $command
Hello;echo World   
#由于进行变量替换时已经是第3步了,无法再将一行命令解析为多个命令(第1步),
#此时的Token重解析将Hello;echo World整体作为了echo的参数

        但是如果使用eval命令就可以解决上面两个问题,因为它可以将其参数重新组织为一行命令,并重新经历上面所说的4步过程。

[***@EDA ~]$ eval 'echo Hello' 
#即使echo Hello作为一个token是eval命令的参数,
#但eval将这个字符串作为一行命令,所以其又会被解析成echo和Hello两个token并正确执行
Hello
[***@EDA ~]$ command='echo Hello;echo World'  #本意是想输出Hello World
[***@EDA ~]$ eval $command 
#首先进行变量替换,结果为eval echo Hello;echo World,Token重解析后它们成为eval命令的三个参数,
#即echo、Hello;echo和World,最后被组织成一行命令,并解析为两条命令,即echo Hello和echo World
Hello
World         

        一个变量替换的结果不会再进行变量替换,如下所示,但使用eval命令可以做到。

[***@EDA ~]$ a=1
[***@EDA ~]$ b='$a'  #这里使用单引号阻止变量替换
[***@EDA ~]$ echo $b
$a                   #结果不会进一步替换
[***@EDA ~]$ eval echo $b #首先$b进行变量替换变成$a,随后echo和$a作为eval的两个参数,被组织成一行命令,echo $a,并再次变量替换为echo 1,最后输出1
1

        最后建议谨慎使用eval命令,因为它能将传给他的参数作为命令执行,即使你可能不知道这个参数的具体值,这会导致安全性问题。

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

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

相关文章

【应用笔记】LAT1305+使用STM32+TT类型IO的注意事项

1. 概述 在 STM32 系列 MCU 中&#xff0c; 除了一些特殊管脚外&#xff0c;绝大多数管脚都可以分类为 FT (兼容5V 信号)或 TT&#xff08;兼容 3V3 信号&#xff09;类型的 IO&#xff0c;由于 MCU 内部设计的不同&#xff0c; TT IO 相比 5V IO 有更多的限制&#xff0c;下面…

【回溯专题part1】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【已更新完成】

目录 1、n-皇后问题&#xff08;回溯模板&#xff09; 2、木棒&#xff08;《算法竞赛进阶指南》、UVA307&#xff09; 3、飞机降落&#xff08;第十四届蓝桥杯省赛C B组&#xff09; 1、n-皇后问题&#xff08;回溯模板&#xff09; n皇后问题是指将 n 个皇后放在 nn 的国…

MySQL数据库索引

目录 一.索引的基本内容 1.索引的定义 2.索引的作用 &#xff08;1&#xff09;设置了合适的索引之后&#xff0c;数据库利用各种快速定位技术&#xff0c;能够大大加快查询速度&#xff0c;这是创建索引的最主要的原因。 &#xff08;2&#xff09;当表很大或查询涉及到多…

鸿蒙一次开发,多端部署(四)工程管理

DevEco Studio的基本使用&#xff0c;请参考DevEco Studio使用指南。本章主要介绍如何使用DevEco Studio进行多设备应用开发。 说明&#xff1a; 本章的内容基于DevEco Studio 3.1.1 Release版本进行介绍&#xff0c;如您使用DevEco Studio其它版本&#xff0c;可能存在文档与产…

python --- 练习题3

目录 1、猜数字游戏&#xff08;使用random模块完成&#xff09; &#xff1a;继上期题目&#xff0c;附加 2、用户登录注册案例 3、求50~150之间的质数是那些&#xff1f; 4、打印输出标准水仙花数&#xff0c;输出这些水仙花数 5、验证:任意一个大于9的整数减去它的各位…

行业模板|DataEase制造行业大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

机器学习_正则化

文章目录 代价函数 如果我们有非常多的特征&#xff0c;我们通过学习得到的假设可能能够非常好地适应训练集&#xff08;代价函数可能几乎为 0&#xff09;&#xff0c;但是可能会不能推广到新的数据。 下图是一个回归问题的例子&#xff1a; 第一个模型是一个线性模型&#xf…

思科网络中DHCP协议的配置

一、什么是DHCP&#xff1f;DHCP有什么作用&#xff1f; &#xff08;1&#xff09;DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络协议&#xff0c;用于在局域网中自动分配IP地址和其他网络配置信息给计算机设备。我们电脑连接WiFi的时一般就是…

鸿蒙一次开发,多端部署(三)应用UX设计原则

设计原则 当为多种不同的设备开发应用时&#xff0c;有如下设计原则&#xff1a; 差异性 充分了解所要支持的设备&#xff0c;包括屏幕尺寸、交互方式、使用场景、用户人群等&#xff0c;对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外&#xff0c;还…

VMD + CEEMDAN 二次分解,CNN-Transformer预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

【Excel自动化办公】使用openpyxl对Excel进行读写操作

目录 一、环境安装 1.1 创建python项目 1.2 安装openpyxl依赖 二、Excel数据读取操作 三、Excel数据写入操作 3.1 创建空白工作簿 3.2 写数据 四、设置单元格样式 4.1 字体样式 4.2 设置单元格背景填充色 4.3 设置单元格边框样式 4.4 单元格对齐方式 4.5 数据筛选…

Manga image Translator: 一键翻译各类图片内文字支持多种语言开源AI工具

项目地址&#xff1a;GitHub - zyddnys/manga-image-translator: Translate manga/image 一键翻译各类图片内文字 https://cotrans.touhou.ai/ 官方演示&#xff1a; https://touhou.ai/imgtrans/ 夸克网盘文件包下载链接&#xff1a;夸克网盘分享提取码&#xff1a;22G3 文…

基于高斯模型的运动目标检测(车辆检测),Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

数值分析(三) Lagrange(拉格朗日)插值法及Matlab代码实现

目录 前言一、Lagrange&#xff08;拉格朗日&#xff09;插值1. 线性插值2. 抛物插值3. 拉格朗日插值多项式 二、Lagrange插值算法及matlab代码1. Lagrange 插值算法matlab实现2 实例3. 线性插值示意图代码4. 抛物插值示意图代码 三、总结四、插值法专栏 前言 本篇为插值法专栏…

Linux学习之自定义协议

前言&#xff1a; 首先对于Tcp的socket的通信&#xff0c;我们已经大概了解了&#xff0c;但是其中其实是由一个小问题&#xff0c;我们目前是不得而知得&#xff0c;在我们客户端与服务端连接成功后&#xff0c;服务端读取来自客户端得消息&#xff0c;我们使用的是函数read,…

高通 8255 基本通信(QUP)Android侧控制方法说明

一&#xff1a;整体说明 高通8255芯片中&#xff0c;SPI IIC UART核心统一由QUP V3 进行控制 QUP V3为可编程模块&#xff0c;可以将不同通道配置为SPI IIC UART通路&#xff0c;此部分配置在QNX侧 QUP 资源可以直接被QNX使用&#xff0c;Android侧可以通过两种方法使用QUP资源…

YOLOv5-Y5周:yolo.py文件解读

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Tensorflow/Pytorch 1.8.0cu111 一、代码解读 import argparse i…

idea将非UTF-8的properties修改为UTF-8编码的文件

需求背景 由于项目初始化时&#xff0c;properties文件的编码格式为ASCII编码格式&#xff0c;此时用idea打开该文件会默认展示UTF-8的编码内容&#xff0c;其中汉字可以正常展示&#xff0c;但是使用notepad打开却依旧时ASCII编码格式 idea配置 打开idea-setting-editor-f…

QT C++ QButtonGroup应用

//QT 中&#xff0c;按钮数量比较少&#xff0c;可以分别用各按钮的信号和槽处理。 //当按钮数量较多时&#xff0c;用QButtonGroup可以实现共用一个槽函数&#xff0c;批量处理&#xff0c;减少垃圾代码&#xff0c; //减少出错。 //开发平台&#xff1a;win10QT6.2.4 MSVC…

【LIMS】微服务

目录 一、服务解决方案-Spring Cloud Alibaba1.1选用原因&#xff08;基于Spring Cloud Alibaba的试用场景&#xff09;1.2 核心组件使用前期规划 部署 nacos部署 mino使用JavaFreemarker模板引擎&#xff0c;根据XML模板文件生成Word文档使用JavaFlowable 工作流引擎前端 -vue…