tcsh异常行为:为何exit语句在此场景下被忽略?
tcsh中
-c执行脚本时exit未终止进程是否为预期行为? 我遇到了一个tcsh的行为疑问:
当使用/usr/bin/tcsh -c执行包含exit的if结构脚本时,exit之后的命令仍然被执行了,具体操作如下:
[jlong1s@testlogin01 ~]$ /usr/bin/tcsh -c 'if ( 1 ) then \ ? echo in if construct \ ? exit 1 \ ? echo still in if construct . . . wow \ ? endif \ ? ' in if construct still in if construct . . . wow
我认为第二条echo命令不应该被执行。但在交互式tcsh中执行相同逻辑时,exit会正常触发登出,符合预期:
[jlong1s@testlogin01 ~]$ if ( 1 ) then [jlong1s@testlogin01 ~]$ echo in if construct in if construct [jlong1s@testlogin01 ~]$ exit logout
这不是预期行为。正常情况下,tcsh中的exit命令无论在控制结构(如if)内还是外,都会立即终止当前shell进程,后续命令不会被执行。
你的情况大概率是脚本写法导致的解析异常:使用反斜杠转义换行时,tcsh可能没有正确识别exit作为独立命令,或者你的tcsh版本存在bug。正确的脚本写法应该在每个命令后添加分号分隔,确保命令被正确解析,比如:
/usr/bin/tcsh -c 'if ( 1 ) then; echo in if construct; exit 1; echo still in if construct . . . wow; endif'
执行上述修正后的命令,exit会正常终止进程,第二条echo不会被执行。
交互式模式下exit正常登出是符合预期的,因为该模式下exit的核心作用就是终止当前会话;脚本模式下exit的行为应该保持一致,即终止当前shell进程。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

