刚刚了解了 linux 上的 screen 命令 - 这是天才。我喜欢它。但是,屏幕中的实际终端/提示的外观和行为与我的标准 bash 提示不同。也就是说,颜色不一样,选项卡完成似乎不起作用,等等。
有没有办法让屏幕表现得像一个正常的(至少,像我习惯的那样正常)bash 提示符?
附加信息
我通过 ssh 从 Mac(终端)连接到无头 linux 机器(Ubuntu)。登录后,我有TERM=xterm-color
,当我运行屏幕时,我有TERM=screen
.
我将尝试以下建议,看看我是否可以$TERM
先更改该值。
感谢这篇文章,我所做的是添加一行
~/.screenrc
:然后你的 , 等中的东西
~/.bashrc
应该/etc/bashrc
运行。screen 将术语类型更改为
screen
。您可以执行以下两项操作之一:.screenrc
.bashrc
文件查找TERM=screen
以及TERM=xterm
我喜欢你写问题的方式,我问自己同样的事情,花了一点时间才弄清楚。我很幸运已经对 shell 调用有所了解,所以我认为问题出在某个地方。
这是我的发现。首先,我个人觉得登录 shell 和非登录 shell 之间的区别很有趣,值得了解。执行
man $SHELL
并搜索 INVOCATION 部分以了解更多信息。shopt login_shell
您可以通过在提示符上发出 a 来询问您当前的 shell 实例是登录 shell 还是非登录 shell 。请注意,这通常是只读选项。在我的 Debian 系统上,
screen
一直默认使用非登录 shell。在搜索网络和阅读之后
man $SHELL
,我测试了一些东西,以下两种方法对我有用。在~/.screenrc
添加/更新一行如下:如果这不起作用并且您正在使用
bash
,您也可以尝试,正如Seamus所分享的那样:如前所述,您可以通过
shopt login_shell
在提示符下发出来测试您当前的 shell 实例是否是登录 shell。根据您习惯运行 Bash 的方式,您可能正在运行登录 shell。当您运行时
screen
,您正在运行一个非登录交互式 shell。不同之处在于运行的启动脚本。
/etc/bash.bashrc
然后~/.bashrc
在启动非登录交互式 shell 时获取/etc/profile
然后第一个找到的~/.bash_profile
,~/.bash_login
, 和~/.profile
是在启动交互式登录 shell 时获取的这可能会影响您。
我也会检查是否
$TERM
有不同。screen 不会取代 bash,它会运行它或任何其他 shell。也许它正在运行
csh
,zsh
或者bash
使用不同的参数。我要尝试的第一件事是检查
ps
并/proc/<pid>/cmdline
确保它使用与相同参数相同的外壳login
。之后,检查文件部分
/etc/screenrc
中提到的任何其他文件man screen
。我遇到了同样的问题,当我运行屏幕时,我失去了巧妙找到的酷炫 PS1 颜色提示:P。
问题是我在 ~/.bash_profile 中像这样运行它
这意味着当 screen 运行 bash_profile 时 PS1 不会被转移。
修复很简单:将 export 添加到 ~./bash_profile 中的 PS1 语句,如下所示:
就像变量在嵌套执行中不会丢失一样。
只是想添加一些关于“defshell -bash”的内容(经过几个月的摸索,我才发现)。当你这样做时,由 screen 运行的子 shell 将 $SHELL 设置为“bash”,而不是像通常那样设置为“/bin/bash”。如果您随后在屏幕会话中运行“脚本”,您将获得:
或者至少这就是我的 Ubuntu 14.04 机器上发生的情况。我一直在使用的解决方法是运行
$ SHELL=/bin/bash script
. 我会想象 $SHELL 设置错误会破坏其他东西,但脚本是我注意到的。.profile
在开始任何 shell 初始化之前 ,我在我的中使用此代码段:which screen > /dev/null 2>&1 && { screen -q -ls if [ $? -gt 10 ]; then read -p "$(tput setaf 2)Found a running SCREEN sesion, attach?$(tput sgr0)[Y/n] " y >&2 if [ "${y:-y}" = "y" -o "$y" = "Y" ]; then screen -aDR && logout fi else echo "$(tput setaf 3)No running SCREEN sessions found.$(tput sgr0)" >&2 fi }
然后,如果没有屏幕会话正在运行,我……好吧,我不会陷入标准的 shell 提示符。还有一个密码提示
sudo
(因为我有 99% 的时间登录以管理服务器),如果我打算执行一项冗长的任务,我会取消 sudo 登录,在我的用户会话中手动启动屏幕并在那里 sudo。这里的关键点是“在任何 shell 初始化之前”,这样当你已经有一个正在运行的屏幕会话时,它已经用语言环境和其他东西初始化了,你不需要再重做一次。