我有一个 bash 脚本,它将项目列表列化。默认情况下,它将根据 报告的终端宽度猜测要输出的列数stty size
。但是,当脚本位于管道中时,stty
会报告“设备的 ioctl 不适当”。
我想要的是允许我的脚本在管道中间作为命令执行时,发现它所属的管道是否最终输出到 tty - 如果是,则能够 stty 其特征。
解决方案:正如下面所指出的,stty -F /dev/tty
似乎可以在管道中的任何地方工作。
答案1
您可以使用脚本进行尝试,例如
#!/bin/sh
for fd in 0 1 2; do
if [ -t $fd ]; then echo $fd is a TTY; fi
done
运行这个我看到:
- 如果脚本单独运行,则所有三个 FD 都是 TTY
- 如果脚本在管道的开头运行,
stdin
并且stderr
是 TTY - 如果脚本在管道中间运行,
stderr
则为 TTY - 如果脚本在管道末尾运行,
stdout
并且stderr
是 TTY
这一切似乎合乎逻辑。显然,如果管道stderr
也重定向,行为将会有所不同。
为了完整回答你的问题,我认为不可能在所有情况下确定终端特征,但如果你能找到一个 FD(检查 中的所有条目/dev/fd
),这是一个 TTY,你可以stty
在上面运行......但是从管道的中间不可能确定管道末端的走向。
正如所提到的贾尼斯,如果你想找出控制终端的信息,无论管道如何,你可以使用/dev/tty
,例如和stty -F /dev/tty
;但如果脚本在没有控制终端的情况下运行,则会失败,例如来自cron
工作。