Io-Redirection

是否可以在創建要重定向其輸出的文件之前執行命令

  • June 29, 2022

我想執行以下命令:

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. 當心文件的權限將受到限制。

引用自:https://unix.stackexchange.com/questions/708023