Eu quero executar o seguinte comando:
dune exec -- ocaml-print-intf file.ml
E redirecionar sua saída parafile.mli
O problema é que eu não consigo escrever
dune exec -- ocaml-print-intf file.ml > file.mli
Porque file.mli
é criado, então dune exec -- ocaml-print-intf file.ml
é executado e sua saída é redirecionada para file.mli
. Por que isso é um problema? Porque deveria gerar a assinatura de, file.ml
mas a primeira coisa que verifica é se já existe um arquivo de assinatura ( file.mli
no nosso caso) e se existe, ele o gera.
Exemplo:
❯ 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
Eu encontrei uma solução com esponja
❯ dune exec -- ocaml-print-intf src/file.ml | sponge src/file.mli
❯ cat src/file.mli
val a : int
val b : string
Mas eu queria saber se havia outra solução que não necessitasse instalar um software externo.
Você notou que funciona com
sponge
:Isso se deve ao fato de
sponge
não criar osrc/file.mli
nome até que todos os dados tenham sido coletados.Você pode fazer isso sem
sponge
simplesmente redirecionar para um arquivo com nome diferente e, em seguida, movendo-o para o nome correto quando os dados forem coletados:Isso pressupõe que
tmpfile
pode ser usado como um arquivo intermediário. Sedune
falhar , o arquivo intermediário deve ser limpo. O seguinte leva isso em consideração:Usando
mktemp
para criar o arquivo temporário:Com
ksh93
, você pode fazer:Você também pode emular
sponge
em uma linha deperl
código:Que como
sponge
armazena toda a entrada na memória antes de despejá-la no arquivo de saída, uma vez que eof é encontrado na entrada.Em
zsh
, você poderia fazer:Where
=(cmd)
expande para o caminho de um arquivo temporário que contém a saída decmd
. Cuidado, as permissões no arquivo serão restritas.