5

csh是一个非常可怕的外壳。(提前声明以避免“不要使用 csh”的不可避免的评论,或者我应该为了任何读者而声明:如果你重视你的理智,请不要使用csh。)我有一个csh我试图使其有用的相当大的脚本集合,我刚刚发现exit从源文件调用时不会退出脚本。换句话说:

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

产生输出。

有没有办法修改这种行为?据我所知,我正在修改的脚本的原始作者打算终止主脚本,这当然是可取的行为,并且只需通过调用上面的示例即可sh产生该结果,但是给出了什么?这种行为有任何合理的目的吗?(这只是我在咆哮,真正的问题是:是否可以选择 csh 来改变行为?)

4

6 回答 6

5

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

于 2014-05-06T17:42:02.437 回答
1

我认为这与问题的原始上下文无关,但是如果exit用于关闭登录脚本并因此注销用户,则可以只使用logout而不是exit.

于 2013-04-12T16:34:11.343 回答
1

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

“csh 是一个非常可怕的外壳。”

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

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

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

如果你定义一个别名来获取一个文件,你可以把一些相当通用的多功能脚本放在一起:

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

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

于 2016-01-19T18:00:45.723 回答
0

我对csh不太了解,我主要使用“bash”,而且我想很久以前在很远的地方我可能会使用“ksh:在Sun“pizza”boxen上。在闲逛了一下之后,我注意到一些 csh 行为更改开关,但是如果您尝试这样的操作会怎样:

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.

我从这里得到这个

于 2012-11-26T18:41:30.690 回答
0

您可以使用别名 exit 来设置一些值,然后检查它:

$ 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

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

于 2013-02-18T13:27:25.810 回答
0

未设置终止

unsetenv 终止

回声“$TERMINATE”

于 2021-11-03T09:54:51.803 回答