加载 /home/[用户名]/.profile 时发现错误

加载 /home/[用户名]/.profile 时发现错误

系统加载时出现以下错误:

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 mesgfor.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的启动流程大致是()

  1. 读取.profile(所有类似“sh”的 shell 都会读取该内容)
  2. .profile快讯.bashrc
  3. .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 ntty -s

在现代系统上,这种差异可能并不那么重要,但请记住每一个sh系统中的shell 脚本(当然每个脚本)都会运行.profile脚本)运行你的和每一个bash 脚本运行.bashrc- 至少直到上面的交互式检查。因此这些文件中的每一行代码交互式检查,这实际上是当您在终端上打字时会浪费计算机的时间,并且可能会丢失诸如此错误消息之类的令人困惑的信息。

最佳实践建议:

  1. 仅在“交互式检查”之上设置环境变量(如果确实需要)
  2. 大部分情况下不要.profile管它(出于某些原因你可能需要更改它,但仍然要遵循建议 1)
  3. 在“交互式检查”之后移动大部分定制 - 例如别名,完成,终端工具(如mesgbiff等等,...),ssh-agents,...

这意味着脚本将运行得更快,并且您不需要为交互式工具寻找解决方法。

相关内容