我使用 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 bash
screenrc 设置的 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 off
screenrc 中的设置来防止这种情况发生,但不要指望 iTerm 的回滚有多大意义。
除了执行此操作之外,您还可以进入 Screen 的“复制模式”,以便Ctrl-a[能够滚动浏览特定窗格。