Em C, qual é a maneira mais fácil de executar um utilitário padrão (por exemplo, ps) e nenhum outro?
Does POSIX garantia de que, por exemplo, um padrão ps
está em /bin/ps
ou devo redefinir a variável de ambiente PATH para que eu recebo com confstr(_CS_PATH, pathbuf, n);
e, em seguida, executar o utilitário através PATH-search?
/bin
, ou seja,/bin/ed
devem ser utilizáveis se ed estiver instalado. Não consigo encontrá-lo agora, mas sei que o LSB depende disso e defendi com êxito os relatórios de erros usando isso como justificativa, portanto, pelo menos, deve ter sido verdade em algum momento. (Ou era algo diferente de POSuX e eu lembro errado, mas o resto é verdade.)Respostas:
Não, principalmente porque não exige que os sistemas estejam em conformidade por padrão ou em conformidade com apenas com o padrão POSIX (com exclusão de qualquer outro padrão).
Por exemplo, o Solaris (um sistema compatível certificado) escolheu a compatibilidade com versões anteriores de seus utilitários
/bin
, o que explica por que eles se comportam de maneiras misteriosas e fornece utilitários compatíveis com POSIX em locais separados (/usr/xpg4/bin
,/usr/xpg6/bin
... para diferentes versões do XPG (agora mescladas) no padrão POSIX), sendo parte dos componentes opcionais do Solaris).sh
Não é garantido que Even esteja presente/bin
. No Solaris,/bin/sh
costumava ser o shell Bourne (não compatível com POSIX) até o Solaris 10, enquanto agora é ksh93 no Solaris 11 (ainda não totalmente compatível com POSIX, mas na prática é mais do que isso/usr/xpg4/bin/sh
).Em C, você pode usar
exec*p()
e assumir que está em um ambiente POSIX (em particular no que diz respeito àPATH
variável de ambiente).Você também pode definir a
PATH
variável de ambienteOu você pode determinar em tempo de construção o caminho dos utilitários POSIX que deseja executar (tendo em mente que em alguns sistemas como o GNU, você precisa de mais etapas, como definir uma
POSIXLY_CORRECT
variável para garantir a conformidade).Você também pode tentar coisas como:
Na esperança de que há um
sh
em$PATH
, que é Bourne-like, que há também umgetconf
e que é a pessoa certa para a versão do POSIX você está em interessado.fonte
/usr/bin/env
exista e seja principalmente compatível com POSIX./usr/bin/env
É um hack ainda menos portátil (na prática) do que/bin/sh
. De acordo com o POSIX, a maneira portátil de escrever um script de shell é absolutamente inexistente#!
. Se um arquivo é executável, masENOEXEC
(não é um binário válido),execvp
é para executá-lo através do shell padrão. :-) Obviamente, na prática, essa é uma péssima idéia e você deve apenas usá-la#!/bin/sh
.$PATH
shell em vez do C.Na verdade, eu responderia sim . O POSIX garante:
Embora não seja necessariamente garantido que cada utilitário esteja em um diretório específico em todos os sistemas (
/bin/ps
), ele sempre garantiu poderá ser encontrado no PATH padrão do sistema, como um arquivo executável.De fato, a única maneira especificada para fazer isso no padrão é (em C) via
unistd.h
_CS_PATH, ou no shell, por meio de uma combinação decommand
egetconf
utilitários, ou seja,PATH="$(command -p getconf PATH)" command -v ps
deve sempre retornar o caminho absoluto exclusivo do POSIX compatível com POSIXps
fornecido em um sistema específico. Ou seja, embora seja definido na implementação quais caminhos estão incluídos na variável PATH padrão do sistema, esses utilitários sempre devem estar disponíveis, exclusivos e compatíveis, em um dos caminhos especificados nele.Veja: < unistd.h >, comando .
fonte
PATH=$(command -p getconf PATH)
funcionará apenas a partir de um shell POSIX em um ambiente POSIX. O POSIX não especifica como você entra nesse ambiente, apenas que seja documentado. Por exemplo, no Solaris, você tem um/usr/xpg4/bin/getconf
e um/usr/xpg6/bin/getconf
que retornariam valores diferentes para_CS_PATH
para as duas versões diferentes do padrão e/usr/xpg4/bin
nem/usr/xpg6/bin
estão no valor padrão de$PATH
. Existe um/usr/bin/getconf
que o IIRC oferece a você em conformidade com XPG4.sh
partir de qualquer shell padrão .getconf
comando no padrão$PATH
de um determinado sistema. Por exemplo, obter um ambiente POSIX pode envolver o início de uma camada de emulação, sem a qual você não executaria nenhum comando semelhante ao Unix (pense no Windows, por exemplo). Quando você estiver em um ambiente compatível,getconf PATH
você$PATH
terá acesso a utilitários compatíveis, mas se você estivesse em um ambiente POSIX, provavelmente já era esse o caso. Observe quegetconf ps
pode retornarps
. Tendops
embutido é permitido.