我想执行以下命令:
dune exec -- ocaml-print-intf file.ml
并将其输出重定向到file.mli
问题是我不会写
dune exec -- ocaml-print-intf file.ml > file.mli
因为file.mli
被创建然后dune exec -- ocaml-print-intf file.ml
被执行并且它的输出被重定向到file.mli
. 为什么这是个问题?因为它应该生成的签名,file.ml
但它首先检查的是是否已经有一个签名文件(file.mli
在我们的例子中)以及是否有它输出它。
例子:
❯ dune exec -- ocaml-print-intf src/file.ml
val a : int
val b : string
❯ dune exec -- ocaml-print-intf src/file.ml > src/file.mli
❯ cat src/file.mli
❯ dune exec -- ocaml-print-intf src/file.ml
我找到了海绵的解决方案
❯ dune exec -- ocaml-print-intf src/file.ml | sponge src/file.mli
❯ cat src/file.mli
val a : int
val b : string
但我想知道是否有另一种解决方案不需要安装外部软件。
您注意到它适用于
sponge
:这是因为在收集完所有数据后才
sponge
创建名称。src/file.mli
您可以
sponge
通过简单地重定向到不同名称的文件,然后在收集数据后将其移动到正确的名称来做到这一点:这假定
tmpfile
可以用作中间文件。如果dune
失败,则必须清理中间文件。以下考虑到这一点:用于
mktemp
创建临时文件:使用
ksh93
,您可以:您还可以
sponge
在一行perl
代码中进行模拟:就像
sponge
在输入上找到 eof 后将整个输入存储在内存中,然后将其转储到输出文件中。在
zsh
中,您可以这样做:Where
=(cmd)
扩展为包含cmd
. 当心文件的权限将受到限制。