我想启动一个Shell脚本,它通过管道在内部具有交互部分。
例如,
cat hoge.sh | sh
和hoge.sh
#!/bin/sh
read yn
echo "yn is $yn"
在这种情况下,sh hoge.sh
有效,而cat hoge.sh | sh
无效。
我应该选择哪个选项?还是不可能? 希望我编写一个遵循POSIX的脚本。
答案 0 :(得分:1)
问题是外壳程序的标准输入是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
$ cat hoge.sh
#!/bin/sh
read yn </dev/tty
echo "yn is $yn"
通过这种方式完成后,read
命令将从终端获取其输入,并且任何I / O重定向尝试都将被忽略。根据您的要求,这可能是优点还是缺点。