我如何让屏幕performance得像一个标准的bash shell?

刚刚了解了关于linux上的屏幕命令 – 这是天才。 我喜欢它。 但是,屏幕上的实际terminal/提示的外观和行为与标准的bash提示不同。 也就是说,颜色是不一样的,标签完成似乎没有工作,等等。

有没有一种方法,我可以告诉屏幕的行为就像一个正常(至less,我习惯于正常)bash提示?

附加信息

我通过ssh从Mac(terminal)连接到一个无头Linux的盒子(Ubuntu)。 login后,我有TERM=xterm-color ,当我运行屏幕我有TERM=screen

我会尝试下面的build议,看看我能否先改变$TERM值。

感谢这篇文章 ,我所做的是在~/.screenrc添加一行:

 # ~/.screenrc defshell -bash # dash makes it a login shell 

那么你的~/.bashrc/etc/bashrc等内容应该运行。

屏幕将术语types更改为screen 。 你可以做两件事之一:

  1. 更改.screenrc的术语设置
  2. 修改.bashrc文件寻找TERM=screen以及TERM=xterm

我喜欢你写你的问题的方式,我问自己同样的事情,花了一点时间才弄明白。 我很幸运已经知道一些关于shell调用的知识,所以我认为这个问题在某处。

这是我的发现。 首先,我个人觉得有趣,值得了解loginshell和非loginshell之间的区别。 做一个man $SHELL并search关于INVOCATION的部分来阅读更多关于它的信息。

您可以通过在您的提示符上发出一个shopt login_shell来询问当前的shell实例是否为loginshell或非loginshell。 注意这通常是一个只读选项。

在我的Debian系统上, screen总是默认使用非loginshell。

在search网页和阅读man $SHELL ,我testing了一些东西,以下两种方法为我工作。 在~/.screenrc添加/更新一行,如下所示:

 shell -$SHELL 

如果这样做bash ,而且您正在使用bash ,则可以尝试Seamus共享的方法:

 defshell -bash 

如前所述,您可以通过在提示符下inputshopt login_shell来testing当前的shell实例是否为loginshell。

根据你如何运行Bash,你可能正在运行一个loginshell。 当你运行screen ,你正在运行一个非login交互式shell。

不同之处在于运行启动脚本。

  • /etc/bash.bashrc然后~/.bashrc来源于非login交互式shell启动

  • /etc/profile那么当启动一个交互式loginshell时,首先发现~/.bash_profile~/.bash_login~/.profile

这可能会影响到你。

我也会检查是否$TERM是不同的。

屏幕不会取代bash,它运行它,或任何其他shell。 也许它正在运行cshzshbash但具有不同的参数。

我会尝试的第一件事是用ps/proc/<pid>/cmdline来检查它是否使用与login相同的参数。

之后,检查/etc/screenrcman screen FILES部分提到的任何其他文件。

我有同样的问题,当我跑屏幕时,我失去了我精心find的很酷的PS1颜色提示:P。

问题是我在〜/ .bash_profile中像这样运行它

 PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ " 

这意味着当屏幕运行bash_profile时,PS1不会被结转。

修复很简单:将导出添加到〜。/ bash_profile中的PS1语句,如下所示:

 export PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ " 

就像这个variables在嵌套执行中不会丢失一样。

只是想添加一些关于“defshell -bash”(我经过几个月的摸爬滚打之后才发现的)。 当你这样做时,屏幕上运行的子shell将$ SHELL设置为“bash”,而不是像通常那样的“/ bin / bash”。 如果您在屏幕会话中运行“脚本”,您将得到:

 $ script Script started, file is typescript script: failed to execute bash: No such file or directory 

或者至less这是我的Ubuntu 14.04盒子上发生的事情。 我一直在使用的解决方法是运行$ SHELL=/bin/bash script 。 我会想象有$ SHELL设置错误会打破其他的东西,但脚本是我注意到的。

我在我的.profile使用这个片段之前,任何shell初始化开始: echo Searching for running SCREEN... >&2 if screen -S main -X select . 2> /dev/null 1>&2 ; then echo ...awakening SCREEN. >&2 screen -aDR "main"; logout else echo ...not found. >&2 fi echo Searching for running SCREEN... >&2 if screen -S main -X select . 2> /dev/null 1>&2 ; then echo ...awakening SCREEN. >&2 screen -aDR "main"; logout else echo ...not found. >&2 fi

那么,如果没有屏幕会话正在运行,那么我就不会进入标准的shell提示符。 还有一个提示sudo pasword(因为99%的时间我loginpipe理服务器),如果我打算执行一个冗长的任务,我取消sudologin,启动屏幕手动在我的用户的会话和sudo在那里。

这里的关键是“在任何shell初始化之前”,这样当你已经有一个正在运行的屏幕会话时,它已经用locale和其他东西初始化了,你不需要再重做。