0

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

# 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.

是什么赋予了?

4

1 回答 1

2

这条线似乎是问题所在:

set ARGS=($_)

根据tcsh(1)手册页:

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

“(+)”表示这是 tcsh 特有的功能(尽管/bin/bsd-csh在我的 Linux 系统上似乎也支持它)。

一个快速的实验表明,如果我输入

source foo.csh

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

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

(这种不一致在使用 csh/tcsh 时很常见。您会发现 Bourne shellsh以及从它派生的 shell(例如kshbashzsh)的行为更加一致。必选链接:Csh Programming Considered Harmful)。

于 2015-08-31T16:17:27.810 回答