2011-11-17 60 views
1

我创建了一个tcsh外壳脚本如下:这是为什么tcsh外壳脚本给错误而设置PATH LD_LIBRARY_PATH

#!/bin/tcsh 

setenv PATH "" 
setenv PATH .:$HOME/bin:/usr/sbin:/usr/bin:/bin:/usr/X11R6/bin:/usr/local/cuda/bin:/usr/local/bin:/usr/bin:$PATH 

setenv LD_LIBRARY_PATH "" 
setenv LD_LIBRARY_PATH .:/usr/local/cuda/lib:/usr/local/cuda/lib64/:/usr/local/cuda:/usr/lib:/usr/lib32:/usr/local/cuda/bin:/usr/local/lib/:${LD_LIBRARY_PATH} 

然后我做了这个脚本可执行文件,当我尝试执行它作为

./script.sh,它提供了以下错误:

script.sh:3:SETENV:找不到

script.sh:4:SETENV:找不到

script.sh:6:SETENV:找不到

script.sh:7:SETENV:找不到

任何指针,如何设置我的shell脚本这些路径?

+0

作品在我的盒子上找到。你的'tcsh'真的是它自称的吗? '/ bin/tcsh --version'? –

+0

@Shawn -/bin/tchs --version给出:tcsh 6.17.02(Astron)2010-05-12(x86_64-unknown-linux)options wide,nls,dl,al,kan,rh,nd,color,filec – goldenmean

+0

有一个答案发布到这个问题,但它现在被删除(我不知道为什么),它链接到http://www.the4cs.com/~corin/acm/tutorial/unix/tcsh-help.html。这给了我另一个问题 - 如果我使用setenv PATH在我的.cshrc中设置了一个环境变量$ PATH。:<我的文件夹在这里>然后就像我在这个shell脚本中所做的那样,我使用set PATH = ,这会优先考虑环境变量还是SHELL变量?两者之间有什么区别,如果有的话? – goldenmean

回答

4

我没有得到我的系统上同样的错误。

更新:请参阅最后两段,我最好猜测发生了什么事情。

我最初的最好的猜测是,你可以通过改变家当

#!/bin/tcsh 

#!/bin/tcsh -f 

(或者使用

#!/bin/csh -f 

是TCSH增加了该功能解决问题原始的csh主要用于交互式使用而不是脚本。)

-f选项告诉tcsh的处理您的.login.cshrc.tcshrc文件在启动时。通常你不希望脚本做到这一点;它使脚本的行为取决于您自己的环境设置。也许你的.login中有一些东西与setenv有些奇怪,但我想不出它会是什么。尝试添加-f,看看是否有帮助。即使没有,你也应该这样做。

(不要使用-f/bin/sh/bin/bash脚本,这意味着别的东西,而不是必要的。)

其他一些意见:

设置$PATH$LD_LIBRARY_PATH为空字符串无用。只要删除这两行。

编辑:

在重新阅读你的问题,我看到你在那里干什么。您可以设置$PATH为空字符串,然后在前面加上更多的文字吧:

setenv PATH "" 
setenv PATH this:that:$PATH 

这使得比我想象的那样更有意义,但它仍然是简单写一个命令:

setenv PATH this:that 

.在你的$PATH,特别是一开始,是一个坏主意。想想看,如果你在一个目录中运行了脚本,而这个目录中有人存放了一个令人讨厌的命令名ls。如果要在当前目录中执行命令,请使用./command。 (在年底$PATH是安全的把.,但仍然不是一个很好的主意。)

(而用tcsh或CSH作为脚本语言(而不是一个交互式shell)被广泛认为是一个不好意思,This article,即使它不说服你放弃tcsh脚本,至少会让你意识到陷阱。)

哦,如果它是一个tcsh脚本,你为什么打电话它script.sh?在类Unix系统下不需要文件名后缀(与Windows不同),但后缀通常为.sh,这意味着它是Bourne shell脚本。称它为script.tcshscript.csh,或只是script

编辑:

以在您收到此错误信息仔细一看,它看起来像错误是从/bin/sh到来,不是从tcsh的

在我的系统,当我改变setenvSetenv(一个不存在的命令),运行与tcsh的剧本给我:

Setenv: Command not found. 
Setenv: Command not found. 
Setenv: Command not found. 
Setenv: Command not found. 

不匹配的错误信息,你向我们展示。当我明确地运行它/bin/sh foo.tcsh(独自一人出走setenv命令),我得到:

foo.tcsh: 3: setenv: not found 
foo.tcsh: 4: setenv: not found 
foo.tcsh: 6: setenv: not found 
foo.tcsh: 7: setenv: not found 

已经匹配你得到了错误的格式。

你说/bin/tcsh --version给出正确的结果,所以这不是问题。不知何故脚本正在执行/bin/sh,而不是tcsh。

这是我最好的猜测。您正在运行Cygwin,或者MSYS,但是您从cmd外壳调用脚本,而不是从Cygwin外壳调用脚本。您的Windows系统已被配置为识别.sh后缀,以指示该文件是由C:\cygwin\bin\sh.exe执行的脚本(正如我之前提到的,文件后缀在Unix或Cygwin环境中通常不重要,但它们在视窗)。

最简单的解决方案可能是重写脚本以符合Bourne shell语法。但是应该有办法让Windows调用Cygwin的tcsh来执行它。如果我猜对了,让我们知道,我们可以想出一个解决方案。

2

我没有看到你的脚本有什么问题。它在我的盒子上正常工作。

该错误(我能想到的)的唯一原因是tcsh以某种方式不被用作解释器。

如果我在#!/bin/tcsh之前添加换行符,我可以重现该错误。当shebang不是文件中的第一个字符时,解释器指令不起作用,并且使用当前的shell(我猜你的sheel不是c-shell变体(csh或tcsh)?)。

因此,检查#!/bin/tcsh确实是文件中的第一行,之前没有空白。


要确定实际使用哪个解释器,你可以添加以下到您的脚本:

echo "$shell" ## prints shell name if tcsh or csh 
echo "$BASH" ## prints /bin/bash if bash 

例如:

[[email protected]]$ bash x.sh # run using bash 

/bin/bash 

[[email protected]]$ tcsh x.sh # run using tcsh 
/bin/tcsh 
BASH: Undefined variable. 
+0

我查过,#!是脚本文件的第一行。请检查我上面的最新评论。你有任何基于评论 – goldenmean

+0

信息/问题的指针我仍然认为tcsh没有被你的脚本使用。如果使用'/ bin/tcsh script.sh'运行它,它是否按预期工作? –

1

刚刚碰到这个问题,原来这是由于脚本文件有Windows EOL。一旦我把它清理干净,一切都很好。

相关问题