You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在dialog脚本中实现Shell登出?

问题描述

尝试用logout、exit、TMOUT实现Shell登出时遇到以下问题:

  • 使用logout时,提示:logout: not login shell: use 'exit'
  • 使用exit时,仅退出dialog,无法退出Shell
  • 设置TMOUT=1后,参数值未发生变化

请问能否在dialog脚本中实现Shell登出?

#!/bin/bash

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
OPTIONS=(1 "Logout")

CHOICE=$(dialog --clear \
                --backtitle "back" \
                --title "title" \
                --menu "menu" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

clear
case $CHOICE in
        1)
            logout
            TMOUT=1
            exit
            ;;
esac

编辑1:后续无效尝试

# menu.sh
case $CHOICE in
        1)
            exit 99
            ;;
esac
#!/bin/bash
./menu.sh
if [ $? -eq 99 ]
then
    logout
fi

解决方案

核心原因

你的脚本默认在子Shell中运行,所以exit只会退出子Shell,logout因当前不是登录Shell报错,TMOUT的设置也仅在子Shell生效,无法影响父Shell。

可行实现方式

要让脚本能退出父Shell,必须让脚本在当前Shell环境中运行,而非子Shell。有两种常用方法:

方法1:用source或.执行脚本

将脚本保存为logout_menu.sh,用以下方式执行(让脚本在当前Shell环境运行):

source logout_menu.sh
# 或简写为
. logout_menu.sh

同时修改脚本的退出逻辑,直接用exit即可(此时exit会直接退出当前Shell):

#!/bin/bash

HEIGHT=15
WIDTH=40
CHOICE_HEIGHT=4
OPTIONS=(1 "Logout")

CHOICE=$(dialog --clear \
                --backtitle "back" \
                --title "title" \
                --menu "menu" \
                $HEIGHT $WIDTH $CHOICE_HEIGHT \
                "${OPTIONS[@]}" \
                2>&1 >/dev/tty)

clear
case $CHOICE in
        1)
            exit
            ;;
esac

方法2:强制终止父Shell进程(慎用)

如果必须以子Shell方式执行脚本,可以通过kill命令终止父Shell进程。修改脚本的退出分支:

case $CHOICE in
        1)
            # 终止父Shell进程,$PPID为当前脚本的父进程ID
            kill -9 $PPID
            ;;
esac

注意:这种方式会强制终止父Shell,可能导致未保存的进程直接中断,需谨慎使用。

补充说明

  • logout仅能在登录Shell中使用,子Shell不属于登录Shell范畴,因此会报错。
  • TMOUT是Shell环境变量,子Shell的变量修改无法传递到父Shell,除非在当前环境运行脚本并通过export声明。

内容的提问来源于stack exchange,提问作者CL So

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 15:48:30