Como faço para corrigir “MANPATH: variável indefinida” em csh?

1

Estou instalando algum software de código aberto compilando seu código-fonte - no Ubuntu 16.04 - seguindo as instruções em 'readme '. Em determinado ponto (ponto 3b no link) a diretriz exige que eu execute um arquivo .csh localizado em um determinado diretório para gerar executáveis. Quando executo o script csh necessário a partir do terminal no diretório necessário digitando ./compile_all.csh ou execute csh para iniciar um shell interativo, recebo a seguinte linha no terminal:

MANPATH: undefined variable. 

Alguém pode me orientar como posso corrigir esse erro?

O seguinte é o resultado do comando manpath quando executado a partir de um terminal Ubuntu:

~$ manpath
/home/atrcheema/share/man:/usr/local/man:/usr/local/share/man:/usr/share/man

O arquivo ~./cshrc continha apenas uma linha, conforme visto pela execução do seguinte comando:

:/home$ vim ~/.cshrc
setenv MANPATH ${MANPATH}:${HOME}/share/man

As primeiras linhas de compile_all.csh são as seguintes:

#!/bin/csh

####### section added by York Prado 10/2009
if( ! (-e /usr/bin/f77 || -e /bin/f77 || -e /usr/local/bin/f77) ) then 
echo "f77 command is not found"
echo "Please make sure you have the fortran 77 compiler installed"
exit 1
endif 

# section below moved to compile_hspf_libs.csh
#cd hspf/lib3.2/src/util
#make clean 
#make 
#make install 
#cd ../ 
#cd wdm/
#make clean
#make 
#make install
#cd ../
#cd adwdm/
#make clean
##make
#make install
#echo "Compiled all the lib3.2 files needed to compile the CBWM"
#cd ../../../../ 

######### end York Prado section

cd lib/dsn/
f77 -c dsn_utils.f

cd ../util
rm ../util_lib.a
./compile
cd ../get
rm ../get_lib.a
./compile
cd ../tty/
gcc -c -o ../ttyux.o ttyux.c
    
por Ather Cheema 21.10.2017 / 12:42

2 respostas

2

A mensagem de erro

MANPATH: undefined variable. 

é porque o Ubuntu não define MANPATH por padrão ( man tem um caminho de busca embutido) e csh (ao contrário de shells Bourne) não trata variáveis não definidas como vazias.

No entanto, ele não deve impedir que o shell ou qualquer script C-shell seja executado.

No entanto, se você quiser "consertá-lo", precisará modificar seu arquivo ~/.cshrc para verificar se MANPATH está definido ou não e tratar os dois casos de forma adequada - algo como

if ( ${?MANPATH} ) then 
  setenv MANPATH ${MANPATH}:${HOME}/share/man
else 
  setenv MANPATH ${HOME}/share/man
endif

EXCLUSÃO DE RESPONSABILIDADE Não sou fluente na sintaxe csh , por isso, YMMV.

    
por steeldriver 21.10.2017 / 16:02
1

Alterar ${MANPATH}:${HOME}/share/man para "'manpath':$HOME/share/man" .

Seu arquivo ~/.cshrc contém (e na verdade consiste inteiramente em) um comando cuja intenção é aumentar a lista de diretórios nos quais o comando man procurará páginas de manual:

setenv MANPATH ${MANPATH}:${HOME}/share/man

No entanto, essa não é uma maneira geralmente correta de conseguir isso e não funciona para sua situação, porque a variável de ambiente MANPATH não existe. Isso é o que produz sua mensagem de erro. 1

O comando manpath , que você encontrou faz funciona, automaticamente faz a coisa certa. Ele verifica se existe uma variável de ambiente MANPATH e a utiliza se existir (e não está vazia). Mas se não houver tal variável de ambiente (ou ela existir, mas estiver em branco), manpath consultará o arquivo de configuração /etc/manpath.config para determinar qual deve ser o caminho padrão e o utiliza. Quando você define a variável de ambiente MANPATH , as entradas nesse arquivo não são mais usadas automaticamente, portanto, você é responsável por garantir que MANPATH as contenha, exceto no caso incomum que você não as deseja. < strong> 2

Felizmente, isso é fácil, porque você pode simplesmente usar substituição de comando para incluir a saída do comando manpath no valor atribuído à variável MANPATH . Substitua a linha ~/.cshrc contida atualmente por:

setenv MANPATH "'manpath':$HOME/share/man"

Backticks ( ' ' ) executam a substituição de comandos em csh e tcsh . Em shells no estilo Bourne como bash , há também uma sintaxe $( ) para substituição de comando, que geralmente é preferível a backticks, mas que não se aplica a shells C . Você não pode usar a sintaxe $( ) com csh / tcsh ; eles não suportam isso.

1 No entanto, como diz o Steeldriver, você provavelmente pode continuar sem corrigir este problema. A maioria dos scripts não usa o comando man , embora alguns possam. Mesmo que o seu script instale software que inclua páginas de manual, provavelmente ele não consultará o caminho atual para descobrir onde colocá-las. É claro que, se a documentação diz que sim, então isso substitui esse palpite. Eu sugiro que você corrija esse problema, mas você pode provavelmente prosseguir sem fazer isso.

2 O comando man usa o mesmo procedimento para decidir onde procurar por páginas de manual, possivelmente chamando manpath . Veja caminho (5) ( man 5 manpath ), que diz, "Se a variável de ambiente $ MANPATH já estiver definida, as informações contidas em /etc/manpath.config não irão sobrescrevê-lo." Eu confirmei, testando, que esta é a caso. Por exemplo, a execução de env MANPATH=. man tcsh do seu diretório pessoal dirá No manual entry for tcsh .

    
por Eliah Kagan 21.10.2017 / 16:55