我想启动一个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 重定向尝试。 根据您的要求,这可能是优点或缺点。