系统加载时出现以下错误:
Error found while loading /home/[username]/.profile
mesg: ttyname failed: inappropriate ioctl for device
As a result the session should not be configured correctly
You should fix the problem as soon as feasible
grep -i mesg
for.profile
和的输出.bash*
如下:
$ grep -i mesg .profile
mesg n || true
$ grep -i mesg .bash*
$
答案1
在terminal
...
gedit .profile
改变这个:
mesg n || true
更改为:
tty -s && mesg n || true
根帐户的 .profile 可能需要类似(但略有不同)的修复。
答案2
stty -ixon
在.profile
我在我的上有这个命令.profile
,它在 Ubuntu 17.10 中导致了问题。
我把它放在那里是因为关于这个问题的建议:https://unix.stackexchange.com/questions/12107/how-to-unfreeze-after-accidentally-pressing-ctrl-s-in-a-terminal
答案3
为了进一步阐明接受的答案,您的 shell 初始化脚本.profile
和.bashrc
(假设您使用 bash - 否则每个 shell 都不同)在许多不同的场景中运行:
- 交互式登录-例如
- 如果你通过 ssh 登录
- 启动图形终端(终端模拟器在启动新会话时会有所不同 - 或者可以配置)
- 当以你的用户身份运行脚本时
- 自动化作业(例如 cron)
- 只是一个普通的 shell 脚本
- 较不常见的旧示例包括启动文件,如
.xinitrc
和.Xsession
登录时的文件(仅限 X) - 非交互式 ssh - 例如
ssh host ls
主要的重要区别在于 shell 会话是否是“终端”(又名 tty)上的“交互式”会话。交互式会话假设有人在 shell 中输入命令,并且有一个终端(例如,允许在屏幕上绘制颜色或绘制进度条或类似的“终端图形”)。
对于运行脚本或 cronjobs,shell 作为非交互式 shell 运行,并且不需要终端/tty。许多程序会检测它们是否有终端/tty 并调整其行为(例如不提示用户),但并非所有程序都会这样做。在没有终端/tty 的情况下使用需要终端/tty 的程序可能会导致奇怪的行为 - 失败、挂起等待用户输入等......
在ubuntu中bash的启动流程大致是()
- 读取
.profile
(所有类似“sh”的 shell 都会读取该内容) .profile
快讯.bashrc
.bashrc
最后有几行:# If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac
如果您没有以交互方式运行,则case
.bashrc 中的代码将停止解析。.bashrc
因此,最好的解决方案是将任何需要 tty 的配置后你的那部分.bashrc
mesg n || true
接受的答案有一个替代的解决方法,用于tty -s
检测是否存在终端(假设这意味着交互式会话) - 因此只有成功时才tty -s && mesg n
运行。mesg n
tty -s
在现代系统上,这种差异可能并不那么重要,但请记住每一个sh
系统中的shell 脚本(当然每个脚本)都会运行.profile
脚本)运行你的和每一个bash 脚本运行.bashrc
- 至少直到上面的交互式检查。因此这些文件中的每一行代码前交互式检查,这实际上是你当您在终端上打字时会浪费计算机的时间,并且可能会丢失诸如此错误消息之类的令人困惑的信息。
最佳实践建议:
- 仅在“交互式检查”之上设置环境变量(如果确实需要)
- 大部分情况下不要
.profile
管它(出于某些原因你可能需要更改它,但仍然要遵循建议 1) - 在“交互式检查”之后移动大部分定制 - 例如别名,完成,终端工具(如
mesg
,biff
等等,...),ssh-agents,...
这意味着脚本将运行得更快,并且您不需要为交互式工具寻找解决方法。