我正在使用的库有一个脚本来设置适当的环境变量:
# 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.
是什么给出了?
答案 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,例如ksh
,bash
和zsh
,表现得更加一致。强制性链接:Csh Programming Considered Harmful)。