Bash eval和backticks之间的差异(反撇号)

Bash eval和backticks之间的差异(反撇号),bash,eval,Bash,Eval,谁能告诉我这里的最大区别是什么,为什么后者不起作用 test="ls -l" 现在两者都可以正常工作: eval $test echo `$test` 但在这种情况下: test="ls -l >> test.log" eval $test echo `$test` 后者行不通。为什么呢?我知道eval只是在执行一个脚本,而撇号则在执行它,并将结果作为字符串返回。是什么使得在命令中不能使用>或类似的东西来执行?也许有没有办法让撇号起作用,而我做错了什么?eval是“表达式值”

谁能告诉我这里的最大区别是什么,为什么后者不起作用

test="ls -l"
现在两者都可以正常工作:

eval $test
echo `$test`
但在这种情况下:

test="ls -l >> test.log"

eval $test
echo `$test`

后者行不通。为什么呢?我知道eval只是在执行一个脚本,而撇号则在执行它,并将结果作为字符串返回。是什么使得在命令中不能使用
>
或类似的东西来执行?也许有没有办法让撇号起作用,而我做错了什么?

eval是“表达式值”,即

test="ls -l >> test.log"
eval $test
在终端中的执行方式与

ls -l >> test.log
是否


echo仅用于显示。

当您使用反勾号执行命令时,发送到shell的命令是:

ls -l '>>' test.log
这使得
>
test.log
参数都指向
ls
(请注意
>
周围的引号)

使用
eval
时,正在执行的命令是:

ls -l >> test.log

(通过说
bash-vx scriptname
来执行脚本,看看发生了什么。)

它们被称为
backticks
@dogbane,哦,这也是问题的一部分:谢谢,我不知道它们是如何被称为的。回答你的最后一个问题:是的,你做错了什么。如果您使用eval或将代码放在字符串中执行,那么99.9%的情况下您都是在做错事。您的脚本将更难推理,更难调试,并且存在安全问题:我知道这是什么,我在问为什么同一个命令不能与backticks一起工作。我有点从错误信息中得到它,但为什么会发生这种情况?有没有办法用反勾号来阻止它?@KeluThatsall在第一种情况下,包括重定向
>
在内的所有内容都是字符串的一部分,都是逐字解释的。这是否意味着反勾号实际上是在拆分他们正在解释的字符串,并使用空格将第一个元素作为命令,将后面的元素作为参数?你就是不能做任何事?是的,你不能做任何事。使用
eval
或类似的方法:
test=“ls-l”$(test)>>“test.log”
。如果字符串是这样分割的,那么为什么在执行'ls-l>>test.log`-这些反勾号可以工作并生成一个文件时它就不工作了!为什么“$something”不是“contentOfSomething”?