您可以使用该eval
命令做什么?为什么它有用?它是 bash 中的某种内置函数吗?没有man
它的页面..
答案1
eval
是 POSIX 的一部分。它是一个可以内置于 shell 的接口。
《POSIX 程序员手册》中对此进行了描述:http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
它将接受一个参数并构造一个命令,然后由 shell 执行。这是联机帮助页中的示例:
foo=10 x=foo # 1
y='$'$x # 2
echo $y # 3
$foo
eval y='$'$x # 5
echo $y # 6
10
- 在第一行中,您
$foo
使用 value'10'
和$x
value进行定义'foo'
。 - 现在定义
$y
,它由字符串 组成'$foo'
。美元符号必须用 转义'$'
。 - 要检查结果,
echo $y
. - 1)-3) 的结果将是字符串
'$foo'
- 现在我们用 重复分配
eval
。它将首先评估$x
字符串'foo'
。现在我们有了y=$foo
将被评估为 的语句y=10
。 - 的结果
echo $y
现在是值'10'
。
这是许多语言中的常见函数,例如 Perl 和 JavaScript。查看 perldoc eval 了解更多示例:http://perldoc.perl.org/functions/eval.html
答案2
是的,eval
是 bash 内部命令,因此在bash
手册页中进行了描述。
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
通常它与命令替换。如果没有显式的eval
,shell 会尝试执行命令替换的结果,而不是评价它。
假设您想要编写与VAR=value; echo $VAR
.请注意 shell 处理 的写入方式的差异echo VAR=value
:
1.
andcoz@...:~> $( echo VAR=value )
bash: VAR=value: command not found
andcoz@...:~> echo $VAR
<empty line>
子 shell 执行该echo
命令,然后 command 将结果替换VAR=value
回外壳,并在外壳中抛出错误,因为“VAR=value”不是命令。该作业仍然无效,因为它从未被执行,仅echo
被编辑。
2.
andcoz@...:~> eval $( echo VAR=value )
andcoz@...:~> echo $VAR
value
子shell echo
es“VAR=value”再次被命令替换回外壳,然后在外壳中eval
进行编辑。
最后但并非最不重要的一点是,eval
这可能是一个非常危险的命令。eval
必须仔细检查命令的任何输入以避免安全问题。
答案3
eval 语句告诉 shell 将 eval 的参数作为命令并通过命令行运行它们。它在如下情况下很有用:
在脚本中,如果您将命令定义到变量中,并且稍后想要使用该命令,那么您应该使用 eval:
/home/user1 > a="ls | more"
/home/user1 > $a
bash: command not found: ls | more
/home/user1 > # Above command didn't work as ls tried to list file with name pipe (|) and more. But these files are not there
/home/user1 > eval $a
file.txt
mailids
remote_cmd.sh
sample.txt
tmp
/home/user1 >
答案4
eval
没有手册页,因为它不是一个单独的外部命令,而是一个内置的 shell,这意味着命令是 shell 内部且仅由 shell ( bash
) 知道的命令。手册页的相关部分bash
说:
eval [arg ...]
The args are read and concatenated together into a single command.
This command is then read and executed by the shell, and its exit
status is returned as the value of eval. If there are no args, or only
null arguments, eval returns 0
另外,输出ifhelp eval
为:
eval: eval [arg ...]
Execute arguments as a shell command.
Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.
Exit Status:
Returns exit status of command or success if command is null.
eval
是一个强大的命令,如果您打算使用它,您应该非常小心,避免可能发生的情况安全风险随之而来的。