쉘 스크립트가 수행해야 하는 가장 일반적인 작업 중 하나는 임시 파일을 생성하고 조작하는 것입니다. 이름 충돌을 피하고, 경쟁 조건을 피하고, 파일에 올바른 권한이 있는지 확인해야 하므로 안전하게 수행하는 것은 어렵습니다. (보다GNU Coreutils 매뉴얼그리고이 사소한 징후 블로그 게시물대부분의 Unix 계열 운영 체제는 mktemp
이러한 모든 문제를 해결하는 단일 명령을 제공하여 이 문제를 해결합니다. 하지만,이러한 명령의 구문과 의미는 mktemp
표준화되지 않았습니다.. 정말 안전하게 임시 파일을 만들고 싶다면그리고휴대용, 당신은 의지해야못생긴 패치워크예를 들어 다음과 같습니다.
tmpfile=$(
echo 'mkstemp(template)' |
m4 -D template="${TMPDIR:-/tmp}/baseXXXXXX"
) || exit
m4
(이 해결 방법은 매크로 프로세서가 POSIX의 일부이고 m4
POSIX에서 정의한 C 표준 라이브러리 함수를 노출한다는 사실 을 활용합니다 .)mkstemp()
이 모든 것을 감안할 때 POSIX는 mktemp
명령의 존재와 적어도 일부 동작 측면을 보장하는 명령을 표준화하지 않는 이유는 무엇입니까? 이것은 POSIX 위원회의 명백한 감독입니까, 아니면 mktemp
위원회에서 실제로 논의한 표준화 아이디어가 기술적인 이유나 다른 이유로 거부된 것입니까 ?
답변1
이것은 Austin Group 메일링 리스트에 자주 등장하며 Open Group이 이를 지정하는 데 반대할 것이라고 생각하지 않습니다. 조언을 해줄 사람이 필요할 뿐입니다. 예를 들어, Eric Blake(주간 POSIX 회의에 참석하는 Red Hat)의 2011년 메시지를 참조하십시오(여기에 gmane에서 복사함).
Date: Tue, 10 May 2011 07:13:32 -0600
From: Eric Blake <[email protected]>
To: Nico Schottelius <[email protected]>
Cc: austin-group-l-7882/[email protected]
Newsgroups: gmane.comp.standards.posix.austin.general
Subject: Re: No mktemp in posix?
Organization: Red Hat
Message-ID: <[email protected]>
References: <[email protected]>
Xref: news.gmane.org gmane.comp.standards.posix.austin.general:4151
On 05/10/2011 04:50 AM, Nico Schottelius wrote:
> Good morning,
>
> digging through Issue 7, I haven't found any utility that gives
> the ability to create a secure, temporary file that is usually
> implemented in mktemp.
echo 'mkstemp(fileXXXXXX)' | m4
will output the name of a just-created temporary file. However, I agree
that there does not seem to be any standardized utility that gives
mkdtemp functionality, which is often more useful than mkstemp (after
all, once you have a secure temporary directory, then you can create
secure fifos within that directory, rather than having to wish for a
counterpart 'mkftemp' function).
> Is there no mktemp utility by intent or can we add it in the
> next issue?
I know both BSD and GNU have a mktemp(1) that wraps mktemp(), mkstemp(),
and mkdtemp(). In my inbox, I have record of some off-list email in
February of this year regarding some work between those teams to try and
converge on some common functionality and to word that in a manner
appropriate for the standard, although I can't find any publicly
archived messages to that effect. But yes, I think adding mktemp(1) to
the next revision of the standard would be worthwhile. I'll try to
revive those efforts and actually post some proposed wording.
--
Eric Blake [email protected] +1-801-349-2682
Libvirt virtualization library http://libvirt.org
(읽을 만한 가치가 있는) 최근 게시물에서 Geoff Clare(Open Group 소속)는 다음과 같이 말했습니다.
Date: Wed, 2 Nov 2016 15:13:46 +0000
From: Geoff Clare <gwc-7882/[email protected]>
To: austin-group-l-7882/[email protected]
Newsgroups: gmane.comp.standards.posix.austin.general
Subject: Re: [1003.1(2013)/Issue7+TC1 0001016]: race condition with set -C
Message-ID: <[email protected]>
Xref: news.gmane.org gmane.comp.standards.posix.austin.general:13408
Stephane Chazelas <[email protected]> wrote, on 02 Nov 2016:
>
> At the moment, there's no way (that I know) to create a temp file
> reliably with POSIX utilities
Given an m4 utility that conforms to the 2008 standard, there is:
tmpfile=$(echo 'mkstemp(/tmp/fooXXXXXX)' | m4)
However, I don't know how widespread support for the new mkstemp()
macro is.
--
Geoff Clare <g.clare-7882/[email protected]>
The Open Group, Apex Plaza, Forbury Road, Reading, RG1 1AX, England
(귀하의 질문에서 언급한 트릭을 여기서 배웠습니다.)
답변2
이 mktemp(1)
유틸리티는 원래 1997년 6월 1일에 출시된 OpenBSD-2.1에 도입되었습니다.
또한 Solaris 및 Linux를 포함한 다양한 플랫폼에서도 사용할 수 있습니다.
POSIX 표준에 포함시키려는 경우 관련 표준 텍스트에 대한 제안을 하면 그렇게 할 가능성이 높습니다.
POSIX는 이를 "발명"하지 않지만 프로그램이 이미 하나 이상의 인증된 플랫폼에 존재하므로 이는 문제가 되지 않습니다.
누구나 다음을 통해 제안할 수 있습니다. https://austingroupbugs.net/계정을 신청하고 "버그 리포트"를 작성하기만 하면 됩니다.
그러한 제안을 하고 싶다면 숙제는 사용 가능한 모든 구현의 최소 공통 분모를 조사하고(예: *BSD, Solaris 및 Linux의 공통점이 무엇인지 확인) 최소 공통 분모를 설명하는 매뉴얼 페이지를 작성하는 것입니다. 다양한 구현의 호환되지 않는 동작으로 인해 존재할 수 있는 지정되지 않거나 정의되지 않은 동작을 언급하는 것을 잊지 마세요.
숙제를 마쳤고 텍스트 제안이 월말까지 제공되며 Austin Caucus 회의 승인을 받기 위해 많은 수정이 필요하지 않다면 다음 버전의 표준에 포함될 가능성이 높습니다. (p. 8)은 내년에 오스틴 그룹 승인에 이어 IEEE 승인도 나올 것으로 예상된다. 우리는 새로운 표준 버전의 초안 1.1을 내부적으로 출시했습니다. 8교시에 진출하지 못하면 9교시에 진출할 기회를 얻기까지 몇 년이 걸릴 것입니다.
POSIX에 중요한 프로그램을 추가하는 데 필요한 노력에 대한 아이디어를 제공하기 위해 저는 Hasso Plattner Institute의 학생과 협력하여 다음과 같이 gettext(1)
, 및 family에 대한 POSIX 표준에 대한 텍스트 제안서를 작성했습니다 . xgettext(1)
-3월 워크숍 이 일환으로 우리는 오스틴 간부회의 통화에 3개월(주 2회)을 추가로 투자했습니다.msgfmt(1)
gettext(3)