使用标准输入的交互式 shell

Interactive shell using standard input

我想启动一个 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 获取用户输入

问题是 shell 的标准输入是 cat 进程,显然,您希望用户提出问题。一种方法是:

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

这告诉 read 从 stderr 获取它的标准输入,而不是 cat 进程。由于stderr没有被重定向,所以还是终端

在运行中,它看起来像这样:

$ cat hoge.sh | sh
y
yn is y

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

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

以这种方式完成后,read 命令将从终端获取输入,任何 I/O 重定向的尝试都将被忽略。根据您的要求,这可能是优势也可能是劣势。