我目前正在做一个大学项目,我必须做几个shell脚本文件。在其中一个例子中,我必须创建一个名为taunt.sh
的文件,它使用命令cowsay
来根据一些操作打印一些消息:
1.如果10秒后没有收到消息,那么taunt.sh
脚本应该发出一条有趣的消息并结束/退出。
1.如果它接收到SIGHUP
信号,那么它应该发出一条特殊消息并退出。
1.如果它收到SIGINT
或SIGTERM
,那么它应该发出嘲讽并终止/退出。
问题是,我需要使用#!/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
很陌生,但我仍然需要一段时间来理解一些东西。所以我希望有人能帮我。
1条答案
按热度按时间dtcbnfnu1#
这里是bash的
read -t 10
的POSIX
版本: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