我尝试过的每个发行版都会发生这种情况:
$ 猫 | bash-i bash-3.2$ ls 富酒吧 bash-3.2$
现在会话已挂起。即,您得到一命令,然后你几乎必须关闭终端窗口。 SIGTERM(又名 ^C)被 bash 捕获,但它不会让您返回到工作 shell。
我猜测这与导致 bash 与 cat 争夺 tty 控制权有关-i
,但我找不到任何明确的信息。谁能解释一下发生了什么事吗?如何自动输入正在运行的程序execlp("/bin/bash", "bash", "-i")
而不会挂起?我是否必须编写一个expect
类似的程序来处理 tty 的异常情况?
答案1
简短的回答:是的,您将必须使用 Expect。
至于为什么它失败了:根据它的行为,bash -i
打开readline
(即使使用--noediting
),这在管道上表现得相当糟糕。它似乎还通过stdout
而不是设置终端模式(包括非阻塞模式)stdin
,这意味着您失去了大多数控制字符的预期行为。 (但是,它并不是直接读取 tty。)
旁注: ^C
发送SIGINT
,而不是SIGTERM
。然而,两者都陷入了交互 ( -i
) 模式;SIGHUP
可以杀死它。