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.mzph.cn/news/763454.shtml

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

相关文章

看了一篇开源作者文章我沉默了良久还是发一篇心情文章

开源框架 NanUI 项目宣布将暂停开发&#xff0c;作者转行卖钢材的新闻让我心生悲意&#xff0c;开源作者生存现状很多人并不了解&#xff0c;在开源社区里能赚到钱的毕竟是少数丛林法则在开源社区同样适用&#xff0c;看了开源框架 NanUI 项目宣布将暂停开发&#xff0c;作者转…

MySQL数据库事务介绍

前言 在MySQL数据库中&#xff0c;事务&#xff08;Transaction&#xff09;是指一组SQL语句的执行序列&#xff0c;这些SQL语句要么全部执行成功&#xff0c;要么全部执行失败&#xff0c;保证数据库的一致性和完整性&#xff1b;用于操作量大、复杂度高的数据。 目录 一、…

Python之Web开发中级教程----Django站点管理

Python之Web开发中级教程----Django站点管理 网站的开发分为两部分&#xff1a;内容发布和公共访问 内容发布是由网站的管理员负责查看、添加、修改、删除数据 Django能够根据定义的模型类自动地生成管理模块 使用Django的管理模块, 需要按照如下步骤操作 : 1.管理界面本地…

如何一键升级 package.json 下所有依赖的版本

要一键升级package.json下所有依赖的版本&#xff0c;你可以使用npm-check-updates这个工具。首先&#xff0c;你需要全局安装这个工具&#xff1a; npm install -g npm-check-updates安装完成后&#xff0c;运行以下命令来更新package.json文件中的所有依赖到最新版本&#x…

Deep Graph Representation Learning and Optimization for Influence Maximization

Abstract 影响力最大化&#xff08;IM&#xff09;被表述为从社交网络中选择一组初始用户&#xff0c;以最大化受影响用户的预期数量。研究人员在设计各种传统方法方面取得了巨大进展&#xff0c;其理论设计和性能增益已接近极限。在过去的几年里&#xff0c;基于学习的IM方法的…

数据库访问技术主要包括哪些?

数据库访问技术主要包括以下几种&#xff1a; SQL(Structured Query Language)&#xff1a; SQL是一种用于管理和操作关系型数据库的标准化语言。它包括数据查询(SELECT)、数据更新(INSERT、UPDATE、DELETE)、数据定义(CREATE、ALTER、DROP)、数据控制(GRANT、REVOKE)等功能。S…

面试 Java 基础八股文十问十答第十七期

面试 Java 基础八股文十问十答第十七期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;迭代器 Iterator 是什…

【BFS广度优先搜索专题】【蓝桥杯备考训练】:母亲的牛奶、走迷宫、八数码1、八数码2、全球变暖【已更新完成】

目录 1、母亲的牛奶&#xff08;usaco training 1.5&#xff09; 2、走迷宫&#xff08;模板&#xff09; 3、八数码1&#xff08;模板&#xff09; 4、八数码2&#xff08;《算法竞赛进阶指南》& HDU1043&#xff09; 5、全球变暖&#xff08;第九届蓝桥杯省赛C &…

企业如何利用数字工厂管理系统打造自动化产线

随着信息技术的飞速发展&#xff0c;数字化转型已成为企业提升生产效率、降低成本、优化管理的重要手段。数字工厂管理系统作为数字化转型的核心组成部分&#xff0c;其在打造自动化产线方面的作用日益凸显。本文将探讨企业如何利用数字工厂管理系统打造自动化产线&#xff0c;…

【QED】斐波那契游戏

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 总结 题目 题目链接&#x1f517; 斐波那契数列指的是这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#x…

边缘自动隐藏窗体,透明度切换,同步父窗体标签切换winform

一、实现功能 默认的标签栏(superTabControl) 可以设置隐藏,即可实现全屏最大化。通过列表切换打开的标签页。用于定制B/S模式系统显示更个性,自定义样式,简介 安全 兼容性好。 二、主要代码 private void Time_Tick(object sender, EventArgs e) {获取主屏

亚马逊AWS展示高效纠错的全新量子比特!

亚马逊网络服务公司&#xff08;AWS&#xff09;在量子计算的纠错技术领域取得了显著成就&#xff0c;极大地简化了量子系统的复杂性和资源需求。他们的研究人员通过采用“双轨擦除”量子比特&#xff08;dual-rail erasure qubit&#xff09;技术&#xff0c;有效地克服了量子…

推荐一种Bean注入方式——开发经验

我们都知道三种Bean注入的方式分别是属性注入&#xff0c;setter方法注入&#xff0c;构造器注入。这三种Bean注入的方式各有优缺点&#xff0c;但是相对来说更推荐使用构造器注入的方式。 1、构造器注入的优缺点 优点&#xff1a; 1、可以注入不可变对象 因为构造方法注入是…

算法-图的强连通分量,图的最小生成树

1.图的强连通分量 (1). 定义 图的强连通分量是图论中的一个重要概念&#xff0c;主要在有向图中进行讨论。具体来说&#xff0c;如果在一个有向图G中&#xff0c;任意两个顶点vi和vj&#xff08;其中vi大于vj&#xff09;之间都存在一条从vi到vj的有向路径&#xff0c;同时也存…

分享基于PDF.js的pdf阅读器代码

一、前言 有时候开发PC端web页面的时候会遇到PDF预览、下载等功能&#xff0c;为了兼容浏览器&#xff0c;需要找一款前端插件进行开发。比较好的PDF插件&#xff0c;就是mozilla的pdf.js&#xff08;注意是mozilla&#xff0c;如果你百度遇到需要收费的&#xff0c;那应该是下…

python矢量算法-三角形变化寻找对应点

1.算法需求描述 现有随机生成的两个三角形A与B&#xff0c;在三角形A中存在Pa&#xff0c;使用算法计算出三角形B中对应的点Pb 2.python代码 import numpy as np # 计算三角形A的面积 def area_triangle(vertices): return 0.5 * np.abs(np.dot(vertices[0] - vertices[…

品时尚精酿啤酒,探秘时尚背后的故事

在琳琅满目的啤酒市场中&#xff0c;Fendi Club啤酒以其时尚的风格和品质&#xff0c;成为了引人注目的焦点。这款啤酒不仅是一种味觉的享受&#xff0c;更是一种时尚与品味的象征。接下来&#xff0c;让我们一起探索Fendi Club啤酒背后的故事。 一、Fendi Club啤酒的特色 Fen…

师徒互电,眼冒金星,采集系统变电刺激系统!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;很高兴分享我的原创文章&#xff0c;喜欢和支持我的工程师&#xff0c;一定记得给我点赞、收藏、分享哟。 加微信[chunhou0820]与作者进群沟通交流 电的我眼冒金星&#xff0c;以为自己被三体召唤&#xff0c;整个世界为我…

什么是浏览器指纹识别?Maskfog指纹浏览器有用吗?

浏览器指纹识别是好是坏&#xff1f;这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么&#xff0c;那就看下去&#xff01; 一、什么是浏览器指纹识别 浏览器指纹是指无…

Jenkins构建时报错:Build step ‘Execute shell‘ marked build as failure

1.磁盘空间不足导致报错。 2.默认情况下&#xff0c;Jenkins采取 /bin/sh -xe 这种方式 -x 将打印每一个命令&#xff1b;另一个选项 -e&#xff0c;当任何命令以非零值&#xff08;当任何命令失败时&#xff09;退出代码时&#xff0c;这会导致shell立即停止运行脚本。 解决…