English 中文(简体)
我必须知道什么才能正确使用GNU屏幕?[已关闭]
原标题:
  • 时间:2008-09-16 09:12:43
  •  标签:
Closed. This question needs to be more focused. It is not currently accepting answers.

想改进这个问题吗 通过编辑此文章来更新问题,使其只关注一个问题。

Closed 9 years ago.

我刚刚向一位朋友介绍了GNU Screen,他们很难适应它。这让我思考了他需要了解的关于优秀的Screen

那太棒了。

最佳回答

我已经使用Screen超过10年了,可能只使用了不到一半的功能。因此,绝对没有必要马上学习它的所有功能(我也不建议尝试)。我的日常命令是:

^A ^W - window list, where am I
^A ^C - create new window
^A space - next window
^A p - previous window
^A ^A - switch to previous screen (toggle)
^A [0-9] - go to window [0-9]
^A esc - copy mode, which I use for scrollback

我想就是这样。我有时会使用分屏功能,但肯定不是每天都这样。另一个提示是,如果屏幕似乎因为意外击中了某个随机组合键而锁定,请同时执行^Q^ A^Q以尝试解锁。

问题回答

我无法习惯屏幕,直到我找到了一种方法,在屏幕底部设置一个状态栏,显示你所在的选项卡或虚拟屏幕以及其他选项卡或虚拟屏。这是我的设置:

[roel@roel ~]$ cat .screenrc
# Here comes the pain...
caption always "%{=b dw}:%{-b dw}:%{=b dk}[ %{-b dw}%{-b dg}$USER%{-b dw}@%{-b dg}%H %{=b dk}] [ %= %?%{-b dg}%-Lw%?%{+b dk}(%{+b dw}%n:%t%{+b dk})%?(%u)%?%{-b dw}%?%{-b dg}%+Lw%? %{=b dk}]%{-b dw}:%{+b dw}:"

backtick 2 5 5 $HOME/scripts/meminfo
hardstatus alwayslastline "%{+b dw}:%{-b dw}:%{+b dk}[%{-b dg} %0C:%s%a %{=b dk}]-[   %{-b dw}Load%{+b dk}:%{-b dg}%l %{+b dk}] [%{-b dg}%2`%{+b dk}] %=[ %{-b dg}%1`%{=b dk} ]%{-b dw}:%{+b dw}:%<"

sorendition "-b dw"
[roel@roel ~]$ cat ~/scripts/meminfo
#!/bin/sh
RAM=`cat /proc/meminfo | grep "MemFree" | awk -F" "  {print $2} `
SWAP=`cat /proc/meminfo | grep "SwapFree" | awk -F" "  {print $2} `
echo -n "${RAM}kb/ram ${SWAP}kb/swap"
[roel@roel ~]$

Ctrl键+A键?-显示帮助屏幕!

如果你的朋友习惯于按^A到达Bash中的行的开头,他/她会有一些惊喜,因为^ A^a后按下了一些随机键:-)

在这种情况下,我会尝试

^A s^ A q阻止/取消阻止终端滚动

解决这个问题。要转到屏幕内一行的开头,按键顺序为^a a

您可以将Ctrl+A中的转义键重新映射为您选择的另一个键,因此,如果您确实将其用于其他用途,例如在bash中转到行的开头,您只需要在~/.screenrc文件中添加一行即可。要使其为^b或^b,请使用:

escape ^bB

在命令行中,使用名称会话来控制多个会话。每个任务我使用一个会话,每个会话有多个选项卡:

  screen -ls         # Lists your current screen sessions
  screen -S <name>   # Creates a new screen session called name
  screen -r <name>   # Connects to the named screen sessions

使用屏幕时,您只需要几个命令:

  ^A c          Create a new shell
  ^A [0-9]      Switch shell
  ^A k          Kill the current shell
  ^A d          Disconnect from screen
  ^A ?          Show the help

可以在此处。值得添加书签。

对于那些熟悉屏幕,但往往不记得在手册页中读到的内容的人,一些提示:

  • To change the name of a screen window is very easy: ctrl+A shift+A.
  • Did you miss the last message from screen? ctrl+a ctrl+m will show it again for you.
  • If you want to run something (like tailing a file) and have screen tell you when there s a change, use ctrl+A shift+m on the target window. Warning: it will let you know if anything changes.
  • Want to select window 15 directly? Try these in your .screenrc file:
bind  ! select 11
bind  @ select 12
bind # select 13
bind  $ select 14
bind  % select 15
bind ^ select 16
bind  & select 17
bind  * select 18
bind  ( select 19
bind  ) select 10

它为窗口10到19分配ctrl+一个移位1+0到9

Ctrl+A是基本命令

Ctrl+AN=转到***N***下一屏幕

Ctrl+AP=转到***P***上一屏幕

Ctrl+AC=***C***创建新屏幕

Ctrl+AD=***D***点击屏幕

http://www.debian-administration.org/articles/34

我几年前写过这篇文章,但它仍然是一篇很好的介绍,得到了很多积极的反馈。

我“必须”添加这个:添加

bind s

到你的.screenrc,如果你和我一样,曾经使用拆分窗口,因为C-as拆分了实际的窗口,但C-as冻结了它。所以我只是禁用了冻结快捷方式。

Ctrl+一个是一个特殊的键。

Ctrl+ad-[d]etach,将程序(irssi?)留在后台,回家。

Ctrl+a c [c]reate a new window Ctrl+a 0-9 switch between windows by number

screen-r-返回分离的会话

这涵盖了90%的用例。不要试图同时显示所有功能。

不是真正重要的——不仅仅与屏幕有关,而是在我的终端中启用256种颜色,GNU Screen和Vim极大地改善了我的屏幕体验(尤其是因为我每天用Vim编码大约8小时-有一些很棒的对眼睛友好的配色方案)。

