bash - 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"
当我从文件中读取内容时,如何让命令替换工作?
解决方案
需要明确的是,这是一个非常糟糕的主意,而且你不应该真正做。但是,它看起来像:
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
更快地格式化。
推荐阅读
- mongodb - Mongoose 如何在非集合字段上生成 ObjectId?
- shopify - Shopify如何让一个产品修改购物车中的信息?
- java - Camunda BPM 引擎中的 Thrift 调用
- javascript - 使用 D3 查找 svg 元素的标签名称
- python - 带有字符串的奇怪的有效python语法
- regex - 正则表达式:匹配第三个空格
- angularjs - 如何在上传之前预览 .ai 、 .pdf 格式的图像并在 angularjs 中转换为 base64?
- regex - 如果该行不包含另一个字符串,则使用 sed 将文本插入该行
- ruby-on-rails - 设计:可锁定 - last_attempt_warning 不显示
- vba - 如何遍历指定列中的相同单元格