首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >envsubst可以不做就地替换吗?

envsubst可以不做就地替换吗?
EN

Stack Overflow用户
提问于 2016-01-29 15:09:44
回答 8查看 20.6K关注 0票数 21

我有一个配置文件,其中包含一些ENV_VARIABLE样式的变量。

代码语言:javascript
复制
This is my file.
It might contain $EXAMPLES of text.

现在,我希望将该变量替换为保存在实际环境变量中的值。所以我试着这样做:

代码语言:javascript
复制
export EXAMPLES=lots
envsubst < file.txt > file.txt

但是当输入文件和输出文件相同时,它就不起作用了。结果是一个大小为0的空文件。

这一定有一个很好的理由,一些我不知道的bash基础知识?我如何实现我想要做的事情,最好不用先输出到不同的文件,然后用它替换原始文件?

我知道使用sed可以很容易地做到这一点,但是当我发现envsubst命令时,我认为它应该非常适合我的用例,所以我想使用它。

EN

回答 8

Stack Overflow用户

发布于 2020-05-01 16:10:40

下面是我使用的解决方案:

代码语言:javascript
复制
originalfile="file.txt"
tmpfile=$(mktemp)
cp --attributes-only --preserve $originalfile $tmpfile
cat $originalfile | envsubst > $tmpfile && mv $tmpfile $originalfile

使用其他不使用临时文件的解决方案时要小心。管道是异步的,因此文件在被截断后偶尔会被读取。

票数 16
EN

Stack Overflow用户

发布于 2016-01-29 15:20:20

重定向是由shell处理的,而不是正在执行的程序,并且它们是在调用程序之前设置的。

重定向>output.file的效果是,如果output.file不存在,则创建它;如果存在,则清空它。无论哪种方式,您最终都会得到一个空文件,这就是程序的输出被重定向到的位置。

sed这样能够“就地”修改的程序必须将文件名作为命令行参数,而不是重定向。

在您的情况下,我建议使用一个临时文件,如果一切正常,然后重命名。

票数 13
EN

Stack Overflow用户

发布于 2020-02-17 23:56:08

代码语言:javascript
复制
envsubst < file.txt | tee file.txt
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35078753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档