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

How to make exit behave when "sourced" in csh

提问人:William Pursell 提问时间:11/27/2012 最后编辑:CharlesWilliam Pursell 更新时间:11/3/2021 访问量:4355

问:

csh是一个完全可怕的外壳。(提前声明以避免不可避免的“不要使用 csh”的评论,或者为了任何读者,也许我应该声明这一点:如果您重视自己的理智,请不要使用 。我有一个相当大的脚本集合,我试图使它们变得有用,我刚刚发现当从源文件调用时,它不会退出脚本。换言之:cshcshexit

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

产生输出。

有什么方法可以修改该行为吗?据我所知,我正在修改的脚本的原始作者打算终止主脚本,这当然是可取的行为,并且简单地调用上面的示例会产生该结果,但是什么原因呢?这种行为有什么合理的目的吗?(这只是我在咆哮,真正的问题是:是否有 csh 的选项来改变行为?sh

es。

评论


答:

0赞 happy coder 11/27/2012 #1

我不声称对 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.

我是从这里得到的

0赞 estani 2/18/2013 #2

您可以别名退出以设置某个值,然后检查它:

$ 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

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

1赞 chrishiestand 4/13/2013 #3

我认为这与问题的原始上下文无关,但是如果用于关闭登录脚本,从而注销用户,则可以使用代替.exitlogoutexit

7赞 Andrew Domaszek 5/7/2014 #4

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

1赞 Randy James 1/20/2016 #5

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

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

也许吧,但 tcsh 是一个非常易于使用、易于编码、轻量级且稳定的 shell,几乎随处可用,具有相当统一的功能。尽管如此,它确实有一些令人沮丧的怪癖,直到你学会绕过它们。拥有一台漂亮的打印机来处理长脚本会有所帮助。

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

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

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

别名 func 'set srcf=“test.tcsf” ;设置 args=(!*) ;来源 $srcf $args'

但是,如果有多个源文件在播放,则需要采用一些命名空间管理约定,以确保它们不会相互踩踏。归根结底,tcsh 在这么多年后仍在使用是有原因的,主要是因为一旦你了解了怪癖,它就可以快速且易于使用。

评论

1赞 Larry 8/6/2019
我在一个经常使用tcsh的环境中工作,这个答案中显示的“成语”。我绝对可以否认它仍在使用的原因是它的多功能性和易用性。它很容易被误用,严重缺乏通用的 shell 功能,它可能是世界上最不一致的语言。它之所以仍然被使用,是因为它是世界上最成功的专有 unices 之一 Sun OS 的默认 shell,而 C Shell 使得重构基于它构建的任何环境都非常困难。也因为公司不喜欢在重构上花钱。
0赞 Lakmal Dissanayaka 11/3/2021 #6

取消设置 TERMINATE

unsetenv 终止

回声“$TERMINATE”

评论

2赞 Community 11/3/2021
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。