所以我可以这样做:
program
我可以这样做:
echo "foo" | program
但是如果我想输入foo,然后将输入交给用户,我该怎么做呢?我尝试的第一件事是:
foo
cat <(echo "foo") /dev/fd/0 | program
这种方式可以工作,但是program发现它的stdin处于非终结符模式(即使有终结符连接,间接地),所以不能正常工作。有没有标准的Unix解决方案?或者一些bash/ruby/任何设置它的脚本?
qyyhg6bp1#
您可以使用Expect(用于Tcl)或类似的工具(例如pexpect for Python)。下面是一个使用sexpect的简单示例:
$ cat python.sh export SEXPECT_SOCKFILE=/tmp/python-$$.sock sexpect spawn python3 sexpect expect ">>> " sexpect send -cr "print('hello world')" sexpect expect ">>> " sexpect send -cr "print('Entering interactive mode ...')" sexpect expect ">>> " sexpect interact
运行它:
$ bash python.sh Python 3.9.2 (default, Mar 26 2021, 23:22:38) [Clang 12.0.0 (clang-1200.0.32.29)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> print('hello world') hello world >>> print('Entering interactive mode ...') Entering interactive mode ... >>> exit <-- manual input Use exit() or Ctrl-D (i.e. EOF) to exit >>> exit() <-- manual input $
iyfjxgzm2#
试试这个:
cat <(echo foo) - | program
或
( echo "foo" ; cat ) | program
首先创建一个小 program 作为过滤器:
program() { sed -ue 's/^/Altered: /' }
然后,
( printf '%s: %s\n' A foo b bar c baz;cat ) | program Altered: A: foo Altered: b: bar Altered: c: baz
在那里,您的控制台终端应该等待用户输入...如果你点击 *Hello world!*Return,你会在控制台上看到:
Hello world!
Altered: Hello world!
您可以通过使用以下语法获得相同的行为:
cat <(printf '%s: %s\n' A foo b bar c baz) - | program
但是<()的语法是一种 bashism,所以为了便于移植,您可能更喜欢
<()
( echo foo ; cat ) | program
2条答案
按热度按时间qyyhg6bp1#
您可以使用Expect(用于Tcl)或类似的工具(例如pexpect for Python)。
下面是一个使用sexpect的简单示例:
运行它:
iyfjxgzm2#
语法基本正确
试试这个:
或
示例:
首先创建一个小
program
作为过滤器:然后,
在那里,您的控制台终端应该等待用户输入...
如果你点击 *
Hello world!
*Return,你会在控制台上看到:您可以通过使用以下语法获得相同的行为:
但是
<()
的语法是一种 bashism,所以为了便于移植,您可能更喜欢