程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了与仅评估变量相比,eval / bash -c有什么意义?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决与仅评估变量相比,eval / bash -c有什么意义??

开发过程中遇到与仅评估变量相比,eval / bash -c有什么意义?的问题如何解决?下面主要结合日常开发的经验,给出你关于与仅评估变量相比,eval / bash -c有什么意义?的解决方法建议,希望对你解决与仅评估变量相比,eval / bash -c有什么意义?有所启发或帮助;

第三种形式与其他两种形式完全不同,但是要理解为什么,我们需要在解释命令时使用bash时要遵循的操作顺序,并查看在使用每种方法时应遵循哪些操作。

Bash解析阶段

  1. 报价处理
  2. 拆分为命令
  3. 特殊运算符解析
  4. 扩展
  5. 分词
  6. 乱语
  7. 执行

使用 eval "$String"

eval "$String"从#1开始执行上述所有步骤。从而:

  • 字符串中的文字引号变为语法引号
  • 特殊运算符如>()被处理
  • 扩展如$foo感到非常荣幸
  • 这些扩展的结果按字符分成空格,分成单独的单词
  • 如果这些词按相同的方式解析并具有可用的匹配项,则这些词将被扩展为glob,最后执行命令。

使用 sh -c "$String"

…的性能与之相同eval,但 在作为单独过程启动的新外壳中 ;因此,当此新进程退出时,对变量状态,当前目录等的更改将过期。(注意,那就是,新的外壳可以是不同的解释支持不同的语言;即sh -c "foo"不支持相同的语法bashkshzsh等做的)。

使用 $String

…从第5步“单词拆分”开始。

这是什么意思?

行情不被接受。

printf '%s\n' "two words"因此将解析为printf %s\n "twowords",这与的通常/预期行为printf %s\n two words(外壳使用了引号)相反。

不会拆分为多个命令(在;s,&s或类似命令上)。

从而:

s='echo foo && echo bar'
$s

…将发出以下输出:

foo && echo bar

…而不是以下情况:

foo
bar

特殊操作员和扩展人员不予接受。

$(foo),不$foo,不<(foo),等等。

重定向不适用。

>foo或者2>&1只是通过字符串拆分创建的另一个单词,而不是sHell指令。

解决方法

假设您将以下命令存储在变量中:

COMMAND='echo Hello'

之间有什么区别

$ eval "$COMMAND"
Hello

$ bash -c "$COMMAND"
Hello

$ $COMMAND
Hello

?如果最后一个版本较短,为什么最后一个版本几乎从未使用过(据我所知)却完全相同?

大佬总结

以上是大佬教程为你收集整理的与仅评估变量相比,eval / bash -c有什么意义?全部内容,希望文章能够帮你解决与仅评估变量相比,eval / bash -c有什么意义?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。