Io-Redirection
是否可以在創建要重定向其輸出的文件之前執行命令
我想執行以下命令:
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
但我想知道是否有另一種解決方案不需要安裝外部軟體。
使用
ksh93
,您可以:dune exec -- ocaml-print-intf src/file.ml >; src/file.mli
>;word
將輸出寫入臨時文件。如果命令成功完成,將其重命名為 word,否則,刪除臨時文件。
>;word
不能與內置的 exec 一起使用。您還可以
sponge
在一行perl
程式碼中進行模擬:dune exec -- ocaml-print-intf src/file.ml | perl -0777 -spe 'open STDOUT, ">", $out or die "$out: $!\n"' -- -out=src/file.mli
就像
sponge
在輸入上找到 eof 後將整個輸入儲存在記憶體中,然後將其轉儲到輸出文件中。在
zsh
中,您可以這樣做:mv =(dune exec -- ocaml-print-intf src/file.ml) src/file.mli
Where
=(cmd)
擴展為包含cmd
. 當心文件的權限將受到限制。