为什么用"envsubst <file> file"重写文件会将其留空?

Kon*_*kov 5 unix bash environment-variables

我需要将一些环境变量值放到文件中.

cat file
# $VAR

echo $VAR
# text
Run Code Online (Sandbox Code Playgroud)

当我做envsubst '$VAR $VAR' < file > file文件变空.要解决此问题,我使用envsubst '$VAR $VAR' < file | tee file 2>&1 >/dev/null.但有时它不起作用,我的意思是文件变空.第一个问题是为什么有时文件变空了,第二个问题是什么是在Linux和*BSD和MacOS中将env变量文件放入文件的真正的Unix方法?

che*_*ner 14

在启动命令之前,shell 始终处理输出重定向,从而截断文件.

与管道envsubst ... < file | tee file,两个命令envsubsttee运行异步的,这意味着所述OS是免费启动一个或另一个命令第一.你基本上envsubstfiletee运行之前扔掉运行和读取的骰子并截断文件.

唯一正确的解决方案是写入临时文件,然后确认命令成功后将原始文件替换为临时文件.