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

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

내 프로그램이 충돌할 경우 임시 파일을 피하고 싶습니다.

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를 실행해야 하므로 쉘 자체의 설명자에 영향을 줍니다.
  • 최대 9개의 fd만 ​​제공됩니다.
  • 파일 이름이 필요한 경우 /proc/self/fd/X를 사용할 수 있습니다. 이 인터페이스는 UNIX 버전 간에 이식 가능하지 않습니다(귀하에게 적합할 수도 있음).
  • fd를 다시 읽으려는 시도(두 번 호출하는 것과 같은 cat 0<&5)는 EOF에 있기 때문에 실패합니다. 되감기하거나 읽어서 극복해야 합니다./proc/self/fd/X
  • 위의 대부분의 경우 실제 파일 없이도 수행할 수 있지만 간단한 작업도 수행할 수 있습니다.generate-the-file | do_slow_processing

고쳐 쓰다:

OP에서는 generate-the-file출력이 표준 출력으로 생성되지 않을 수 있다고 언급했습니다. 이에 대한 몇 가지 관용어가 있습니다:

  • 출력 파일을 지정합니다 -. 일반적으로 출력 파일 이름(stdout을 의미)을 허용합니다. 이것은POSIX.1-2017에 의해 승인됨:

    지침 13: 읽기 또는 쓰기를 위해 열 파일을 나타내기 위해 피연산자를 사용하는 유틸리티의 경우 "-" 피연산자는 표준 입력(또는 출력 파일이 지정되고 있다는 것이 컨텍스트에서 명확한 경우 표준 출력)을 나타내는 데에만 사용해야 합니다. ) 또는 파일 이름은 -입니다.

generate-the-file(잘 정의된 유틸리티 이외의 유틸리티의 경우 구현에 따라 정의되지만 도구가 이를 지원할 가능성이 높습니다 .)

이는 모든 쉘에서 작동하지 않으며 운영 체제가 fd 파일 이름을 지원해야 합니다.

답변3

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

trap 'rm temp-file' EXIT

dash이 기능은 셸 에도 존재하며 sh최신 Linux 배포판에서는 앨리어싱이라고도 합니다.

관련 정보