用输出自动替换原始文件的方法?

use*_*394 0 shell bash

我有一个网站,我正在.scss使用该sass-convert命令格式化 sass ( ) 文件。它的语法是这样的:

$> sass-convert original.scss formatted.scss
Run Code Online (Sandbox Code Playgroud)

由于我在 git repo 中,因此拥有单独的输出文件是完全多余的。我的下一步是mv formatted.scss original.scss。我想做点什么来避免第二步。就像是

$> sass-convert original.scss %^&
Run Code Online (Sandbox Code Playgroud)

哪里%^&有一些神奇的 shell/bash 语法可以做我想要的。

有没有办法使用bash(或其他shell)语法在一行中用输入文件自动替换输出文件?

我的问题与此问题不同,因为iconv将首先创建输出文件,这将使输入文件为空,因此下面列出的任何解决方案都不起作用。如果你看这两个问题的答案,你会发现它们是不同的。此问题的答案适用于任何不会立即创建输出文件的命令。

thr*_*rig 5

Unix 程序可能有一个-i inplace开关(例如旧版本的seddo not,但现在大多数都从 中窃取了该标志perl),请查看man页面以获取详细信息。这通常会导致程序将输出写入临时文件,然后执行rename(2)调用以将新输出写入原始名称(此重命名可能还会破坏进程中的 selinux 上下文或其他花哨的 ACL,这可能是一个问题如果你使用那些东西)。

write-to-tmp-file-and-rename(2)模式的另一个解决方案sponge来自moreutils

$ echo hi > file
$ tr h b < file | sponge file
$ cat file
bi
$ 
Run Code Online (Sandbox Code Playgroud)