`
yiminghe
  • 浏览: 1463334 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

shell的命令替换与eval

阅读更多

学习 shell 中遇到了 shell 提供的 这个 功能:命令替换,在shell学习指南 7.8章节的执行顺序中有详细讲解。


在执行一条命令时,会先将其中的 `` ,$() 中的语句当作命令执行一遍,再将结果加入到原命令中重新执行,例如:


echo `ls`

 

会先执行 ls 得到 xx.sh ,xx.js 等,再替换原命令为:


echo xx.sh xx.js
 

最后执行结果为


xx.sh xx.js
 

但是 shell 也提供了 eval 命令,如同熟悉的其他脚本语言,会将它的参数做为命令执行,初看会疑惑为什么shell要提供两种动态执行命令字串的机制,但是经过仔细分析,才发现shell的eval同其他语言有很大区别。


1.shell 中的函数虽然可以通过return 返回,但是这里的return 相当于 exit,只能是个状态值用于测试,而不能像其它语言一样返回复杂的结果,其处理结果只能通过输出到标准输出经过 `` ,$()取得。


2.shell 中的 eval

 

    2.1 不能获得函数处理结果 ,如1所说,所有命令,函数的处理结果只能通过 ``来获得,那么其它语言中利用eval来获得动态生成代码执行后的输出变得不可能。

 

    2.2 eval 嵌套无意义 ,在其他语言中可以通过 eval(eval("code")),来执行(执行动态生成的code的返回),而由于shell 中 eval 将后面的eval命令简单当作命令字符串执行,失去了嵌套作用,嵌套被命令替换取代,即

 

x=`\`code\``
 

或单独

 

`code`
 

来 执行(执行动态生成的code的返回)。


故总的来说在shell中,函数与命令没有明显区别,将字符串做为命令执行这一功能被分裂为 ``,eval 两种形式,单独使用 ``,如

`'ls'` 

,会出现ls执行后的值替换原命令再次执行,而出错

 

eval 'ls'

 则从另一角度执行了做为字符串的命令ls,但是由于没有命令替换的过程,执行不会出错

 

但是如果要取得命令的输出,则只能使用``。



分享到:
评论

相关推荐

    谈谈shell中的eval与crontab命令

    `eval` 命令在Shell中扮演着执行字符串作为命令的角色。它会对后面的命令进行两遍扫描,首次扫描进行变量替换,类似于C语言中的宏替代,第二次扫描则执行经过替换后的命令。这种特性使得`eval`能够处理含有变量引用...

    主要shell内置命令

    8. `builtin`: 执行内置的Shell命令,即使存在同名的函数。 9. `cd`: 更改当前工作目录,可以是绝对路径或相对路径。 10. `command`: 执行指定的命令,绕过Shell的函数查找,直接调用系统命令。 11. `declare`: ...

    Linux新手生存笔记[10]——shell脚本基础3-函数及常用命令.pdf

    - `exec`可以替换当前Shell进程或改变文件描述符。 - `exit n`使得脚本以指定的退出状态n结束。 - `export`用于设置环境变量,让子进程能够访问。 这些知识点构成了Shell脚本的基础,理解并熟练运用它们,对于...

    bash_shell内建命令和保留字

    20. **exec** 命令:替换当前Shell进程或改变其I/O。 21. **exit** 命令:退出Shell会话。 22. **export** 命令:将变量设置为环境变量,使其能在子Shell中访问。 23. **fc** 命令:编辑和运行历史命令。 24. **...

    关于linux日常使用的shell命令

    在 Linux 操作系统中,Shell 命令是用户与操作系统交互的重要方式之一。掌握常用的 Shell 命令对于提高工作效率、解决实际问题至关重要。本文将详细介绍标题及描述中提及的一些关键知识点。 #### 一、目录与文件...

    实验报告2_shell及shell编程.doc

    - `exec`:替换当前shell进程执行另一个命令。 7. **算术运算与条件测试**: - `let`:执行算术表达式。 - `test`和`[ ]`:用于条件测试,如文件存在、数值比较等。 - 逻辑运算:`-a`(and)、`-o`(or)。 8....

    LINUX与UNIX SHELL编程指南LINUX与UNIX SHELL编程指南24

    《LINUX与UNIX SHELL编程指南》第24章主要探讨了SHELL的嵌入式命令,这些命令是直接在shell环境中内置的,而非存在于/bin或/usr/bin等系统目录下。由于它们直接由shell执行,因此执行速度相对较快。本章详细介绍了多...

    shell编程和unix命令

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    bash shell内建命令

    这只是bash内建命令的冰山一角,其他命令如`dirs`、`disown`、`echo`、`enable`、`eval`、`exec`、`exit`、`export`、`fc`、`fg`、`getopts`、`hash`、`history`、`jobs`、`kill`、`let`、`local`、`logout`、`popd`...

    LINUX与UNIX SHELL编程指南(很全)

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    bash shell

    - **环境隔离**: 使用 `exec` 命令可以替换当前进程的执行上下文。 - **子进程**: 使用 `command` 或者 `(command)` 来创建子进程执行命令。 #### 受限 Shell - **受限模式**: 受限 shell 限制用户只能执行特定的...

    shell 编程指南pdf

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    绝版经典《Linux与UNIX Shell编程指南》

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    LINUX与UNIX SHELL编程指南 高清PDF

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    01_shell编程.pdf

    除了外部命令,Shell还包含许多内建命令,如`export`、`shift`、`if`、`eval`、`[`、`for`、`while`等。内建命令不会创建新的进程,它们直接在当前Shell环境中执行,返回的Exit Status用于表示命令执行的成功与否,...

    Linux与Unix Shell编程指南(PDF格式,共30章)

    2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 ...

    unix shell 实例精解(第二版)

    6. **Shell内置命令**:如`source`用于执行当前shell环境中的脚本,`set`用于显示或更改Shell选项,`eval`执行字符串作为Shell命令等。 7. **正则表达式**:在Shell中,正则表达式常用于文本匹配和替换,如`grep`、...

Global site tag (gtag.js) - Google Analytics