无法在.cshrc中获取脚本

时间:2012-08-10 00:08:04

标签: linux csh

我正在使用的库有一个脚本来设置适当的环境变量:

# Source this script to set up the ROOT build that this script is part of.
#
# Conveniently an alias like this can be defined in ~/.cshrc:
#   alias thisroot "source bin/thisroot.sh"
#
# This script if for the csh like shells, see thisroot.sh for bash like shells.
#
# Author: Fons Rademakers, 18/8/2006

# $_ should be source .../thisroot.csh
set ARGS=($_)
set THIS="`dirname ${ARGS[2]}`"
setenv ROOTSYS "`(cd ${THIS}/..;pwd)`"

set path = ($ROOTSYS/bin $path)

if ($?LD_LIBRARY_PATH) then
   setenv LD_LIBRARY_PATH $ROOTSYS/lib:$LD_LIBRARY_PATH      # Linux, ELF HP-UX
else
   setenv LD_LIBRARY_PATH $ROOTSYS/lib
endif

if ($?DYLD_LIBRARY_PATH) then
   setenv DYLD_LIBRARY_PATH $ROOTSYS/lib:$DYLD_LIBRARY_PATH  # Mac OS X
else
   setenv DYLD_LIBRARY_PATH $ROOTSYS/lib
endif

if ($?SHLIB_PATH) then
   setenv SHLIB_PATH $ROOTSYS/lib:$SHLIB_PATH                # legacy HP-UX
else
   setenv SHLIB_PATH $ROOTSYS/lib
endif

if ($?LIBPATH) then
   setenv LIBPATH $ROOTSYS/lib:$LIBPATH                      # AIX
else
   setenv LIBPATH $ROOTSYS/lib
endif

if ($?PYTHONPATH) then
   setenv PYTHONPATH $ROOTSYS/lib:$PYTHONPATH
else
   setenv PYTHONPATH $ROOTSYS/lib
endif

if ($?MANPATH) then
   setenv MANPATH `dirname $ROOTSYS/man/man1`:$MANPATH
else
   setenv MANPATH `dirname $ROOTSYS/man/man1`
endif

如果我在命令行中运行它,脚本工作正常,例如

source /home/sm/packages/root/bin/thisroot.csh

但是,如果我尝试将该命令添加到我的.cshrc文件中,它将失败并显示错误消息:

ARGS: Subscript out of range.

是什么给出了?

1 个答案:

答案 0 :(得分:2)

这一行似乎是问题所在:

set ARGS=($_)

根据tcsh(1)手册页:

  

$_替换最后执行的命令的命令行。 (+)

“(+)”表示这是一个特定于tcsh的功能(虽然我的Linux系统上的/bin/bsd-csh似乎也支持它。)

快速实验表明如果我输入

source foo.csh

从交互式tcsh提示符,它将$_设置为字符串source foo.csh - 但如果我从csh或tcsh脚本执行相同的命令,则不会。 (如果脚本使用csh运行,$_设置为/usr/bin/tcsh;如果脚本使用tcsh运行,则$_设置为空字符串。)

据我所知,这种不一致的行为未在任何地方记录 - 而csh(1)手册页根本没有提到$_

(这种不一致在使用csh / tcsh时很常见。你会发现Bourne shell sh,以及从它派生的shell,例如kshbashzsh,表现得更加一致。强制性链接:Csh Programming Considered Harmful)。