如何查看在 newgrp 中调用的命令的状态?

How to see status of a command called in newgrp?

我有一个 csh 脚本,它的 运行 部分需要使用 newgrp。为此,它递归调用自己。

#!/bin/csh
if (  == "" ) then
    newgrp << ENDGRP
    ./newgrp_test.csh 2
    if ( $status != 0 ) then
        echo "Second run fail"
        exit 1
    else
        echo "Second run success"
        exit 0
    endif
ENDGRP
    if ( $status != 0) then
        echo "Exiting failure"
        exit 1
    else
        echo "Exiting success"
        exit 0
    endif
endif

if (  == "2" ) then
    exit 1
endif

问题是我认为它应该保证失败,但我得到了成功的输出。我的输出如下所示:

Second run success
Exiting success

为什么我无法读取 newgrp 中脚本的状态?

请注意,我已经通过删除 newgrp 和 ENDGRP 之间的 if 块找到了解决方法,但我仍然很好奇。

变量 $status 被此处文档中的外部 shell 扩展。因此,当 newgrp-spawned shell 运行时,它看到的是 if ( 0 != 0 ) then 而不是 if ( $status != 0 ) then (因为 if 或其他 was successful immediately before thenewgrp` 命令).

您要么需要转义此处文档中的 $

if ( $status != 0 ) then

或引用此处文档单词的一部分以防止扩展完全发生:

    newgrp << 'ENDGRP'
    ./newgrp_test.csh 2
    if ( $status != 0 ) then
        echo "Second run fail"
        exit 1
    else
        echo "Second run success"
        exit 0
    endif
'ENDGRP'