我如何要求屏幕表现得像标准bash外壳?


37

刚刚了解了Linux上的screen命令-这是个天才。我喜欢它。但是,屏幕上的实际终端/提示与我的标准bash提示的外观和行为不同。也就是说,颜色不一样,制表符补全似乎不起作用,等等。

有没有一种方法可以让我告诉屏幕就像正常的bash提示一样(至少,就像我习惯的那样)?

附加信息

我正在通过ssh从Mac(终端)连接到无头linux盒(Ubuntu)。登录后,我拥有TERM=xterm-color,当我运行screen时拥有TERM=screen

我将尝试以下建议,看看是否可以先更改该$TERM值。


出于好奇,刚开始时,您使用的是什么操作系统以及什么类型的终端?我想您的问题更多与您的终端机做错了或识别不正确的屏幕有关。
Zoredache

@Zoredache-我在上面的帖子中添加了该信息。谢谢。我确实需要调整终端的设置,以允许退格键起作用……
thornomad 2010年

uck,我真的不喜欢Terminal.app。我个人建议你考虑使用替代见(serverfault.com/questions/19240/...
Zoredache

Answers:



13

屏幕将术语类型更改为screen。您可以执行以下两项操作之一:

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

4
谢谢!我创建了一个$HOME/.screenrc文件,并将此行添加到顶部:term xterm-color哇!颜色提示和$TERM值匹配。但是,没有制表符完成操作
thornomad

您需要研究一下打开制表符完成的内容。默认的shell配置脚本与其基于什么启用的内容并不完全一致$TERM;有些功能将与xterm以及xterm-color一起使用,而另一些则仅寻找xterm。其他东西有其他开关。
staticsan

11

我喜欢您提出问题的方式,我在问自己同样的事情,并且花了一些时间才弄清楚。很幸运,我已经对shell调用有所了解,所以我发现问题出在那儿。

这是我的发现。首先,我个人觉得它很有趣,并且值得了解登录外壳程序和非登录外壳程序之间的区别。执行a man $SHELL并搜索关于INVOCATION的部分以了解更多信息。

您可以通过shopt login_shell在提示符下发出来询问当前的shell实例是登录shell还是非登录shell 。请注意,这通常是只读选项。

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

搜索网络并阅读后man $SHELL,我测试了一些内容,以下两种方法对我有用。在~/.screenrc添加/更新行中,如下所示:

shell -$SHELL

如果仍然不能解决问题,而您正在使用bash,则可以尝试由Seamus共享:

defshell -bash

如前所述,可以通过shopt login_shell在提示符下发出命令来测试当前的shell实例是否是登录shell 。


是否可以在当前目录中启动Shell?以下是我想要的一个例子cd ~/Projects ; screen ; pwd #=> ~/Projects。但是,添加shell -$SHELL到我后得到的~/.screenrccd ~/Projects ; screen ; pwd #=> ~/
rudolph9

9

根据您习惯于运行Bash的方式,您可能正在运行登录shell。运行时screen,您正在运行非登录交互式外壳程序。

区别在于运行启动脚本的方式不同。

  • /etc/bash.bashrc然后~/.bashrc在启动非登录交互式外壳程序时获取

  • /etc/profile那么第一个发现的~/.bash_profile~/.bash_login~/.profile当一个交互式登录shell启动货源

这可能会影响您。

我还将检查是否$TERM不同。


2

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

我要尝试的第一件事是进行检查,ps/proc/<pid>/cmdline确保它使用的外壳程序具有相同的参数login

之后,检查FILES部分/etc/screenrc提到的其他文件man screen


我运行了一个ps命令,它表明它bash正在运行(这是屏幕内的ps命令)...我得到的颜色是有效的(上面),只需要完成制表符即可。
thornomad 2010年

2

我遇到了同样的问题,当我运行屏幕时,我迷惑地发现了: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中将export添加到PS1语句中,如下所示:

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

这样,变量不会在嵌套执行中丢失。


1

只想添加一些有关“ defshell -bash”的内容(经过几个月的努力,我才弄清楚)。这样做时,屏幕运行的子外壳将$ SHELL设置为“ bash”,而不是通常的“ / bin / bash”。如果然后在屏幕会话中运行“脚本”,则会得到:

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

或者至少那是我的Ubuntu 14.04机器上发生的事情。我一直在使用的解决方法是运行$ SHELL=/bin/bash script。我以为$ SHELL设置错误会破坏其他内容,但是脚本是我注意到的。


0

.profile开始任何外壳初始化之前,我正在使用此代码段: 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。

这里的关键点是“任何外壳初始化之前”,这样,当您已经有一个正在运行的屏幕会话时,便已经使用语言环境和其他内容进行了初始化,而无需再次进行重做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.