如何在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
相关产品推荐
相关产品推荐

