为什么一个变量不能存储多个命令?

为什么一个变量不能存储多个命令?

我在 bash 中尝试不同的事情,发现这种行为我无法理解。

CODE="pwd";$CODE

这段代码运行良好。

CODE="pwd;pwd";$CODE

但这是行不通的。 (显然;正在破坏它,与 && 相同)
有什么想法吗?

答案1

Shell$CODE作为一个命令执行。如果您创建一个在您的路径中命名的命令pwd;pwd,它将运行。要运行它$CODE,请将其明确地输入到 shell,如下所示:

CODE="pwd;pwd";sh -c "$CODE"

答案2

变量的扩展发生得比解析命令行晚很多。此时变量内的值CODE将扩展,但不会被 shell 重新解析。此外,如果内部值CODE不包含 IFS 内的任何字符,则该值不会被分割,并且 shell 将尝试将变量的全部内容作为一个命令执行。当然,在您的情况下,PATH 中没有调用任何可执行文件env;env,shell 所能做的就是报告错误,它找不到这样的文件。

但是,这会起作用(在 bash 中):

CODE="pwd;pwd"; sh -s <<<"$CODE"

请避免使用大写变量,这些变量通常用作环境变量。让我们尝试遵守该准则。

相关内容