gpt4 book ai didi

bash - 使用 `eval $cmd` 和仅使用 `$cmd` 在 bash 中有什么区别吗?

转载 作者:行者123 更新时间:2023-11-29 09:27:13 38 4
gpt4 key购买 nike

在 bash 中,您可以通过两种不同的方式将字符串视为命令(并运行它):

#!/bin/bash
cmd="echo -n sometext"
eval $cmd # Not sure if quotes make a difference here

#!/bin/bash
cmd="echo -n sometext"
$cmd # Not sure if quotes make a difference here either

这两者有什么区别吗?是否存在 cmd 周围的引号有所不同的情况?性能怎么样?

最佳答案

是的,有区别:)您需要先了解 eval 的工作原理。基本上,eval 是一个 shell 内置命令。传递给 eval 的任何参数都首先被视为字符串。让我们来看下面的例子:

 cmd="echo -n sometext"
eval $cmd

该命令完整的运行过程如下:

 eval $cmd
+ eval echo -n sometext
++ echo -n sometext
sometext

在这里,首先对 $cmd 进行求值,然后将整个字符串作为参数传递给 eval 命令。然后 eval 评估命令,将第一个参数视为“命令或可执行文件”,然后作为普通命令运行。因此,这里为执行完整命令执行了 2 轮评估。(注意:上面的 + 符号显示了在 bash -x 模式下使用时的逐步执行)

主要后果在于变量膨胀。使用 eval 我们有两轮扩展。一种当然是在定义cmd时,一种是在执行eval时。

var="inital"
cmd="echo -n $var \$var"
var="chanded in the mean time"
eval $cmd
inital chanded in the mean time

但是,当您只使用 $cmd 而没有使用 eval 时,bash 会处理从变量扩展到最终执行的所有事情。仅在运行 $cmd

时查看调试窗口详细信息
$cmd
+ echo -n sometext
sometext

在性能方面,直接使用 $cmd 就足够了。但是,当您尝试使用一些需要环境更改的外部命令或脚本时,您可以使用 eval

cmd="echo -n sometext" 中,引号是必需的,否则在 "echo"之后,bash 将引发如下错误:

cmd=echo -n sometext
-n: command not found

希望解释对您有所帮助。

关于bash - 使用 `eval $cmd` 和仅使用 `$cmd` 在 bash 中有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49220086/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com