임시 파일을 셸에서 사용하기 전에 정리할 수 있나요?

임시 파일을 셸에서 사용하기 전에 정리할 수 있나요?

내 프로그램이 충돌할 경우 임시 파일이 남아 있는 것을 방지하고 싶습니다.

UNIX는 파일을 삭제한 후에도 파일을 열어둘 수 있다는 점에서 훌륭합니다.

따라서 파일을 열면 즉시 삭제하고,그 다음에처리 속도가 느리면 프로그램이 충돌하더라도 사용자가 파일을 정리할 필요가 없을 가능성이 높습니다.

쉘에서는 다음과 유사한 내용을 자주 볼 수 있습니다.

generate-the-file -o the-file
[...loads of other stuff that may use stdout or not...]
do_slow_processing < the-file
rm the-file

그러나 프로그램이 충돌하기 전에 rm사용자가 정리해야 합니다 the-file.

Perl에서는 다음을 수행할 수 있습니다.

open(my $filehandle, "<", "the-file") || die;
unlink("the-file");
while(<$filehandle>) {
  # Do slow processing stuff here
  print;
}
close $filehandle;

그러면 파일이 열리자마자 제거됩니다.

쉘에도 비슷한 구조가 있나요?

답변1

이는 csh, tcsh, sh, ksh, zsh, bash, ash, sash에서 테스트되었습니다.

echo foo > the-file
(rm the-file; cat) < the-file | do_slow_processing
do_other_stuff

또는 원하는 경우:

(rm the-file; do_slow_processing) < the-file
do_other_stuff

흥미롭게도 fifo에서도 작동합니다.

mkfifo the-fifo
(rm the-fifo; cat) < the-fifo | do_slow_processing &
echo foo > the-fifo

무언가가 쓰여질 때까지 독자가 차단되기 때문입니다.

답변2

generate-the-file > the-file
exec 5< the-file
rm the-file
...
do_slow_processing 0<&5

노트:

  • 실행 파일 없이 exec를 실행해야 하므로 쉘 자체의 설명자에 영향을 줍니다.
  • fd 9까지만 사용 가능
  • 파일 이름이 필요한 경우 /proc/self/fd/X를 사용할 수 있습니다. 이 인터페이스는 UNIX 버전 간에 이식 가능하지 않습니다(그러나 아마도 귀하에게 적합할 것입니다).
  • fd를 다시 읽으려고 하면(예: 에 대한 두 번의 호출 cat 0<&5) EOF에 있으므로 실패합니다. 되감기하거나 다음을 통해 읽어서 극복해야 합니다./proc/self/fd/X
  • 대부분의 경우 실제 파일 없이도 할 수 있지만 간단한 작업을 수행할 수 있습니다.generate-the-file | do_slow_processing

업데이트:

OP는 generate-the-filestdout에서 출력을 생성하지 못할 수 있다고 언급합니다. 이에 대한 몇 가지 관용어가 있습니다:

  • 의 출력 파일을 지정합니다 -. 표준 출력을 의미하는 출력 파일 이름을 -로 받아들이는 것이 일반적입니다. 이것은POSIX.1-2017에서 인정됨:

    지침 13: 피연산자를 사용하여 읽기 또는 쓰기용으로 열 파일을 나타내는 유틸리티의 경우 '-' 피연산자는 표준 입력(또는 출력 파일이 지정된다는 것이 문맥상 분명할 경우 표준 출력) 또는 -라는 파일명.

(명시적으로 정의한 유틸리티 이외의 유틸리티의 경우 구현에 따라 정의되지만 도구에서 지원될 가능성이 높습니다 generate-the-file)

이는 모든 쉘에서 작동하지 않으며 fd 파일 이름에 대한 OS 지원이 필요합니다.

답변3

셸 에서 bash정리를 처리하는 방법은 EXIT trap내장을 사용하는 것입니다(셸 내에서 bash입력 help trap).

trap 'rm temp-file' EXIT

이 기능은 셸에도 존재하며 최신 Linux 배포판에서 dash흔히 별칭으로 사용됩니다 .sh

관련 정보