![为什么一个变量不能存储多个命令?](https://linux22.com/image/210611/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%80%E4%B8%AA%E5%8F%98%E9%87%8F%E4%B8%8D%E8%83%BD%E5%AD%98%E5%82%A8%E5%A4%9A%E4%B8%AA%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我在 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"
请避免使用大写变量,这些变量通常用作环境变量。让我们尝试遵守该准则。