如何修复 csh 中的“MANPATH:未定义变量。”?

如何修复 csh 中的“MANPATH:未定义变量。”?

我正在 Ubuntu 16.04 上按照其“自述' 文件。在某个点(链接中的第 3b 点),指南要求我运行位于某个目录中的 .csh 文件以生成可执行文件。当我通过键入从所需目录中的终端执行所需的 csh 脚本./compile_all.csh,或运行csh以启动交互式 shell 时,我在终端上看到以下行:

MANPATH: undefined variable. 

有人能指导我如何修复这个错误吗?

以下是manpath从 Ubuntu 终端执行该命令的结果:

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

执行以下命令后发现该~./cshrc文件仅包含一行:

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

前几行compile_all.csh如下:

#!/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

答案1

错误消息

MANPATH: undefined variable. 

MANPATH是因为 Ubuntu默认没有设置(man具有内置搜索路径)并且csh(与 Bourne shell 不同)不将未设置的变量视为空。

然而它本身不应该阻止 shell 或任何 C-shell 脚本运行。

尽管如此,如果你想“修复”它,你将需要修改你的~/.cshrc文件来检查是否MANPATH设置,并适当地处理这两种情况 - 类似于

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

免责声明我的语法不太流利,csh所以 YMMV。

答案2

改成。${MANPATH}:${HOME}/share/man"`manpath`:$HOME/share/man"

您的~/.cshrc文件包含(实际上完全由)一个命令,其意图man是扩充命令将在其中查找手册页的目录列表:

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

但是,这通常不是实现此目的的正确方法,并且不适用于您的情况,因为MANPATH环境变量不存在。这就是产生错误消息的原因。1

manpath命令,你找到了工作,自动做正确的事情。它会检查是否存在MANPATH环境变量,如果存在(并且非空),则使用它。但如果没有这样的环境变量(或者存在但为空),manpath则查阅配置文件/etc/manpath.config以确定默认 manpath 应该是什么,然后使用它。当您设置MANPATH环境变量时,该文件中的条目不再自动使用,因此您有责任确保MANPATH包含它们,除非在您不想要它们的特殊情况下。2

幸运的是,这很容易做到,因为你只需使用命令替换将命令的输出包含manpath在分配给变量的值中MANPATH将当前行替换~/.cshrc为:

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

反引号 ( ) 在和` `中执行命令替换。在 Bourne 风格的 shell 中,也有命令替换的语法,这通常比反引号更可取,但cshtcshbash$( )不适用于 C shell。您不能使用$( )带有csh/ 的语法tcsh;它们不支持它。


1 然而,正如steeldriver所说,你也许可以继续没有修复此问题。大多数脚本不使用该man命令,但有些可能。即使您的脚本安装了包含手册页的软件,它也可能不会查阅当前的 manpath 来确定将它们放在哪里。当然,如果它的文档说它确实这样做了,那么这将取代这一点猜测。我确实建议你解决这个问题,但你可以可能不这样做则继续。

2 man命令使用相同的过程来决定在哪里查找手册页,可能通过调用manpath。请参阅人路(5)man 5 manpath),其中表示,“如果环境变量 $曼帕特已经设置,/etc/manpath.config 中包含的信息将不会覆盖它。”我已通过测试确认情况确实如此。例如,env MANPATH=. man tcsh从您的主目录运行将显示No manual entry for tcsh

相关内容