Quando usar a versão XPG * de um comando?

6

Eu ocasionalmente trabalho em uma máquina Solaris antiga cuja versão padrão de grep não é POSIX -compliant . Isso causa problemas nos meus arquivos rc porque o padrão grep na máquina não suporta as opções que eu preciso.

Esta é uma máquina no meu local de trabalho e não sou administrador; então não posso simplesmente instalar versões novas / melhores de comandos como achar melhor. No entanto, percebo que a máquina tem uma versão XPG adequada de grep at /usr/xpg4/bin/grep .

Obviamente, posso resolver o problema (para o Solaris) em meus arquivos rc com:

alias grep='/usr/xpg4/bin/grep'

Mas e as máquinas onde isso não é necessário? Meu objetivo é ter um único arquivo rc para cada shell que eu possa colocar em qualquer sistema parecido com o Unix e fazê-lo funcionar.

Isso me fez pensar ...

  1. Há algum caso em que eu não queira usar a versão XPG de um comando?
    • Se sim, quando?
  2. Eu não poderia simplesmente adicionar cegamente /usr/xpg4/bin/ ao início de $PATH em meus arquivos rc em todas as máquinas e desistir de usar comandos individuais em suas versões XPG *?
    • Ou isso causará problemas para alguns comandos?
  3. É o caso em que /usr/xpg4/bin/ existe apenas em máquinas onde é "necessário"?
    • Eu pergunto porque percebo que /usr/xpg4/bin/ não existe na minha máquina Ubuntu.

Então, para resumir, essa é uma boa ideia?

if [ -d "/usr/xpg4/bin" ]; then
  #Place XPG directory at beginning of path to always use XPG version of commands
  export PATH="/usr/xpg4/bin:$PATH"
fi

Se não, por que não?

    
por Sildoreth 27.04.2015 / 16:35

3 respostas

3

Vários sistemas Unix comerciais possuem utilitários compatíveis com versões anteriores em /bin e /usr/bin e um diretório como /usr/xpg4/bin que contém utilitários compatíveis com POSIX. Dessa forma, os aplicativos antigos podem se ater ao antigo PATH com apenas /bin e /usr/bin , e os aplicativos mais novos usam PATH com os utilitários POSIX primeiro. A menos que você precise de compatibilidade retroativa com os utilitários da década de 1980 desse sistema Unix, será melhor usar os utilitários POSIX.

No meu .profile , coloco os seguintes diretórios à frente de /bin e /usr/bin , se eles existirem:

/bin/posix
/usr/bin/posix
/usr/xpg6/bin
/usr/xpg4/bin
/usr/xpg2/bin

Acho que isso abrange pelo menos o Solaris, o Tru64 (também conhecido como Digital Unix, também conhecido como OSF / 1) e HP-UX.

Em vez de determinar o PATH automaticamente, você deve ser capaz de encontrar um PATH adequado para aplicativos que dependem de POSIX chamando o getconf :

PATH=$(getconf PATH)

Alguns sistemas, como * BSD e Linux, só enviam utilitários compatíveis com POSIX, portanto, eles estão nos diretórios usuais ( /bin , /usr/bin ) e não há necessidade de nenhum diretório separado.

    
por 29.04.2015 / 01:39
1

Primeiro, não use a versão alias que você descreveu na sua pergunta; esta é certamente a pior opção que você tem. Além disso, não acrescente esse caminho XPG4 codificado para todas as plataformas.

Em Solaris você geralmente é muito melhor servido (para dizer o mínimo) se você definir /usr/xpg4/bin no seu PATH antes dos outros diretórios bin do sistema. Ouso dizer que a versão padrão XPG4 das ferramentas é geralmente a melhor escolha nessa plataforma. (Um outro exemplo importante é "broken awk " no Solaris.) Eu certamente sugeriria definir esse XPG4 PATH apenas para as plataformas Solaris; então você poderia interrogar a plataforma e configurá-la condicionalmente no seu perfil.

Eu provavelmente testaria a saída de uname , mas também não vejo problema em testar a existência do diretório /usr/xpg4/bin como você fez.

    
por 28.04.2015 / 03:23
0

Dependendo do shell usado, você pode ter um parâmetro que possa ser testado; como OSTYPE , enchendo coisas específicas do SO lá.

if [[ $OSTYPE == solaris* ]]; then
  here be dragons
fi

Ou se você tiver alguns sistemas operacionais diferentes

case $OSTYPE in
  freebsd*|solaris*)
    export MANWIDTH=tty
  ;;
  openbsd*)
    export "PKG_PATH=http://mirror.team-cymru.org/pub/OpenBSD/$(uname -r)/packages/$(uname -p)"
  ;;
esac
    
por 27.04.2015 / 16:49