刚刚了解了关于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
。 你可以做两件事之一:
.screenrc
的术语设置 .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。 也许它正在运行csh
, zsh
或bash
但具有不同的参数。
我会尝试的第一件事是用ps
和/proc/<pid>/cmdline
来检查它是否使用与login
相同的参数。
之后,检查/etc/screenrc
和man 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和其他东西初始化了,你不需要再重做。