Из C, какой самый простой способ запустить стандартную утилиту (например, ps) и ничего другого?
Имеет ли POSIX гарантии , что, например, стандарт ps
в /bin/ps
или я должен сбросить переменную окружения PATH , чтобы получить то , что я с confstr(_CS_PATH, pathbuf, n);
и затем запустить программу через PATH-поиска?
/bin
, т. Е./bin/ed
Должны использоваться если ed установлен. Я не могу найти его прямо сейчас, но я знаю, что LSB зависит от этого, и я успешно защитил отчеты об ошибках, используя это в качестве обоснования, поэтому, по крайней мере, в какой-то момент это должно было быть правдой. (Или это было что-то отличное от POSuX и я запомнил, но остальное правда.)Ответы:
Нет, в основном по той причине, что не требуется, чтобы системы соответствовали по умолчанию или соответствовали только стандарту POSIX (исключая любой другой стандарт).
Например, Solaris (сертифицированная совместимая система) выбрала обратную совместимость для своих утилит
/bin
, что объясняет, почему они ведут себя непонятным образом, и предоставляет POSIX-совместимые утилиты в отдельных местах (/usr/xpg4/bin
,/usr/xpg6/bin
... для разных версий XPG (теперь объединены). в стандарт POSIX), которые на самом деле являются частью дополнительных компонентов в Solaris).Даже
sh
не гарантированно будет в/bin
. В Solaris/bin/sh
раньше была оболочка Bourne (поэтому не POSIX-совместимая) до Solaris 10, в то время как в Solaris 11 она теперь ksh93 (все еще не полностью POSIX-совместимая, но на практике в большей степени/usr/xpg4/bin/sh
).Из C вы можете использовать
exec*p()
и предполагать, что находитесь в среде POSIX (в частности, в отношенииPATH
переменной среды).Вы также можете установить
PATH
переменную средыИли вы можете определить во время сборки путь к утилитам POSIX, которые вы хотите запустить (имея в виду, что в некоторых системах, таких как GNU, вам нужно больше шагов, таких как установка
POSIXLY_CORRECT
переменной для обеспечения соответствия).Вы также можете попробовать такие вещи, как:
В надежде , что есть
sh
в$PATH
, что это Bourne-подобный, что есть такжеgetconf
и что это один для версии POSIX вы заинтересованы в.источник
/usr/bin/env
существует и в основном соответствует POSIX./usr/bin/env
Это еще менее переносимый (на практике) взломать, чем/bin/sh
. За POSIX, портативный способ написать скрипт не с не#!
совсем . Если файл является исполняемым, ноENOEXEC
(не допустимым двоичным файлом ),execvp
он должен выполняться через стандартную оболочку. :-) Конечно, на практике это плохая идея, и вы должны просто использовать#!/bin/sh
.$PATH
от раковины вместо от C.На самом деле, я бы в основном ответил да . POSIX действительно гарантирует:
Хотя не обязательно гарантируется, что каждая утилита должна находиться в определенном каталоге во всех системах (
/bin/ps
), она всегда может быть найдена в системном стандартном PATH как исполняемый файл.Действительно, единственный стандарт, указанный способ сделать это в стандарте (в C) через
unistd.h
«s _CS_PATH, или в оболочке, с помощью комбинацииcommand
иgetconf
коммунальных услуг, то есть,PATH="$(command -p getconf PATH)" command -v ps
всегда должен возвращать уникальный абсолютный путь к POSIX-совместимыйps
поставляется в определенной системе. Таким образом, хотя пути реализации определены, какие пути включены в системную переменную PATH по умолчанию, эти утилиты всегда должны быть доступны, уникальны и совместимы в одном из указанных в нем путей.Смотрите: < unistd.h >, команда .
источник
PATH=$(command -p getconf PATH)
будет работать только из оболочки POSIX в среде POSIX. POSIX не определяет, как вы попадаете в эту среду, он просто документируется. Например, в Solaris у вас есть a/usr/xpg4/bin/getconf
и a,/usr/xpg6/bin/getconf
которые возвращали бы разные значения для_CS_PATH
двух разных версий стандарта, и ни то,/usr/xpg4/bin
ни другое не/usr/xpg6/bin
имеют значения по умолчанию$PATH
. Существует,/usr/bin/getconf
что IIRC дает вам соответствие XPG4.sh
из любой оболочки по умолчанию ,getconf
команда по умолчанию$PATH
для данной системы. Например, для получения среды POSIX может потребоваться запуск уровня эмуляции, без которого вы вообще не будете запускать какие-либо Unix-подобные команды (например, Windows). Как только вы окажетесь в совместимой среде,getconf PATH
вы$PATH
получите доступ к совместимым утилитам, но если вы были в среде POSIX, это, вероятно, уже имело место. Обратите внимание, чтоgetconf ps
может вернутьсяps
. Наличиеps
встроенной команды допускается.