在函数/管道语句中提示用户输入语句 - Bash

时间:2015-07-22 06:51:42

标签: bash if-statement pipe

在bash中调用函数时是否可以提示用户输入?

以此为例:

#!/bin/bash
test1(){

echo "Do you wish to install this program?"
select yn in "Yes" "No"; do
    case $yn in
        Yes ) make install; break;;
        No ) exit;;
    esac
done

}

pip list 2>/dev/null | if grep httplib2; then echo 2>/dev/null; else test1; fi

忽略我正在检查httplib2的事实,因为我知道如果你回应“测试”,它可以正常工作。我用stackoverflow和tldp的例子试过这个,所以我现在有点困惑。

您是否可以从管道if语句中捕获用户输入?

刚刚用

测试
pip list 2>/dev/null | if grep httplib2; then 
echo 2>/dev/null; 
else
echo "Type the year that you want to check (4 digits), followed by [ENTER]:"
read year
echo $year
fi

也有同样的效果。

1 个答案:

答案 0 :(得分:1)

如果test1在管道中,但您需要终端输入,请使用:

test1 </dev/tty

例如:

pip list 2>/dev/null | if grep httplib2; then echo 2>/dev/null; else test1 </dev/tty; fi

test1从stdin获取输入。如果你想与它进行交互,它的标准输入必须来自终端/dev/tty,而不是来自管道。

另一种方法是在管道启动之前捕获stdin的句柄。例如:

exec 3<&0; echo http | test1 <&3; exec 3<&-

或者,

exec 3<&0
pip list 2>/dev/null | if grep httplib2; then echo 2>/dev/null; else test1 <&3; fi
exec 3<&-