Shell 退出csh外壳程序不要立即中止执行

Shell 退出csh外壳程序不要立即中止执行,shell,posix,csh,tcsh,Shell,Posix,Csh,Tcsh,(t)csh的手册中说: 出口[出口] shell以指定expr(表达式,如表达式中所述)的值退出,或者, 不带expr,值为0 但如果运行tcsh-c'退出5;退出后回声';echo$?,我们得到以下输出(在ubuntu/centos和freebsd 10.3的tcsh上进行测试): 似乎跳过了exit命令。如何获得与POSIX/bash shell相同的操作?在POSIX shell中,您想做什么?如果要打印某些内容并正常退出,只需执行printf“%s\n”'我的消息';退出0。(有关不使

(t)csh的手册中说:

出口[出口] shell以指定expr(表达式,如表达式中所述)的值退出,或者, 不带expr,值为0

但如果运行
tcsh-c'退出5;退出后回声';echo$?
,我们得到以下输出(在ubuntu/centos和freebsd 10.3的tcsh上进行测试):


似乎跳过了
exit
命令。如何获得与POSIX/bash shell相同的操作?

在POSIX shell中,您想做什么?如果要打印某些内容并正常退出,只需执行
printf“%s\n”'我的消息';退出0
。(有关不使用echo的原因,请参阅)

这可能是
csh
中的一个bug,出于向后兼容的原因,它被保存在
tcsh

(t)csh
以一种其他shell没有的方式面向行,通常一次处理一行输入

此脚本:

#!/bin/tcsh -f
exit 5
echo 'after exit'
执行时退出,状态为5

另一方面,此脚本在退出后打印

#!/bin/tcsh -f
exit 5; echo 'after exit'
更令人惊讶的是,包含传递给
/bin/tcsh
的换行符的字符串被视为单行脚本,而不是多行脚本

% perl -e 'system("/bin/tcsh -f -c \"exit 5\necho after\"")'

我发现添加一个
eval
将导致退出按预期工作(
csh-c'eval exit 5;退出后回显';echo$?
)。但是仍然很难理解csh脚本。csh是一个手工编写的解析器,而不是机器生成的解析器,它以令人惊讶和意外的方式运行而闻名。你不使用POSIX兼容的shell有什么原因吗?我正在运行一些bsd机器,并编写一些csh shell代码。
模式需要按照脚本运行| |退出0;下面的脚本
非常常见,但总是运行下面的脚本
,这真是令人惊讶。BSD机器具有与POSIX兼容的shell。是的,这是令人惊讶的,但csh充满了惊喜。我不能说。几十年前,严肃的人离开了csh(参见等)。当没有其他好的选择时(ksh要花钱,Bourne对交互使用不友好),它很受欢迎,但那是很久以前的事了;“退出”后的printf这将按预期工作,但
csh-c“退出5”;退出后打印“
退出后打印
,然后退出0?
% perl -e 'system("/bin/tcsh -f -c \"exit 5\necho after\"")'