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

POSIX Shell中替代bash 'read -t'功能的实现方案求助

解决POSIX sh中实现超时read及信号处理的问题

以下是完全符合#!/bin/sh标准的taunt.sh脚本,同时满足你所有的需求:

#!/bin/sh

# 处理SIGHUP信号的函数
handle_sighup() {
    cowsay "收到SIGHUP信号,我先撤了!"
    exit 1
}

# 处理SIGINT/SIGTERM信号的函数
handle_interrupt() {
    cowsay "切,就这点本事?有本事再来啊!"
    exit 1
}

# 绑定信号到对应处理函数
trap handle_sighup SIGHUP
trap handle_interrupt SIGINT SIGTERM

# 用timeout实现10秒超时等待输入
timeout 10 sh -c 'read -r input'
exit_status=$?

# 判断是否超时(timeout命令超时会返回124)
if [ "$exit_status" -eq 124 ]; then
    cowsay "喂?人呢?10秒都没动静,我先走啦!"
    exit 0
fi

关键部分说明

  • 信号处理:通过trap命令将指定信号绑定到自定义函数,当脚本收到SIGHUP、SIGINT(Ctrl+C触发)或SIGTERM时,会执行对应函数输出消息后退出。
  • 超时实现:POSIX标准的sh没有read -t选项,因此使用timeout命令限制read的执行时间。如果10秒内无输入,timeout会终止read进程并返回退出码124,脚本通过判断该码值触发超时消息。
  • 兼容性:全程使用POSIX兼容语法,没有依赖bash特有的功能,完全符合#!/bin/sh的要求。

测试方式

  1. 直接运行脚本,10秒不输入任何内容,会自动输出超时趣味消息并退出
  2. 按下Ctrl+C(发送SIGINT),会输出嘲讽消息
  3. 另开终端执行kill -HUP <脚本PID>,会输出SIGHUP对应的特殊消息
  4. 执行kill <脚本PID>(发送SIGTERM),会输出嘲讽消息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:00:07