Почему в POSIX нет команды mktemp?

Использование кувалды Perl:

$ perl -pe 's/\n/\\n/' < file.txt ; echo

echoпредназначен для печати завершающей новой строки на тот случай, если это необходимо для целей отображения. Это также изменяет NL в последней строке на \n.

Или довольно простое решение только в Bash, предполагая, что файл не содержит встроенных байтов NUL. Обратите внимание, что это загружает весь файл в память :

.
$ IFS= read -r -d '' text < file.txt; printf '%s\n' "${text//$'\n'/\\n}"
15
16.10.2020, 12:22
2 ответа

Это регулярно всплывает в списке рассылки Austin Group, и я не думаю, что Open Group будет возражать против его уточнения. Просто нужно, чтобы кто-то что-то предложил. См., например, это сообщение Эрика Блейка (Red Hat, представленное на еженедельном собрании POSIX )от 2011 года (здесь скопировано из gmane):

Date: Tue, 10 May 2011 07:13:32 -0600
From: Eric Blake <eblake-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
To: Nico Schottelius <nico-posix-xuaVFQXs+5hIG4jRRZ66WA@public.gmane.org>
Cc: austin-group-l-7882/jkIBncuagvECLh61g@public.gmane.org
Newsgroups: gmane.comp.standards.posix.austin.general
Subject: Re: No mktemp in posix?
Organization: Red Hat
Message-ID: <4DC939FC.2040407@redhat.com>
References: <20110510105051.GA1767@ethz.ch>
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   eblake-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

В более свежей ветке (стоит прочитать ), Джефф Клэр (из Open Group):

Date: Wed, 2 Nov 2016 15:13:46 +0000
From: Geoff Clare <gwc-7882/jkIBncuagvECLh61g@public.gmane.org>
To: austin-group-l-7882/jkIBncuagvECLh61g@public.gmane.org
Newsgroups: gmane.comp.standards.posix.austin.general
Subject: Re: [1003.1(2013)/Issue7+TC1 0001016]: race condition with set -C
Message-ID: <20161102151346.GB24416@lt.loopback>
Xref: news.gmane.org gmane.comp.standards.posix.austin.general:13408

Stephane Chazelas <stephane.chazelas-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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/jkIBncuagvECLh61g@public.gmane.org>
The Open Group, Apex Plaza, Forbury Road, Reading, RG1 1AX, England

(именно здесь я научился тому трюку, о котором вы говорите в своем вопросе ).

17
18.03.2021, 22:56

Утилита mktemp(1)была представлена ​​OpenBSD -2.1, первоначально выпущенной 1 июня 1997 г.

Тем временем он доступен на различных платформах, включая Solaris и Linux.

Если вы хотите, чтобы это было в стандарте POSIX, есть большие шансы сделать это, если вы сделаете предложение по соответствующему стандартному тексту.

Обратите внимание, что POSIX не занимается «изобретением», но поскольку эта программа уже существует по крайней мере на одной сертифицированной платформе, это не проблема.

Каждый может сделать предложение по телефону :https://austingroupbugs.net/, просто подайте заявку на создание учетной записи и сделайте «отчет об ошибке»

Если вы хотите сделать такое предложение, вашим домашним заданием будет исследование наименьшего общего знаменателя всех доступных реализаций (, т.е. проверка того, что общего у *BSD, Solaris и Linux )и написание инструкции. страница, описывающая наименьший общий знаменатель. Не забудьте упомянуть о неуказанном или неопределенном поведении, которое может существовать из-за несовместимого поведения разных реализаций.

Если вы сделаете хорошую домашнюю работу и ваше текстовое предложение будет готово к концу этого месяца и не потребует множества исправлений для утверждения на телеконференции основной группы в Остине, есть большая вероятность, что оно может быть включено в следующий стандартная версия (Issue -8 ), которая, как ожидается, будет одобрена в следующем году группой Austin, а затем IEEE. Мы только что выпустили черновик 1.1 для новой стандартной версии для внутреннего использования. Если он не попадет в Выпуск -8, потребуется несколько лет, чтобы получить шанс для Выпуска -9.

Чтобы дать вам представление о том, какие усилия потребуются для -нетривиальной программы, которая будет добавлена ​​в POSIX, я написал предложение по стандартному тексту POSIX для gettext(1), xgettext(1),msgfmt(1)и gettext(3)семья вместе со студентом из Института Хассо Платтнера в рамках семинара с января по март, и мы уже провели еще 3 месяца в телеконференциях (два раза в неделю )Остинского Ядро группы.

6
18.03.2021, 22:56

Теги

Похожие вопросы