2012-08-10 34 views
0

我使用的是庫而不是源腳本可以有一個腳本來設置適當的環境變量:中的.cshrc

# 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

此行似乎是這個問題:

set ARGS=($_) 

按照tcsh(1)手冊頁:

$_替補最後一個命令的命令行中執行。 (+)

的「(+)」表示,這是一個特定的tcsh的特徵(雖然/bin/bsd-csh我的Linux系統上出現,以支持它)。

快速實驗表明,如果我從一個交互式的tcsh提示符下鍵入

source foo.csh 

,它設置$_字符串source foo.csh - 但如果我從一個csh或tcsh腳本執行相同的命令,它不「T。 (如果腳本是用csh運行,$_設置爲/usr/bin/tcsh;如果腳本使用tcsh運行,$_設置爲空字符串。)

至於我可以告訴這個不一致的行爲沒有記錄任何地方 - - 而csh(1)手冊頁完全沒有提及$_

(使用csh/tcsh的時候,這種矛盾的是常見的你會發現,Bourne shell的sh,以及它的衍生彈如kshbash,並zsh,表現得更一貫強制性鏈接:。Csh Programming Considered Harmful )。