gpt4 book ai didi

linux - 使用 eval '$cmd' 执行变量将产生错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:27 27 4
gpt4 key购买 nike

如果我将我的 cat 命令保存到一个字符串中然后执行它,那么我会得到一个错误

linux# cmd="cat /data/test/test.tx* | grep toto"
linux# eval '$cmd'
cat: |: No such file or directory
cat: grep: No such file or directory
cat: toto: No such file or directory

连同

linux# $cmd
cat: |: No such file or directory
cat: grep: No such file or directory
cat: toto: No such file or directory

我知道

linux# eval "$cmd"

有效,但在我的脚本中我想使用 eval '$cmd'

cat命令保存到变量后如何执行?

现在如果 cmd="echo anymessage" 那么

linux# eval '$cmd'
linux# $cmd
linux# eval "$cmd"

所有的都行

最佳答案

让我们从一个简单的命令开始,它可以以任何方式工作,但出于不同的原因。

$ cmd="echo anymessage"
$ eval '$cmd'

eval '$cmd'eval 处理字符串 $cmd。它将它拆分成单词,这又是一个简单的单词 $cmd。它将参数扩展为 echo anymessage 并执行另一轮分词以获得 echoanymessage。现在,echo 是命令,anymessage 是参数,echo 命令被执行。

$ eval "$cmd"

这里,eval处理的是字符串echo anymessage,因为bash$cmd进行了参数扩展执行eval 之前。字符串再次拆分为单词,echo 被识别为命令。

现在,让我们为 cmd 使用一个更复杂的值。

$ cmd="cat /data/test/test.tx* | grep toto"
$ eval '$cmd'

同样,eval 接收文字字符串 $cmd。这是整个命令行,分词后,所以这是一个简单的命令:没有管道,没有重定向等。参数扩展为单个字符串 cat/data/test/test .TX* | grep toto。接下来,分词产生单词cat/data/test/test.tx*|greptoto。发生路径名扩展在图案上;假设它扩展为单个文件名 /data/test/test.txt。您现在有 5 个单词,没有更多的扩展要执行,因此 shell 在命令位置识别单词 cat,并以剩余的 4 个单词作为参数运行它。当 cat 找不到名为 |greptoto 的文件时,会发生错误。

最后,让我们用双引号

$ eval "$cmd"

这一次,eval 接收扩展字符串 cat/data/test/test.tx* | grep toto 作为命令行。分词后看到cat, /data/test/test.tx*, |, grep,和 toto。这个多字命令行包含一个管道字符,因此 eval 将其作为管道处理。与前面的示例相比,eval 的单个参数仅包含一个单词 $cmd。从这里,您应该能够看到管道是如何按预期执行的。


总而言之,如果它是包含要解析和执行的复杂命令行的单个参数,则需要在 eval 的参数上使用双引号。

关于linux - 使用 eval '$cmd' 执行变量将产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18403656/

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