如何从脚本向新终端发送命令实现可取消的关机倒计时?
解决GNOME Terminal中运行关机倒计时脚本的问题
我来帮你一步步搞定这个问题,你遇到的核心问题有两个:一是GNOME Terminal的-e参数已经被弃用,二是命令行里的引号嵌套和语法错误导致脚本直接执行关机,完全没走倒计时逻辑。
问题原因拆解
- 参数过时:GNOME Terminal早就把
-e标记为废弃参数了,官方明确建议用--来分隔选项和要执行的命令,这就是你移除shutdown后收到警告的原因。 - 语法与变量解析错误:你原来的命令里缺少语句分隔符(分号),而且引号嵌套混乱,导致变量
$secs被当前shell提前解析,循环逻辑直接失效,bash跳过循环直接执行了shutdown now。
解决方案一:修正命令行直接运行
用下面的命令替换你原来的调用,它一次性解决所有问题:
gnome-terminal -- bash -c 'secs=60; while [ $secs -gt 0 ]; do echo -ne "$secs\033[0K\r"; sleep 1; : $((secs--)); done; shutdown now'
关键改进点:
- 用
--替代-e,符合GNOME Terminal的新规范,彻底消除警告 - 给每个独立命令加上分号(比如
sleep 1和: $((secs--))之间),确保bash能正确识别每一步操作 - 用单引号包裹整个bash命令,避免当前shell提前解析变量,让倒计时逻辑在新终端的子shell里正常执行
解决方案二:写成独立脚本(更推荐)
如果这个倒计时功能你会经常用,把逻辑写成独立脚本会更易维护,还能避免引号转义的麻烦:
- 创建一个名为
shutdown_timer.sh的文件,内容如下:
#!/bin/bash secs=60 while [ $secs -gt 0 ]; do echo -ne "$secs\033[0K\r" sleep 1 : $((secs--)) done shutdown now
- 给脚本添加执行权限:
chmod +x shutdown_timer.sh
- 用GNOME Terminal调用这个脚本:
gnome-terminal -- ./shutdown_timer.sh
额外小提示
如果想中途取消关机,你有两种选择:
- 直接在新打开的倒计时终端窗口按
Ctrl+C终止脚本 - 打开任意终端执行
sudo shutdown -c命令取消关机任务
内容的提问来源于stack exchange,提问作者pstnse




