discrepância entre caminho para binário e man page

1

Os sistemas geralmente têm várias versões de binários e o selecionado depende da prioridade em $PATH . Por exemplo, o sistema que estou usando tem duas versões:

$ which sort
~/coreutils-8.25/bin/sort
$ ~/coreutils-8.25/bin/sort --version | head -n 1
sort (GNU coreutils) 8.25
$ /bin/sort --version | head -n 1
sort (GNU coreutils) 8.4

No sistema que estou usando, a versão do GNU coreutils 8.25 é selecionada por uma invocação de sort devido à sua precedência em PATH . No entanto, a variável de ambiente MANPATH no sistema foi estabelecida de forma que a página man do sort do GNU coreutils 8.4 seja exibida (por exemplo, para /bin/sort , que não é o binário tendo precedência).

Uma questão de três partes surge deste cenário.

Primeiro, existe uma maneira simples de instruir man (ou o shell) a usar ou produzir uma forma de MANPATH que reflita PATH , ou deve fazer isso manualmente (ou seja, encontrando os caminhos para as man pages associadas a cada entrada em PATH e então concatenando esses caminhos man na mesma ordem que PATH , um exercício que teria que ser repetido sempre que uma alteração fosse feita em PATH )? Se houver um mecanismo para estabelecer concordância entre PATH e MANPATH , a página do manual esperada será exibida automaticamente, evitando o problema de ler inadvertidamente uma página do manual para uma versão diferente da usada por padrão.

Em segundo lugar, existe um comando que permite determinar rapidamente o caminho da página de manual padrão (por exemplo, algo parecido com which "man sort" , que informaria o caminho da página de manual que é exibida ao executar man sort ) . Por exemplo, quando digito man sort , não tenho indicação do arquivo específico no sistema que está sendo entregue ao pager.

Terceiro, existe uma maneira de obter a página man para uma versão explícita de um comando (algo como man ~/coreutils-8.25/bin/sort no meu caso para a versão GNU coreutils 8.25, em vez de ter que rastrear o arquivo associado, que no meu caso pode ser encontrado para ser ~ / coreutils-8.25 / share / man / man1 / sort.1 ou ~ / coreutils-8.25 / man / sort.1).

    
por user001 07.05.2016 / 01:30

4 respostas

1

Para instalações locais como essa, eu uso um script de shell para configurar os valores PATH , LD_LIBRARY_PATH e MANPATH para que eu obtenha resultados consistentes. Sem um adereço como esse, você não obterá resultados consistentes automáticos.

Aqui está um exemplo antigo:

#!/bin/bash
# $Id: with-ncurses,v 1.1 2006/09/02 23:04:39 tom Exp $
export LIBS="-lncursesw"
for prefix in \
        /usr/local/ncurses6
do
        test  -f $prefix/lib/libncursesw.so && break
        test  -f $prefix/lib/libncursesw.a  && break
done

if [ -d $prefix/include/ncursesw ] ; then
        export CPPFLAGS="-I$prefix/include/ncursesw $CPPFLAGS"
        if [ $prefix != /usr ] ; then
                export CPPFLAGS="-I$prefix/include $CPPFLAGS"
        fi
fi

if [ $prefix != /usr ] ; then
        export PATH='newpath -bd $prefix/bin'
        export LD_LIBRARY_PATH='newpath -n LD_LIBRARY_PATH -bd $prefix/lib'
        export LIBS="-L$prefix/lib $LIBS"
        # this doesn't work for db30:
        # export LIBS="-static -L$prefix/lib $LIBS -shared"
fi

case 'partition' in
rh*|md*)
        export MANPATH=$prefix/man:'manpath'
        ;;
*)
        export MANPATH=$prefix/man:'manpath -q'
        ;;
esac
eval $*

Criar scripts como esse portável é um problema, já que não há padrões para o uso do MANPATH . Mas você pode adaptar coisas assim para sistemas específicos.

O script, a propósito, usa newpath para modificar essas variáveis e evitar duplicados.

    
por 07.05.2016 / 01:42
1

2. Você quase tem isso. man -w sort mostra w aqui fica a man page para sort .

1 & 3. Provavelmente não, já que as páginas man podem estar em qualquer lugar.
3. Você pode fazer uma pesquisa de força bruta:

find / -name "sort.1*"
    
por 07.05.2016 / 01:53
1

Adicione o seguinte ao seu ~/.bashrc ou ~/.profile :

export MANPATH="$HOME/coreutils-8.25/share/man:$(manpath)"

Isso colocará a árvore de man pages em $ MANPATH primeiro, antes do padrão MANPATH (conforme fornecido pelo comando manpath )

    
por 07.05.2016 / 03:38
1

Supondo que você coloque suas páginas de manual ao lado de seus executáveis (isto é, executáveis em /somewhere/bin , man pages em /somewhere/man/manSECTION ), e você está usando uma implementação man com um manpath , como a maioria dos sistemas Linux e FreeBSD e OS X, apenas executa manpath . Ele constrói uma variável MANPATH que é paralela ao seu 'PATH.

unset MANPATH
MANPATH=$(manpath)
    
por 07.05.2016 / 21:07

Tags