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

时间:2019-02-26 12:59:42

标签: bash pipe cat

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

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

当然,真正的管道旨在具有更多的步骤-内部的工具和操作。

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

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

3 个答案:

答案 0 :(得分:0)

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

从根本上讲,bash必须先打开所有文件和管道,然后才开始exec进入管道中的每个阶段。打开您的输出文件以进行覆盖后,它就会被覆盖。

答案 1 :(得分:0)

谢谢,但正确答案是:

cat file1 | envsubst | sponge file1

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

cat file1 | envsubst | sponge | cat > file1

答案 2 :(得分:-1)

海绵帮您做到这一点。不过,您需要单独安装它,它通常不包含在操作系统中。

cat test | sponge | cat > test

将保留原始文件“ test”中的内容。

要在Ubuntu或Redhat中使用海绵,您需要安装软件包moreutils