bash如何关闭/ dev / tty?

时间:2013-12-01 22:01:36

标签: linux bash tty

我希望我的交互式bash能够运行一个最终会执行以下操作的程序:     echo错误:foobar> / dev / tty 并在另一个(python)组件尝试从/ dev / tty提示并读取密码。 我希望这样的读写操作失败,但不能阻止 有没有办法在父脚本中关闭/ dev / tty然后运行程序? 我试过了     foo>& / tmp / outfile

哪个不行。 什么是'at'命令的工作:     现在     在> foob​​ar>& / tmp / outfile

1 个答案:

答案 0 :(得分:1)

您的父脚本中未打开

/dev/tty/dev/tty不是文件描述符,而是文件系统中的路径。

一行脚本,例如:

echo foobar > /dev/tty

为自己打开一个新的描述符。要使失败,我们必须删除/dev/tty,否则不能使其工作:更改权限,或将其替换为不存在的设备。毋庸置疑,这些都是糟糕的想法。

如果我们想运行一个为我们做一些有用的事情的脚本,但是我们不想要(和我们不能更改脚本)的/dev/tty进行I / O操作,解决方案范围从为脚本创建一个环境,其中控制终端是一些伪tty(其主端只是抛出数据),对chroot/dev/tty是同一设备的环境进行操作/dev/null

关于第一个选项,有些实用程序可以创建伪tty,例如Expect。

例如:

$ expect -c "spawn ./badscript ; expect"

将在其badscript是连接到/dev/tty解释器的伪tty的环境中运行expect。由echo foo > /dev/tty发出的badscript仍将显示在您的终端上,但现在它如何到达您的终端是expect通过伪tty设备从badscript读取它,然后重复它; {}禁止badscript直接写入tty。当然,使用expect语言编写一些脚本时,可以防止这种情况发生。