如何运行一个Unix终端程序,并在将其交给用户之前预先输入几行?

e7arh2l6  于 2023-06-29  发布在  Unix
关注(0)|答案(2)|浏览(123)

所以我可以这样做:

program

我可以这样做:

echo "foo" | program

但是如果我想输入foo,然后将输入交给用户,我该怎么做呢?
我尝试的第一件事是:

cat <(echo "foo") /dev/fd/0 | program

这种方式可以工作,但是program发现它的stdin处于非终结符模式(即使有终结符连接,间接地),所以不能正常工作。
有没有标准的Unix解决方案?或者一些bash/ruby/任何设置它的脚本?

qyyhg6bp

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
$
iyfjxgzm

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,你会在控制台上看到:

Altered: Hello world!

您可以通过使用以下语法获得相同的行为:

cat <(printf '%s: %s\n' A foo b bar c baz) - | program

但是<()的语法是一种 bashism,所以为了便于移植,您可能更喜欢

( echo foo ; cat ) | program

相关问题