Bash 脚本在控制台中显示更改但在文件中不显示 |我如何保存更改?

Bash script shows changes in console but not in file | How do i save changes?

Bash 脚本编写新手。

我有一个文本文件 bar.txt,文本为:

123
456
789

我正在尝试将其反转为:

987
654
321

我已经成功地做到了:

tac bar.txt | rev

但是,更改不会保存到 .txt 文件,该文件仍然有 1234...

如何保存更改,以便更新 .txt 文件? 抱歉问题措辞不当或格式不正确 - Bash 脚本和 Whosebug 都是新手...

使用 shell 实用程序作为对文本进行操作的过滤器的 Unix 哲学是真实的,tacrev 都将它们的输出通过管道传输到标准输出,这就是 rev 能够对 tac.

的输出进行操作

要“更新文件”,您可以将结果输出从 rev 重定向到另一个文件,如下所示。

tac bar.txt | rev > foo.txt

您不想将输出重定向到同一文件的原因是因为 Unix 管道在输入准备就绪时对其进行操作,因此 foo.txt 在输出时可能尚未完全读取来自 rev 已准备好写入文件。

你可以 append 输出,当然,像这样:

tac bar.txt | rev >> foo.txt

这会追加 输出,但实际上不会“更新”文件。

如果你真的想“更新文件”,你可以编写一个脚本来处理你的输入,将其通过管道传输到一个临时文件,然后使用类似 mv -f命令。

我一直在引号中使用短语“更新文件”的原因是,通常发生的是用文件的更新内容创建临时文件或内存缓冲区然后替换原始文件的过程当您“更新文件”时。如果您曾见过 vim 创建的带有 ~ 符号的临时文件,那就是您在原始文件被替换之前正在编辑的临时缓冲区,或者正如大多数人所说的那样,“获取已更新。"

也许

tac bar.txt | rev > bar_rev.txt

要使其显示为文件 bar 已更改,请先将输出写入临时文件 - foo 下面 - 然后 mv 将其写入 bar .

$ tac bar | rev > foo && mv foo bar
$ cat bar
987
654
321