【发布时间】:2019-05-22 04:26:27
【问题描述】:
有人可以帮忙吗:
我想在 shell 脚本中执行一些命令,方法是从另一个文本文件中读取它们,如下所示:
command_file.txt 包含:
EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)
shell script.sh
#!/bin/sh
while read command
do
echo $command
done < command_file.txt
我的问题是,echo 打印为命令文件中的文本。 如何使其扩展并打印实际日期和主机名。
例如 预期输出应该是:
EXECUTED_OK_22-02-2010 11:10:10
EXECUTED_OK_localhost
但我得到了:
EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)
【问题讨论】:
-
考虑
envsubst是否可用。 -
您看到的行为是期望的并且符合规范。如果数据被扩展为“背后”的代码,那么在 bash 中编写处理不受信任数据的代码基本上是不可能的。
-
(再一次,您基本上是在请求您的数据作为代码执行,这正是
eval的用途。这也是一个普遍的坏主意,最好避免,但是...嗯,它是你要求的)。 -
@Charles Duffy 如果我们考虑必须在运行时创建动态命令的情况,这可能比运行单个命令并连接最终输出更简单。
-
...但是如果你想要
eval的效果,你为什么不实际使用eval?这是不好的做法,但那是因为它完成的事情(突破数据和代码之间的界限)是不好的做法。你正在积极地要求那个东西(将你的数据评估为代码,相信它的内容可以安全执行),所以,如果你真的,真的确定,不妨使用它这就是你想要的。
标签: linux bash shell scripting