为什么使用屏幕时不能滚动或使用 ctrl-a/ctrl-e?

为什么使用屏幕时不能滚动或使用 ctrl-a/ctrl-e?

我使用 iTerm2,并且我意识到当我使用屏幕时:ssh -t [用户名]@[域].edu 'screen -DR'

我注意到了以下异常现象:

  • 我无法使用鼠标在 iTerm2 窗口中上下滚动

  • 我无法使用 ctrl-a 转到行首

  • 我无法使用 ctrl-e 转到行尾

  • 我的 ~/.bash_profile 没有来源

我确信还有其他的,但我怎样才能使它的行为就像我在没有屏幕会话的情况下通过 ssh 登陆一样?

答案1

您提到的键盘快捷键是由 Bash shell 实现的。如果它们不起作用,那可能意味着您出于某种原因没有使用 Bash 作为 shell — 尽管 Screen 启动的 shell 与 SSH 启动的 shell 不同,这有点奇怪:

  • 检查您的~/.screenrc文件是否有任何“shell”或“defshell”命令。
  • getent passwd $USER检查最后一个字段报告的shell是否是/bin/bash。
  • 检查printenv SHELL(屏幕外部)是否与getent报告相符。

在某些系统上,如果您的实际登录 shell 设置为某种奇怪的设置,您可能需要手动告诉 Screen 使用带有shell bashscreenrc 设置的 bash。(例如,您的服务器实际上可能将 /bin/sh 作为用户帐户的 shell,但 sh 的 ~/.profile 随后配置为在顶部启动 /bin/bash。在这种情况下,Screen 启动的“sh”shell 将不会读取 ~/.profile 并且不会跳转到 bash。)


您的 ~/.bash_profile 不会用于非“登录”shell。您启动 Screen 的外壳是一个“登录”shell;Screen 中的 shell 通常是非登录的,并且预计它们只会加载 ~/.bashrc 而不会加载任何“配置文件”脚本 - 这是为了避免每个新的 Screen 窗口不必要地启动初始 shell 已经启动的程序。

应该放入别名和函数之类的东西~/.bashrc,但是 screenrc 中的“shell”设置可用于强制 shell 以“登录”模式启动,通过在其命令前加上-,例如-bash


标准的基于终端的滚动不适用于 Screen 或 tmux 等多路复用器,这在一定程度上是设计使然:多路复用器是其自己的终端仿真器,并以更直接的方式驱动外部终端,其中文本不会滚动出就像它删除并覆盖

例如,当您的 Screen 会话有两个水平分割的窗格时,底部窗格中的文本在即将滚动出视图时必须明确删除,否则顶部窗格中就会出现垃圾。(如果您的 Screen 会话有两个垂直分割的窗格,回滚将如何工作?)

因此,Screen 通常配置为故意将外部终端切换到“备用屏幕”模式,从而在持续时间内禁用 iTerm2 的回滚。您可以尝试使用altscreen offscreenrc 中的设置来防止这种情况发生,但不要指望 iTerm 的回滚有多大意义。

除了执行此操作之外,您还可以进入 Screen 的“复制模式”,以便Ctrl-a[能够滚动浏览特定窗格。

相关内容