如何在同一屏幕会话中自动启动新窗口?

Mat*_*ato 6 debian display bash gnu-screen

我读过如何自动启动多个屏幕会话?,但我不明白第一个接受的回复:

screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"
Run Code Online (Sandbox Code Playgroud)

就我而言,我需要为一个脚本自动创建一个屏幕会话,然后我需要在同一会话中为另一个脚本创建一个新窗口。手动地,我会:

  1. 运行画面
  2. 输入命令
  3. CTRL+A
  4. CTRL+C
  5. 输入命令
  6. CTRL+A
  7. CTRL+D

如何在脚本中自动执行此操作?一个简单的例子会对我有很大帮助。

谢谢您的回复。

小智 6

  1. 启动会话startup并在独立窗口中运行command1
  2. 添加新的独立窗口并运行command2

    screen -dmS startup bash -c 'command1; exec bash'
    screen -S startup -x -X screen bash -c 'command2; exec bash'
    
    Run Code Online (Sandbox Code Playgroud)

startup随时重新连接会话

screen -r startup
Run Code Online (Sandbox Code Playgroud)

  • `; exec bash` 似乎是一个技巧,正确的方法是什么?类似于`ctrl+a+c`的作用? (2认同)

Gab*_*abe 2

我不太确定你想要发生什么 - 你想要一个脚本来创建带有两个命令的两个窗口的屏幕会话,还是想要在运行一个命令的屏幕窗口中运行一个脚本,然后创建一个新的第二个窗口?

第二个很简单,所以让我们从第二个开始:

#!/bin/bash
command1
screen command2
Run Code Online (Sandbox Code Playgroud)

在 screen 中运行“screen”将在当前会话中创建一个新窗口,而不是启动一个新窗口。但它会立即返回,因此在最后一行之后,脚本将退出,而 command2 仍在运行。当 command2 完成后,它的窗口将关闭。

无论如何,对你的问题的第一个解释有点困难,所以让我们继续解决上面的问题:

#!/bin/bash

# Need to positively identify the session name:
SESSION=mysession.$$
echo "TO ATTACH TO SESSION: screen -r ${SESSION}"

# For signalling and stuff
FLAGDIR=$(mktemp -d)

# To keep the windows around after the commands are done,
# set the "zombie" option (see the man-page)
echo "source $HOME/.screenrc" > ${FLAGDIR}/screenrc
echo "zombie xy" >> ${FLAGDIR}/screenrc

# Use that temporary screenrc; create a detached session:
screen \
    -c ${FLAGDIR}/screenrc \
    -d -m \
    -S ${SESSION} \
    bash -c "command1 ; touch ${FLAGDIR}/done"

# Wait for command1 to terminate
while [[ ! -f ${FLAGDIR}/done ]] ; do sleep 1 ; done

# Now start command2 in a new window, by sending a remote command:
screen -S $SESSION -X screen command2

# Don't need this any more:
rm -rf ${FLAGDIR}
Run Code Online (Sandbox Code Playgroud)

该脚本将启动command1,等待完成,然后启动command2并退出。就像您运行 一样command1 ; command2 &,但输出在其他地方。我相信您可以弄清楚如何command1在后台运行。