Bash 终止父级时抑制输出

Bash 终止父级时抑制输出,bash,shell,unix,kill,Bash,Shell,Unix,Kill,当目标进程是当前进程的父进程时,如何抑制由kill产生的输出 我使用以下函数退出任何级别的嵌套壳,但保持最后一个壳打开: function surface(){ if [ $SHLVL -gt 1 ]; then target=$(pstree -p $$ | grep -m 2 sh$ | tail -1 | awk '{print $2}') &>/dev/null kill -1 $target &>/dev/null

当目标进程是当前进程的父进程时,如何抑制由
kill
产生的输出

我使用以下函数退出任何级别的嵌套壳,但保持最后一个壳打开:

function surface(){
    if [ $SHLVL -gt 1 ]; then
        target=$(pstree -p $$ | grep -m 2 sh$ | tail -1 | awk '{print $2}') &>/dev/null
        kill -1 $target &>/dev/null
    fi
}
但这仍然会将消息
Hangup:1
打印到终端

kill
之后添加
wait$target
失败,因为
wait
会给出错误:
bash:wait:pid 1234不是此shell的子级

我还尝试使用
disown
,但同样失败,因为目标进程是当前进程的父进程

相关的:


尝试在被杀死的外壳中捕获“退出”1。这将导致它正常退出,而不是异常退出,并且它的父级不会打印任何内容。@MarkPlotnick我在“不要真的把它作为(有用的)选项”中使用它的情况;我事先看得不够远,所以我不想让它在Mehmm身后留下一个
trap
。您可以在每个(bash)shell中放置
shopt-q login|u shell | trap“exit”1
,而不会真正失去任何功能。它将只在非登录shell中安装陷阱。@MarkPlotnick不是我希望的那种解决方案,但如果我找不到更好的解决方案,它会起作用。仅适用于bash,但我使用的另一个shell(fish)无论如何都不会产生不需要的输出。如果我们可以看到您希望终止的shell中运行的命令类型及其父shell的示例,我们可能会提供更多建议。链接问题中的大多数解决方案只有在被终止的进程的父进程知道该进程可能被终止,或者在后台运行该进程,并且执行
拒绝
。请在被终止的shell中尝试
陷阱“exit”1
。这将导致它正常退出,而不是异常退出,并且它的父级不会打印任何内容。@MarkPlotnick我在“不要真的把它作为(有用的)选项”中使用它的情况;我事先看得不够远,所以我不想让它在Mehmm身后留下一个
trap
。您可以在每个(bash)shell中放置
shopt-q login|u shell | trap“exit”1
,而不会真正失去任何功能。它将只在非登录shell中安装陷阱。@MarkPlotnick不是我希望的那种解决方案,但如果我找不到更好的解决方案,它会起作用。仅适用于bash,但我使用的另一个shell(fish)无论如何都不会产生不需要的输出。如果我们可以看到您希望终止的shell中运行的命令类型及其父shell的示例,我们可能会提供更多建议。链接问题中的大多数解决方案只有在被终止的进程的父进程知道该进程可能被终止,或者在后台运行该进程并执行拒绝操作时才有效。