我希望我的交互式bash能够运行一个最终会执行以下操作的程序: echo错误:foobar> / dev / tty 并在另一个(python)组件尝试从/ dev / tty提示并读取密码。 我希望这样的读写操作失败,但不能阻止 有没有办法在父脚本中关闭/ dev / tty然后运行程序? 我试过了 foo>& / tmp / outfile
哪个不行。 什么是'at'命令的工作: 现在 在> foobar>& / tmp / outfile
答案 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语言编写一些脚本时,可以防止这种情况发生。