提问人:William Pursell 提问时间:11/27/2012 最后编辑:CharlesWilliam Pursell 更新时间:11/3/2021 访问量:4355
如何在 csh 中“来源”时使退出行为
How to make exit behave when "sourced" in csh
问:
csh
是一个完全可怕的外壳。(提前声明以避免不可避免的“不要使用 csh”的评论,或者为了任何读者,也许我应该声明这一点:如果您重视自己的理智,请不要使用 。我有一个相当大的脚本集合,我试图使它们变得有用,我刚刚发现当从源文件调用时,它不会退出脚本。换言之:csh
csh
exit
#!/bin/csh
source [file with content "exit"]
echo No reasonable script should print this
产生输出。
有什么方法可以修改该行为吗?据我所知,我正在修改的脚本的原始作者打算终止主脚本,这当然是可取的行为,并且简单地调用上面的示例会产生该结果,但是什么原因呢?这种行为有什么合理的目的吗?(这只是我在咆哮,真正的问题是:是否有 csh 的选项来改变行为?sh
答:
我不声称对 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.
我是从这里得到的
您可以别名退出以设置某个值,然后检查它:
$ 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
与直接更改脚本相比,这将有一些惩罚,但您不再需要为原始脚本而烦恼。
我认为这与问题的原始上下文无关,但是如果用于关闭登录脚本,从而注销用户,则可以使用代替.exit
logout
exit
要退出源脚本和 csh/tcsh 中的父解释器,我使用 或 ,具体取决于我希望传递回父进程的成功条件。采购 shell 以适当的返回值退出。exec /bin/false
exec /bin/true
我称之为“csh bashing”的流行社区运动:
“CSH是一个完全可怕的外壳。”
也许吧,但 tcsh 是一个非常易于使用、易于编码、轻量级且稳定的 shell,几乎随处可用,具有相当统一的功能。尽管如此,它确实有一些令人沮丧的怪癖,直到你学会绕过它们。拥有一台漂亮的打印机来处理长脚本会有所帮助。
“源文件 [argv]”功能是最接近 tcsh 中子例程的功能,并且由于它与调用者共享相同的命名空间,因此 exit 命令在该上下文中更像 'return' 语句是完全合理的。请注意,exit 语句会暂停源文件中的处理,并通过 $status返回一个值。
源 tcsh 文件还允许调用方发布单独的$argv而不会丢失原始文件,在这种情况下,调用方的$argv对源文件可见。如果源文件写入$argv,则也会为调用方修改它。
如果定义一个源文件的别名,则可以将一些相当通用的多功能脚本组合在一起:
别名 func 'set srcf=“test.tcsf” ;设置 args=(!*) ;来源 $srcf $args'
但是,如果有多个源文件在播放,则需要采用一些命名空间管理约定,以确保它们不会相互踩踏。归根结底,tcsh 在这么多年后仍在使用是有原因的,主要是因为一旦你了解了怪癖,它就可以快速且易于使用。
评论
取消设置 TERMINATE
unsetenv 终止
回声“$TERMINATE”
评论