首页 > 解决方案 > Bash:从文件读取时的命令替换

问题描述

不确定我是否在这里愚蠢,但我无法弄清楚这一点。

如果我把它放在 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"

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

标签: bashcommand-substitution

解决方案


需要明确的是,这是一个非常糟糕的主意,而且你不应该真正做。但是,它看起来像:

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更快地格式化。

推荐阅读