使用标准输入的交互式 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 重定向的尝试都将被忽略。根据您的要求,这可能是优势也可能是劣势。
我想启动一个 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 重定向的尝试都将被忽略。根据您的要求,这可能是优势也可能是劣势。