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



我想启动一个shellscript,它通过管道内部有交互部分。

例如

cat hoge.sh | sh

和 hoge.sh

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

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

我应该放哪个选项? 还是不可能?希望我制作一个遵循POSIX的脚本。

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

问题是 stdin for shell 是cat过程,显然,您希望用户提出问题。 一种方法是:

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

这告诉read从 stderr 获取其 stdin,而不是cat过程。 由于 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 重定向尝试。 根据您的要求,这可能是优点或缺点。

最新更新