.profile 中的 stty 导致:“stty:‘标准输入’:设备的 ioctl 不适当

.profile 中的 stty 导致:“stty:‘标准输入’:设备的 ioctl 不适当

我在 .profile 文件中添加了该命令stty werase ^H(该命令使我可以使用 Ctrl + Return 删除一个单词)。

但每当我启动电脑时,它都会显示以下错误:

加载 /home/stefan/.profile 时发现错误:

stty:‘标准输入’:设备的 ioctl 不合适

因此会话将无法正确配置。您应尽快修复此问题。

我尝试用 查找错误strace -f -o <path-to-error> stty werase ^H。但我不知道它会导致什么结果。关联对于那些想要阅读它的人(pastebin)。

答案1

stty作用于其标准输入的设备:

虽然没有从标准输入读取输入,但是应该使用标准输入来获取当前终端 I/O 特性并设置新的终端 I/O 特性。

您收到的错误意味着 stdin 不是终端。使用终端,您仍然可以通过重定向 stdin 来重现错误:

</dev/null stty werase ^H

.profile旨在执行为一次性设置(例如通过登录 shell)。在你的情况下,文件显然是由未连接到终端的某个东西解析的。但即使stty成功.profile了,也不会影响你可能使用的所有可能的终端之后

您需要stty在每个交互式 shell 中分别运行。对于 Bash 来说,一个好地方是.bashrc(其他 shell 使用其他文件)。.profile检测 Bash 和来源是一种相当常见的做法.bashrc。在某些(罕见的,相当病态的)情况下.bashrc,可能会在非交互式 shell 中获取来源,因此您可能需要测试 shell 是否是交互式的万一:

# in .bashrc
[[ $- == *i* ]] && stty werase ^H

或者更好地明确检查 stdin 是否是终端:

# portable approach
[ -t 0 ] && stty werase ^H

或者只是默默地忽略来自的错误(如果有)stty

# portable approach
stty werase ^H 2>/dev/null

无论您选择什么,重点是.profile这不是一个好地方。

相关内容