다음 명령을 실행하고 싶습니다.
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
그런데 외부 소프트웨어를 설치할 필요가 없는 또 다른 솔루션이 있는지 궁금합니다.
답변1
를 사용하면 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
입력에서 eof가 발견되면 sponge
전체 입력이 메모리에 저장된 다음 출력 파일로 덤프됩니다.
에서는 zsh
다음을 수행할 수 있습니다.
mv =(dune exec -- ocaml-print-intf src/file.ml) src/file.mli
출력을 =(cmd)
포함하도록 확장되는 임시 파일의 경로입니다 cmd
. 파일 권한이 제한된다는 점에 유의하세요.
답변2
다음과 함께 작동한다는 것을 알 수 있습니다 sponge
.
dune exec -- ocaml-print-intf src/file.ml | sponge src/file.mli
이름은 모든 데이터가 수집된 후에 생성되기 때문입니다 sponge
.src/file.mli
sponge
다른 이름의 파일로 리디렉션한 다음 데이터를 수집한 후 올바른 이름으로 이동하면 됩니다.
dune exec -- ocaml-print-intf src/file.ml >tmpfile &&
mv tmpfile src/file.mli
tmpfile
이는 중간 파일로 사용될 수 있다고 가정합니다 . 만약에dune
실패하다그런 다음 중간 파일을 정리해야 합니다. 이를 염두에 두고 다음을 수행합니다.
if dune exec -- ocaml-print-intf src/file.ml >tmpfile
then
mv tmpfile src/file.mli
else
rm tmpfile
fi
다음을 사용하여 임시 파일을 만듭니다 mktemp
.
tmpfile=$(mktemp)
if dune exec -- ocaml-print-intf src/file.ml >"$tmpfile"
then
mv "$tmpfile" src/file.mli
else
rm "$tmpfile"
fi