bash -i 行为和“为什么我的终端挂起?”

bash -i 行为和“为什么我的终端挂起?”

我尝试过的每个发行版都会发生这种情况:

$ 猫 | 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可以杀死它。

相关内容