在一个管道中覆盖 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
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