De C, qual é a maneira mais fácil de executar um utilitário padrão (por exemplo, ps) e nenhum outro?
O POSIX garante que, por exemplo, um padrão ps
está em /bin/ps
ou devo redefinir a variável de ambiente PATH para o que recebo confstr(_CS_PATH, pathbuf, n);
e, em seguida, executar o utilitário por meio da pesquisa PATH?
Não, não, principalmente porque não exige que os sistemas estejam em conformidade por padrão , ou que cumpram apenas o padrão POSIX (com exclusão de qualquer outro padrão).
Por exemplo, Solaris (um sistema compatível certificado) escolheu a compatibilidade com versões anteriores para seus utilitários no
/bin
, o que explica por que eles se comportam de maneira misteriosa e fornece utilitários compatíveis com POSIX em locais separados (/usr/xpg4/bin
,/usr/xpg6/bin
... para diferentes versões do XPG (agora mesclado no padrão POSIX), que na verdade fazem parte de componentes opcionais no Solaris).Mesmo
sh
não é garantido estar em/bin
. No Solaris,/bin/sh
costumava ser o Bourne shell (portanto, 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/usr/xpg4/bin/sh
).De C, você pode usar
exec*p()
e assumir que está em um ambiente POSIX (em particular em relação àPATH
variável de ambiente).Você também pode definir a
PATH
variável de ambienteOu você pode determinar em tempo de compilação o caminho dos utilitários POSIX que deseja executar (tendo em mente que em alguns sistemas como os 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 haja um
sh
in$PATH
, que seja semelhante ao Bourne, que também haja umgetconf
e que seja o da versão do POSIX em que você está interessado.Na verdade, eu responderia que sim . A 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 pode ser encontrado no PATH padrão do sistema, como um arquivo executável.De fato, a única maneira especificada de fazer isso no padrão é (em C) via
unistd.h
_CS_PATH de , 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 arquivo compatível com POSIXps
fornecido em um determinado sistema. Ou seja, embora seja definido pela implementação quais caminhos são incluídos na variável PATH padrão do sistema, esses utilitários devem estar sempre disponíveis, exclusivos e compatíveis em um dos caminhos especificados nele.Veja: < unistd.h >, comando .