내 프로그램이 충돌할 경우 임시 파일이 남아 있는 것을 방지하고 싶습니다.
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-file
stdout에서 출력을 생성하지 못할 수 있다고 언급합니다. 이에 대한 몇 가지 관용어가 있습니다:
- 의 출력 파일을 지정합니다
-
. 표준 출력을 의미하는 출력 파일 이름을 -로 받아들이는 것이 일반적입니다. 이것은POSIX.1-2017에서 인정됨:지침 13: 피연산자를 사용하여 읽기 또는 쓰기용으로 열 파일을 나타내는 유틸리티의 경우 '-' 피연산자는 표준 입력(또는 출력 파일이 지정된다는 것이 문맥상 분명할 경우 표준 출력) 또는 -라는 파일명.
(명시적으로 정의한 유틸리티 이외의 유틸리티의 경우 구현에 따라 정의되지만 도구에서 지원될 가능성이 높습니다 generate-the-file
)
/dev/stdout
또는 를 사용하세요/proc/self/fd/1
. OS에 따라 다름, 참조/dev/stdin, /dev/stdout 및 /dev/stderr의 이식성은 얼마나 됩니까?프로세스 대체를 사용하십시오. bash를 사용하면
>(process substitution)
파일 이름으로 쓸 수 있습니다 . 예를 들어:wget -O >(rot13 > 질문.txt)https://unix.stackexchange.com/q/579535/70346
이는 모든 쉘에서 작동하지 않으며 fd 파일 이름에 대한 OS 지원이 필요합니다.
답변3
셸 에서 bash
정리를 처리하는 방법은 EXIT trap
내장을 사용하는 것입니다(셸 내에서 bash
입력 help trap
).
trap 'rm temp-file' EXIT
이 기능은 셸에도 존재하며 최신 Linux 배포판에서 dash
흔히 별칭으로 사용됩니다 .sh