【问题标题】:Why does rewriting a file with "envsubst <file >file" leave it empty? [duplicate]为什么用“envsubst <file >file”重写文件会使其为空? [复制]
【发布时间】:2018-04-15 08:14:54
【问题描述】:

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

cat file
# $VAR

echo $VAR
# text

当我这样做时,envsubst '$VAR $VAR' &lt; file &gt; file 文件变为空。为了解决这个问题,我使用envsubst '$VAR $VAR' &lt; file | tee file 2&gt;&amp;1 &gt;/dev/null。但有时它不起作用,我的意思是文件变空了。第一个问题是为什么有时文件会变空,第二个问题是在 Linux 和 *BSD 和 MacOS 中将环境变量放入文件的真正 Unix 方式是什么?

【问题讨论】:

  • 使用:envsubst &lt; file &gt; file.tmp &amp;&amp; mv file.tmp file
  • cmd file &gt; file*nix (unix&Linux) 中是 99.9999% 的错误方法。习惯于使用@anubhava 的模式来进行您需要在*nix 中进行的任何简单文件更改。祝你好运。
  • 另一个注意事项:bash 不考虑单引号。
  • 不是远程特定于envsubst。当您通过重定向读取和写入同一个文件时,literally any 命令可能会出现此问题。
  • 感谢大家的帮助。

标签: bash unix environment-variables


【解决方案1】:

shell总是在启动命令之前处理输出重定向,这会截断文件。

使用管道envsubst ... &lt; file | tee fileenvsubsttee 两个命令异步运行,这意味着操作系统可以先启动一个或另一个命令。在tee 运行并截断文件之前,您基本上是在扔envsubst 运行并读取file 的骰子。

唯一正确的解决办法是写入一个临时文件,然后在确认命令成功后用临时文件替换原文件。

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2022-01-09
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2021-09-28
    相关资源
    最近更新 更多