Bash: 从文件读取时命令替换

Bash: command substitution when reading from a file

不确定我在这里是不是很笨,但我想不通。

如果我把它放在 bash 脚本中:

var="`date '+%a %b %d'`*.*INFO Ended execution of script"
echo $var

我得到的输出是:

Mon Sep 27*.*INFO Ended execution of script

但是,如果我将相同的内容放入文件中:

"`date '+%a %b %d'`*.*INFO Ended execution of script"

然后写一个小bash脚本来读取这个文件的内容

while read -e line
do
        echo "$line"
done < file

当我执行这个脚本时,我得到

"`date '+%a %b %d'`*.*INFO Ended execution of script"

当我从文件中读取内容时,如何让命令替换生效?

需要说明的是,这是一个非常的坏主意,而且您实际上不应该这样做。但是,它看起来像:

while IFS= read -r line; do
  eval "echo $line"           ## DANGEROUS: Do not do this!
done

就为什么这是个坏主意而言:

  • 天生缺乏安全感。 BashFAQ #48 对此进行了详细介绍,但简而言之,如果您的数据可以 运行 date 命令,它也可以 运行 任何其他命令 还有。
  • 速度很慢。 $(date) 每次 运行 时都会启动 /usr/bin/date 的新副本。使用 printf -v date '%(%a %b %d)T' -1 以您想要的格式存储日期 $date 的速度要快得多。