解决ttyname failed: Inappropriate ioctl for device问题

在我使用git pushhexo deploy等类似操作时,时常会看到ttyname failed: Inappropriate ioctl for device的报错信息。这怎么能行,不是0 errors,0 warnings能行?这里就来记录一下这个问题的解决办法。

问题原因

Ubuntu 知道并不是所有人都会对 root 账户执行图形登录,所以在默认.profile文件中设置了在这种情况下产生虚假错误。你可以看到,在/root/.profile文件末尾有这样一行。

1
mesg n || true

这是什么呢?这是为了防止像talk之类的程序写入你的控制台,这在你通过文本会话登录 root 账户时尤为重要。|| true是为了防止在请求 tty 失败时的错误导致 shell 脚本中止。

把这句话放在.profile文件中,能够让每次运行 bash 的时候,执行这句话。当你从没有 tty 设备的绘画中运行时,你就能看到报错,并且这不会影响其他程序的运行,只是显示一条消息。

解决方案

虽说这个消息无害,但是总是看到报错消息还是不太舒服,那就把它去掉吧。

/root/.profile文件中的mesg n || true改为如下内容。

1
tty -s && mesg n || true

这就能让mesg在没有 tty 时,不发送消息,而在有 tty 时继续调用。现在你可以不用再看到ttyname failed: Inappropriate ioctl for device了。