我正在 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 中,也有命令替换的语法,这通常比反引号更可取,但csh
tcsh
bash
$(
)
不适用于 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
。