我有一个配置文件,其中包含一些ENV_VARIABLE样式的变量。
This is my file.
It might contain $EXAMPLES of text.现在,我希望将该变量替换为保存在实际环境变量中的值。所以我试着这样做:
export EXAMPLES=lots
envsubst < file.txt > file.txt但是当输入文件和输出文件相同时,它就不起作用了。结果是一个大小为0的空文件。
这一定有一个很好的理由,一些我不知道的bash基础知识?我如何实现我想要做的事情,最好不用先输出到不同的文件,然后用它替换原始文件?
我知道使用sed可以很容易地做到这一点,但是当我发现envsubst命令时,我认为它应该非常适合我的用例,所以我想使用它。
发布于 2020-05-01 16:10:40
下面是我使用的解决方案:
originalfile="file.txt"
tmpfile=$(mktemp)
cp --attributes-only --preserve $originalfile $tmpfile
cat $originalfile | envsubst > $tmpfile && mv $tmpfile $originalfile使用其他不使用临时文件的解决方案时要小心。管道是异步的,因此文件在被截断后偶尔会被读取。
发布于 2016-01-29 15:20:20
重定向是由shell处理的,而不是正在执行的程序,并且它们是在调用程序之前设置的。
重定向>output.file的效果是,如果output.file不存在,则创建它;如果存在,则清空它。无论哪种方式,您最终都会得到一个空文件,这就是程序的输出被重定向到的位置。
像sed这样能够“就地”修改的程序必须将文件名作为命令行参数,而不是重定向。
在您的情况下,我建议使用一个临时文件,如果一切正常,然后重命名。
发布于 2020-02-17 23:56:08
envsubst < file.txt | tee file.txthttps://stackoverflow.com/questions/35078753
复制相似问题