shell 管道中的命令能否确定其上下文的 tty 特征?

shell 管道中的命令能否确定其上下文的 tty 特征?

我有一个 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工作。

相关内容