使用标准输入的交互式外壳

时间:2019-01-28 06:13:08

标签: pipe sh posix

我想启动一个Shell脚本,它通过管道在内部具有交互部分。

例如,

cat hoge.sh | sh

和hoge.sh

#!/bin/sh
read yn
echo "yn is $yn"

在这种情况下,sh hoge.sh有效,而cat hoge.sh | sh无效。

我应该选择哪个选项?还是不可能? 希望我编写一个遵循POSIX的脚本。

1 个答案:

答案 0 :(得分:1)

方法1:通过stderr获取用户输入

问题是外壳程序的标准输入是cat进程,显然,您希望用户知道这个问题。一种方法是:

$ cat hoge.sh
#!/bin/sh
read yn <&2
echo "yn is $yn"

这告诉read从stderr而不是cat进程获取其stdin。由于stderr尚未重定向,因此它仍然是终端

在操作中,它看起来像这样:

$ cat hoge.sh | sh
y
yn is y

方法2:直接从终端获取用户输入

$ cat hoge.sh
#!/bin/sh
read yn </dev/tty
echo "yn is $yn"

通过这种方式完成后,read命令将从终端获取其输入,并且任何I / O重定向尝试都将被忽略。根据您的要求,这可能是优点还是缺点。