내 프로그램이 충돌할 경우 임시 파일을 피하고 싶습니다.
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
(잘 정의된 유틸리티 이외의 유틸리티의 경우 구현에 따라 정의되지만 도구가 이를 지원할 가능성이 높습니다 .)
운영 체제에 따라
/dev/stdout
또는 를 사용 하십시오./proc/self/fd/1
/dev/stdin, /dev/stdout 및 /dev/stderr의 이식성은 얼마나 됩니까?프로세스 대체를 사용하십시오. bash를 사용하면
>(process substitution)
파일 이름을 쓸 수 있습니다 . 예를 들어:wget -O >(rot13 > Question.txt)https://unix.stackexchange.com/q/579535/70346
이는 모든 쉘에서 작동하지 않으며 운영 체제가 fd 파일 이름을 지원해야 합니다.
답변3
bash
셸 에서 정리를 처리하는 방법은 trap
내장된 EXIT( bash
셸에 입력 help trap
)를 사용하는 것입니다.
trap 'rm temp-file' EXIT
dash
이 기능은 셸 에도 존재하며 sh
최신 Linux 배포판에서는 앨리어싱이라고도 합니다.