Bash从文件读取内容时如何让命令替换正常生效?
问题原因
Bash的命令替换、变量扩展等语法仅在Bash解析执行自身代码的阶段生效。你直接写在脚本里的字符串属于代码的一部分,会被Bash完成语法解析后再赋值给变量;但从文件读取的内容默认被识别为纯文本字符串,Bash不会主动解析其中的反引号、$()等命令替换语法,这是出于安全设计的默认行为,避免读取不可信文件时被注入执行恶意命令。
实现命令替换的方法
方法1:使用eval解析字符串(注意安全风险)
eval会强制让Bash重新解析传入的内容,识别其中的所有Bash语法,包括命令替换。
修改你的读取代码如下:
while read -e line do eval "echo \"$line\"" done < file
注意:这个方法存在极高的安全风险,如果文件内容来自不可信来源,其中包含的任意恶意命令都会被直接执行,仅限你完全可控文件内容的场景使用。
方法2:使用envsubst做有限替换(更安全)
如果你不需要执行任意命令,只是要替换预设的动态内容,可以先把命令结果赋值给变量,再用envsubst做占位符替换,不会执行文件中的未知命令,更推荐日常使用:
- 首先修改文件内容为占位符形式:
${CUR_DATE}*.*INFO Ended execution of script
- 脚本修改为如下内容即可:
export CUR_DATE=$(date '+%a %b %d') while read -e line do echo "$line" | envsubst done < file
内容的提问来源于stack exchange,提问作者Nishant Shrivastava
相关产品推荐
相关产品推荐

