在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
的情况下执行此操作?
答案 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评估(或执行)引号内的表达式。否则,它被视为一个文字字符串,可能只对用户有意义。
如果您在问题中提供更多详细信息,我或许可以帮助您采用其他方法。