可以使用 -t test 测试描述符是否连接到终端。
if [ ! -t 0 ]; then
echo "Stdin is not from terminal"
fi
有一个描述符 X,指向一个文件或一个进程(使用 >(cmd) 重定向),是否可以使其看起来像终端?为了通过测试 -t ?
答案1
而不是>(cmd)
,假设它是cmd
您希望成为 tty 而不是管道的标准输入,您可以尝试使用:
>(socat -u - exec:'cmd',pty)
socat
将使用伪 tty 对并将cmd
的 stdin 连接到从属部分([ -t 0 ]
然后返回 true)。
伪终端将置于原始模式,因此线路规则不应干扰数据,因此在这方面它或多或少相当于管道。
然而,伪终端不能像管道那样仅在一端关闭。所以,socat
不能说cmd
没有更多的输入。相反,socat
在 的 stdin 到达文件末尾后,socat
将等待一段时间并销毁伪 tty,这通常意味着cmd
收到 SIGHUP。
如果您的命令需要更长的时间来处理数据,或者在开始执行任何操作之前等待标准输入上的文件结尾,则该命令将无法正常工作。
答案2
该test
命令运行isatty(fd)
以检查描述符是否与 TTY 相关。
isatty(3)
是一个 C 库函数,用于检查文件描述符是否允许ioctl(2)
向该描述符发送终端调用。
LD_PRELOAD=
因此,除非您使用覆盖isatty()
shell 中的函数,否则您无法伪造结果。