在一个管道中覆盖 bash 中的文件

Overriding file in bash in one pipe

cat file1 | cat > file1的结果是空文件1。

head file1 | cat > file1的结果也是空文件1。

当然,一个真正的管道应该有更多的步骤——工具和操作在里面。

有什么方法可以保存转换后的阅读内容?

真实情况是source .env && cat file1 | envsubst > file1

唯一的选择是 (head file1 | cat > tmp_file) && mv tmp_file file1。换句话说,您必须写入一个临时文件,然后然后用临时文件替换原始文件。

从根本上说,bash 必须在开始 exec 管道中的每个阶段之前打开所有文件和管道。一旦它打开您的输出文件进行覆盖,它就会被覆盖。

Sponge 会为您做到这一点。你需要单独安装它,它通常不包含在 os.

cat test | sponge | cat > test

将为您留下文件 "test" 中的原始内容。

要在 Ubuntu 或 Redhat 中获取 sponge,您需要安装软件包 moreutils

谢谢,正确答案是:

cat file1 | envsubst | sponge file1

这(来自 Veda)是海绵的错误用法

cat file1 | envsubst | sponge | cat > file1