我为什么要评估>在bash?

时间:2014-08-16 08:15:55

标签: bash

在bash中,为什么我必须eval一个值为重定向的变量:

bash> foo=echo
bash> $foo true
true
bash> foo='>/dev/null'
bash> $foo true
bash: >/dev/null: No such file or directory
bash> eval $foo true
bash>

如何在没有eval的情况下执行此操作?

2 个答案:

答案 0 :(得分:3)

在使用变量进行单词拆分后,不会解析重定向。只识别路径名扩展和类似内容。

以您的示例为例,>/dev/null就像在运行时一样对待:

">/dev/null" "false"

在这种情况下,>没有特殊含义。

这就是为什么需要eval将结果参数重新评估为新命令的原因。无论您使用echo看到什么,都可以通过eval获得。

# foo='>/dev/null'
# echo $foo true
>/dev/null true

因此,有时您还需要引用以防止在评估之前进行单词拆分和其他扩展:

echo "$foo true"

答案 1 :(得分:0)

eval表示评估,告诉shell评估(或执行)引号内的表达式。否则,它被视为一个文字字符串,可能只对用户有意义。

如果您在问题中提供更多详细信息,我或许可以帮助您采用其他方法。