我有一个网站,我正在其中.scss
使用命令格式化 sass ( ) 文件sass-convert
。它的语法是这样的:
$> sass-convert original.scss formatted.scss
由于我在 git 存储库中,因此拥有单独的输出文件是完全多余的。我的下一步是mv formatted.scss original.scss
。我想做一些事情来避免第二步。就像是
$> sass-convert original.scss %^&
哪里%^&
有一些神奇的 shell/bash 语法可以完成我想要的功能。
有没有办法可以使用 bash (或其他 shell)语法在一行中自动将输出文件替换为输入文件?
我的问题不同于这个问题因为iconv
将首先创建输出文件,这将使输入文件变空,所以下面列出的解决方案都不起作用。如果你看看这两个问题的答案,你会发现它们是不同的。此问题的答案适用于任何不会立即创建输出文件的命令。
答案1
Unix 程序可能有一个-i inplace
开关(例如,旧版本sed
没有,但现在大多数都从 窃取了该标志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
$
答案2
使用 Bash历史运算符:
sass-convert original.scss !#:$
!#
指定当前行,:$
最后一个参数(到目前为止)。
这适用于sass-convert
;但对于更一般的用途,值得注意的是,在完成处理输入之前截断输出的程序将无法使用这种方法。
答案3
在tcsh
或模式zsh
下emacs
(通常是默认模式),您可以键入:
sass-转换原始.scssCtrl+Alt+_
Ctrl+Alt+_复制前一个单词(copy-prev-word
小部件)。
请注意,它复制了之前的空白分隔单词,它不理解引用或类似的内容(与!#:$
csh 风格的历史扩展相反)。
另一种方法(也适用于bash
其他基于 readline 的 shell)仍在emacs
模式中:
sass-转换原始.scssCtrl+WCtrl+Y Ctrl+Y
使用 zsh,您还可以执行以下操作:
(){sass-convert $1 $1} original.scss
对于 (t)csh/ksh/zsh/bash,使用大括号扩展:
sass-convert original.scss{,}