【发布时间】:2018-11-20 11:06:21
【问题描述】:
## bash script
foo(){
sleep 0.0001
read -s -t 0.0002 var ## get the pipeline input if have
if [ -n "$var" ];then
echo "has pipe input"
fi
if [ $# -gt 0 ];then
echo "has std input"
fi
read -s -t 30 var1 #1 # expect wait for 30 seconds , but acturaly not
echo "failed"
read -s -t 30 var2 #2
echo "failed again"
}
echo "ok1"| foo "ok"
## output:
has pipe input
has std input
failed
failed again
如果 foo 有管道输入,则 #1 & #2 处的读取命令将立即返回,无需等待输入 TIMEOUT
在我的真实脚本中有三个需求:
1 个制作函数可以同时接受管道输入和参数(因为我希望我的函数可以从管道输入中获取配置,我认为这对我来说会很好。例如:)
foo(){
local config
sleep 0.0001
read -t 0.0002 config
eval "$config"
}
then i can pass configuration like this
foo para1 para2 <<EOF
G_TIMEOUT=300
G_ROW_SPACE=2
G_LINE_NUM=10
EOF
2 在我的函数中,我需要从键盘读取用户输入(我需要使用 read 与用户交互)
3 等待用户输入应该有一个超时(我想实现一个屏幕保护程序,如果从用户传递的 TIMEOUT 秒后没有任何操作,将调用屏幕保护程序脚本,并且在任何按键后,屏幕保护程序将返回,并再次等待用于输入
如果有办法在我获得管道输入后将管道输入重定向到 fd3,然后关闭 fd3 使管道断开,然后将 fd0 重新打开到标准输入(键盘)并等待用户输入?
【问题讨论】:
-
您为什么认为这是不正确的?您期望的行为是什么?您很可能误解了 read 的
-t标志的含义。另请注意,read 将从标准输入而非参数中读取。 -
实际上我的脚本需要 1 个函数可以同时接受管道输入和标准输入 2 在我的函数中我需要等待用户输入 3 等待用户输入超时
-
那么你期待什么?
-
我期望函数可以对变量进行管道输入,然后使用 read 获取用户键盘输入