bash 中的“eval”命令是什么?

bash 中的“eval”命令是什么?

您可以使用该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
  1. 在第一行中,您$foo使用 value'10'$xvalue进行定义'foo'
  2. 现在定义$y,它由字符串 组成'$foo'。美元符号必须用 转义'$'
  3. 要检查结果,echo $y.
  4. 1)-3) 的结果将是字符串'$foo'
  5. 现在我们用 重复分配eval。它将首先评估$x字符串'foo'。现在我们有了y=$foo将被评估为 的语句y=10
  6. 的结果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 echoes“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是一个强大的命令,如果您打算使用它,您应该非常小心,避免可能发生的情况安全风险随之而来的。

相关内容