![.profile 中的 stty 导致:“stty:‘标准输入’:设备的 ioctl 不适当](https://linux22.com/image/1594665/.profile%20%E4%B8%AD%E7%9A%84%20stty%20%E5%AF%BC%E8%87%B4%EF%BC%9A%E2%80%9Cstty%EF%BC%9A%E2%80%98%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E2%80%99%EF%BC%9A%E8%AE%BE%E5%A4%87%E7%9A%84%20ioctl%20%E4%B8%8D%E9%80%82%E5%BD%93.png)
我在 .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
这不是一个好地方。