gpt4 book ai didi

bash - 为什么eval “$BASH_COMMAND”使bash崩溃?

转载 作者:行者123 更新时间:2023-12-03 15:52:56 25 4
gpt4 key购买 nike

如果在终端中运行eval "$BASH_COMMAND",它将崩溃,终端窗口将消失。我无法理解为什么此特定命令使bash崩溃。

奇怪的是,当我运行echo "$BASH_COMMAND"时,会发生这种情况:

$ echo "$BASH_COMMAND"
echo "$BASH_COMMAND"

另一件事是 $BASH_COMMAND没有值:
"$BASH_COMMAND"
bash: "$BASH_COMMAND": command not found

最佳答案

$BASH_COMMAND确实具有一个值:当前正在执行的命令。这在trap处理程序等情况下很有用,因此该处理程序可以找出陷阱触发时正在执行的命令。但是,当您将$BASH_COMMAND用作常规命令的一部分时,事情就会变得怪异,混乱和混乱。让我们看看您给出的示例:

  • echo "$BASH_COMMAND"
    在此示例中,BASH_COMMAND变量的值正好是字符串echo "$BASH_COMMAND",因此,当shell解析命令行时,它将扩展变量引用,并提供等效项:
    echo 'echo "$BASH_COMMAND"'

    注意:单引号实际上不是命令的一部分,它们只是我添加的内容,指示命令的那部分不应进行变量扩展,双引号删除等。在实际命令中,无法完成,因为它们已经完成。无论如何,结果是按原样打印了字符串,并给出了您看到的结果。
  • "$BASH_COMMAND"
    同样,BASH_COMMAND的值正是字符串"$BASH_COMMAND",因此在扩展后,它等于:
    '"$BASH_COMMAND"'

    ...而且没有该名称的命令,因此您会收到一个错误消息。

    (实际上,unix文件名中允许使用引号和美元符号,因此您可以命名一个脚本,然后将其放在PATH中,然后将其作为有效的命令名称。我不特别建议这样做。)
  • eval "$BASH_COMMAND"
    这更复杂。 BASH_COMMAND的值是字符串eval "$BASH_COMMAND",因此在扩展后,它等于:
    eval 'eval "$BASH_COMMAND"'

    但是eval命令的作用是接受其参数并将其作为shell命令运行,包括所有常规解析。因此,它运行命令:
    eval "$BASH_COMMAND"

    ...将再次扩展$BASH_COMMAND,结果是:
    eval 'eval "$BASH_COMMAND"'

    ...使eval命令解析并运行:
    eval "$BASH_COMMAND"

    ...并且这个循环永远持续下去。或者更确切地说,当它试图跟踪这个不断扩展的事物时,它最终会耗尽一些资源(可能是堆栈空间)。显然,这会导致处理不当的崩溃。

    但是无论细节如何,该命令都可能无法工作。它要求 shell 执行一系列无限的任务,并且无法成功结束。
  • 关于bash - 为什么eval “$BASH_COMMAND”使bash崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55134746/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com