我对.screenrc做的第一个修改是更改escape命令。和你们中的许多人一样,我不喜欢默认的Ctrl-A序列,因为它在几乎所有其他上下文中都会干扰基本功能。在我的.screenrc文件中,我添加了:

转义符`e

这是后顾之忧。

这使我能够使用backtick作为转义键(例如,要创建一个新屏幕,我按backtick-c,detach是backtick-d,backtick-?是帮助,backtick-backtick是前一个屏幕,等等)。它干扰的唯一方法(我不得不改掉这个习惯)是在命令行上使用backtick来捕获执行输出,或者粘贴任何包含backtick的内容。对于前者,我使用BASH$(命令)约定修改了我的习惯。对于后者,我通常只打开另一个xterm或从屏幕分离,然后粘贴包含backtick的内容。最后,如果我想插入一个字面上的backtick,我只需按backtick-e。

有一些有趣的工作正在进行,以在下一版本的Ubuntu Server中默认情况下实现良好的GNU屏幕设置,其中包括使用屏幕底部显示所有窗口以及其他有用的机器详细信息(如可用更新数量和机器是否需要重新启动)。您可能可以获取他们的.screenrc并根据您的需要进行自定义。

我的.screenrc中最有用的命令如下:

shelltitle "$ |bash" # Make screen assign window titles automatically
hardstatus alwayslastline "%w" # Show all window titles at bottom line of term

通过这种方式,我总是知道哪些窗户是开着的,以及此刻窗户里在运行什么。

我将以下内容用于ssh

#!/bin/sh
# scr - Runs a command in a fresh screen
#
# Get the current directory and the name of command

wd=`pwd`
cmd=$1
shift

# We can tell if we are running inside screen by looking
# for the STY environment variable.  If it is not set we
# only need to run the command, but if it is set then
# we need to use screen.

if [ -z "$STY" ]; then
        $cmd $*
else
        # Screen needs to change directory so that
        # relative file names are resolved correctly.
        screen -X chdir $wd

        # Ask screen to run the command
        if [ $cmd == "ssh" ]; then
                screen -X screen -t ""${1##*@}"" $cmd $*
        else
                screen -X screen -t "$cmd $*" $cmd $*
        fi
fi

然后我设置了以下bash别名:

vim() {
        scr vim $*
}

man() {
        scr man $*
}

info() {
        scr info $*
}

watch() {
        scr watch $*
}

ssh() {
        scr ssh $*
}

它为上面的别名打开一个新的屏幕,如果使用ssh,它会用ssh主机名重命名屏幕标题。

I like to set up a screen session with descriptive names for the windows. ^a A will let you give a name to the current window and ^a " will give you a list of your windows. When done, detach the screen with ^a d and re-attach with screen -R

我喜欢使用screen-d-RR来自动创建/附加到给定的屏幕。我创建bash函数是为了让它更简单。。。

function mkscreen
{
    local add=n

    if [ "$1" ==  -a  ]; then
        add=y
        shift;
    fi

    local name=$1;
    shift;
    local command="$*";

    if [ -z "$name" -o -z "$command" ]; then
        echo  Usage: mkscreen [ -a ] name command

    -a          Add to .bashrc.  1>&2;
        return 1;
    fi

    if [ $add == y ]; then
        echo "mkscreen $name $command" >> $HOME/.bashrc;
    fi

    alias $name="/usr/bin/screen -d -RR -S $name $command";

    return 0;
}

function rmscreen
{
    local delete=n

    if [ "$1" ==  -d  ]; then
        delete=y
        shift;
    fi

    local name=$1;

    if [ -z "$name" ]; then
        echo  Usage: rmscreen [ -d ] name

    -d          Delete from .bashrc.  1>&2;
        return 1;
    fi

    if [ $delete == y ]; then
        sed -i -r "/^mkscreen $name .*/d" $HOME/.bashrc;
    fi

    unalias $name;

    return 0;
}

他们为/usr/bin/screen-d-RR-S$name$命令创建了一个别名。例如,我喜欢在屏幕会话中使用irssi,所以在我的.bashrc(在这些函数下面)中,我有:

mkscreen irc /usr/bin/irssi

然后我可以在终端中键入irc进入irssi。如果屏幕irc还不存在,则会创建它,并从中运行/usr/bin/irssi(当然,它会自动连接)。如果它已经在运行,那么我只需重新连接到它,强制分离已经连接到它的任何其他实例。这很好。

另一个例子是,当我遇到perldocs时,为它们创建临时屏幕别名:

mkscreen perlipc perldoc perlipc
perlipc # Start reading the perldoc, ^A d to detach.
...
# Later, when I m done reading it, or at least finished
# with the alias, I remove it.
rmscreen perlipc 

-a选项(必须是第一个参数)将屏幕别名附加到.bashrc(因此它是持久的),-d将其删除(这可能具有潜在的破坏性,因此使用风险自负)。除息的

附加:

另一个我觉得在大量使用屏幕时很方便的bash主义:

alias sls= /usr/bin/screen -ls 

这样你就可以用更少的按键列出你的屏幕。我不知道sls是否与任何现有的实用程序冲突,但当时在我的系统上没有,所以我选择了它。

^A A切换回您刚刚出现的屏幕。

Ctrl+A对于Unix用户来说是一个很好的特殊字符,但如果您使用屏幕与OpenVMS,那么不能^a会让你过早秃顶。

VMS,如果您正在编辑DCL命令在从历史缓冲区执行之前,插入模式已关闭(由于一些原因,我不想在这里介绍)…要打开它,这样你就不会过度键入命令,而不是将内容隔开,你必须按`^a。





相关问题