POSIX shell中bash 'read -t'的替代方案

gt0wga4j  于 2023-05-18  发布在  Shell
关注(0)|答案(1)|浏览(121)

我目前正在做一个大学项目,我必须做几个shell脚本文件。在其中一个例子中,我必须创建一个名为taunt.sh的文件,它使用命令cowsay来根据一些操作打印一些消息:
1.如果10秒后没有收到消息,那么taunt.sh脚本应该发出一条有趣的消息并结束/退出。
1.如果它接收到SIGHUP信号,那么它应该发出一条特殊消息并退出。
1.如果它收到SIGINTSIGTERM,那么它应该发出嘲讽并终止/退出。
问题是,我需要使用#!/bin/sh,而不是#!/bin/bash
我知道在bash中,我们可以使用read -t 10 input等待10秒,而接收到输入后,我们可以退出等待过程。
但这不是sh中的选项。
那么,是否有一种方法可以在sh中实现一些类似的功能呢?
我试过这个

#!/bin/sh

echo "Enter your input:"
sleep 10 &
read input
kill $! 2>/dev/null

if [ -z "$input" ]; then
  echo "No input provided"
else
  echo "You entered: $input"
fi

但10秒钟后它就没有出来,只有当我打了一些东西。
我对sh很陌生,但我仍然需要一段时间来理解一些东西。所以我希望有人能帮我。

dtcbnfnu

dtcbnfnu1#

这里是bash的read -t 10POSIX版本:

#!/usr/bin/env sh

timeout=10
mystty="$(stty -g)"
trap 'stty "$mystty"' EXIT   
stty -icanon min 0 time $((timeout*10))

echo "Enter your input "
read input

if [ -z "$input" ]; then
  echo "No input provided"
else
  echo "You entered: $input"
fi
  • mystty="$(stty -g)"stty设置保存在变量中
  • trap 'stty "$mystty"' EXIT:此行设置EXIT ¹信号的陷波。在这种情况下,当脚本退出时,它将在任何情况下(ctrl+c或任何退出情况下)为以下终端修改恢复这些设置:
  • stty -icanon min 0 time 100:此行使用stty命令修改终端设置。-icanon标志禁用规范模式,这意味着输入被立即处理,而无需等待换行符。min 0设置意味着终端在返回输入之前不会等待输入任何字符。time 100将读取输入的超时设置为100分秒(10秒)。在此模式下,如果在指定的超时时间内没有接收到输入,则读取操作将立即返回。

¹ POSIX trap exit

相关问题