You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从脚本向新终端发送命令实现可取消的关机倒计时?

解决GNOME Terminal中运行关机倒计时脚本的问题

我来帮你一步步搞定这个问题,你遇到的核心问题有两个:一是GNOME Terminal的-e参数已经被弃用,二是命令行里的引号嵌套和语法错误导致脚本直接执行关机,完全没走倒计时逻辑。

问题原因拆解

  1. 参数过时:GNOME Terminal早就把-e标记为废弃参数了,官方明确建议用--来分隔选项和要执行的命令,这就是你移除shutdown后收到警告的原因。
  2. 语法与变量解析错误:你原来的命令里缺少语句分隔符(分号),而且引号嵌套混乱,导致变量$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里正常执行

解决方案二:写成独立脚本(更推荐)

如果这个倒计时功能你会经常用,把逻辑写成独立脚本会更易维护,还能避免引号转义的麻烦:

  1. 创建一个名为shutdown_timer.sh的文件,内容如下:
#!/bin/bash
secs=60
while [ $secs -gt 0 ]; do
    echo -ne "$secs\033[0K\r"
    sleep 1
    : $((secs--))
done
shutdown now
  1. 给脚本添加执行权限:
chmod +x shutdown_timer.sh
  1. 用GNOME Terminal调用这个脚本:
gnome-terminal -- ./shutdown_timer.sh

额外小提示

如果想中途取消关机,你有两种选择:

  • 直接在新打开的倒计时终端窗口按Ctrl+C终止脚本
  • 打开任意终端执行sudo shutdown -c命令取消关机任务

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

火山引擎 最新活动