如何在csh中“sourced”时使退出行为

时间:2012-11-26 18:22:15

标签: csh

csh是一个完全可怕的外壳。 (事先说出这句话是为了避免“不要使用csh”的不可避免的评论,或者我应该只是为了任何读者而说:请,如果你重视你的理智,请不要使用csh 。)我有一个相当大的csh脚本集合,我试图使它变得有用,我发现exit在从源文件调用时不会退出脚本。换句话说:

#!/bin/csh
source [file with content "exit"]
echo No reasonable script should print this

产生输出。

有没有办法修改这种行为?据我所知,我正在修改的脚本的原始作者希望终止主脚本,这肯定是理想的行为,只需通过sh调用上面的例子就会产生结果,但是?这种行为有合理的目的吗? (这只是我的咆哮,真正的问题是:是否有一个选项来改变行为?)

5 个答案:

答案 0 :(得分:4)

要退出csh / tcsh中的源脚本和父解释器,我使用exec /bin/falseexec /bin/true,具体取决于我想要传递回父进程的成功条件。采购外壳以适当的返回值退出。

答案 1 :(得分:1)

我不认为这与问题的原始上下文有关,但如果使用exit关闭登录脚本,从而注销用户,则可以使用logout代替exit

答案 2 :(得分:1)

我称之为'csh bashing'的流行社区运动:

“csh是一个完全可怕的外壳。”

也许,但tcsh是一个非常易于使用,易于编码,轻巧和稳定的外壳,几乎可以在任何地方使用相当统一的功能。虽然它确实有一些令人沮丧的怪癖,直到你学会绕过它们。对于长脚本来说,它有一个漂亮的打印机。

“源文件[argv]”功能是与tcsh中子程序最接近的功能,由于它与调用者共享相同的命名空间,因此退出命令更像是“返回”语句,这是完全合理的。上下文。请注意,exit语句会暂停源文件中的处理,并通过$ status返回一个值。

源代码tcsh文件还允许调用者发布单独的$ argv而不会丢失原始文件,在这种情况下,调用者的$ argv对源文件是可见的。如果源文件写入$ argv,则也会为调用者修改它。

如果您定义了一个源文件的别名,您可以将一些相当通用的多功能脚本放在一起:

alias func'set srcf =“test.tcsf”; set args =(!*); source $ srcf $ args'

但是,如果您正在使用多个源文件,则需要采用一些命名空间管理约定,以确保它们不会互相踩踏。最重要的是,有了这些年来tcsh仍然在使用的原因,主要是一旦你理解了怪癖,它就会快速而简单地使用。

答案 3 :(得分:0)

我没有声称对csh有太多了解,我主要使用“bash”,而且我想很久以前在遥远的地方我可能会使用“ksh:on sun”pizza“boxen。”一点,我注意到一些csh behvior更改开关,但是如果你尝试过这样的话会怎么样:

exit [expr]
The shell exits either with the value of the specified expr (an expression, as 
described   under Expressions) or, without expr, with the value of the status variable.

我是从here

得到的

答案 4 :(得分:0)

您可以使用别名来设置某个值,然后检查它:

$ cat a.csh
#!/bin/csh
alias exit 'set abort=1; ""exit'
...
exit

在采购文件时:

$ cat b.csh
#!/bin/csh
source a.csh
if ( $?abort ) exit

附录:

我忘了说你可能会动态更改源代码:

$ cat b.csh
#!/bin/csh
source `sed '2 i alias exit '"'set abort=1; "'""exit'"'" a.csh`
if ( $?abort ) exit

与直接更改脚本相比,这会有一些损失,但您不再需要为原始脚本而烦恼。