如何创建一个屏幕,执行给定的命令?

时间:2011-08-13 07:51:18

标签: gnu-screen

我在* nix中相当新。有没有办法创建一个屏幕,它将立即执行给定的命令序列(使用自己的参数)?两个小时的谷歌搜索没有产生任何结果 - 也许,因为我不能 明确说明问题。

我希望像

这样的东西
screen -dmS new_screen exec "cd /dir && java -version"

我使用的是屏幕v4.00.03和CentOS 5.5(内核版本2.6.18-194.26.1.el5.028stab079.2)

7 个答案:

答案 0 :(得分:35)

您创建一个名称并处于分离模式的屏幕:

screen -S "mylittlescreen" -d -m

然后发送要在屏幕上执行的命令:

screen -r "mylittlescreen" -X stuff $'ls\n'

命令之前的$是使shell解析引号内的\ n,并且需要换行符来执行命令(就像按下回车键一样)。

这对我这个屏幕版本有用:

  

$ screen -v

     

屏幕版本4.00.03jw4(FAU)2006年5月2日

有关命令的详细信息,请参阅man screen

答案 1 :(得分:31)

问题是使用'exec'屏幕命令不会启动shell。 'cd'是内置的shell,所以你需要一个shell。此外,您需要一个仍在运行的shell,以便屏幕不会终止。

您可以使用-X选项进行屏幕显示以将命令发送到正在运行的屏幕会话,并使用'stuff'命令将按键发送到当前窗口。试试这个:

screen -dmS new_screen sh
screen -S new_screen -X stuff "cd /dir
"
screen -S new_screen -X stuff "java -version
"

是的,您需要将引号放在下一行,以便执行命令。

答案 2 :(得分:5)

screen -dmS screen_name bash -c 'sleep 100'

这将创建名为screen_name的新屏幕。在屏幕内,它会睡100秒。

请注意,如果您输入一些命令代替sleep 100,它会在执行时立即终止,屏幕也会终止。 因此您无法看到刚刚创建的屏幕

答案 3 :(得分:2)

我想从bash脚本中启动远程屏幕,其中一些变量在bash脚本中定义并在屏幕内可用。那么对我有用的是

#!/bin/bash
SOMEVAR1="test2"
# quit existing if there is one running already, be careful
screen -D -RR test1 -X quit || true
screen -dmS test1
screen -r test1 -p 0 -X stuff $"echo ${SOMEVAR1} ^M"

如果返回字符为^ M,则需要使用vim作为

输入
i CTRL-V ENTER ESCAPE

答案 4 :(得分:1)

我认为您可以使用此

function exec_in_screen() {
  name=$1
  command=$2
  screen -dmS $name sh; screen -S $name -X stuff "$command\n";
} 

则...

exec_in_screen "test" "ls"

答案 5 :(得分:0)

另一种方法

第一行cd到你的目录。 第二行使用bash启动名为new_screen的新屏幕会话。 第三行执行java -version

cd /dir
screen -dmS new_screen bash
screen -S new_screen -p 0 -X exec java -version

答案 6 :(得分:-2)

是的,你想要的是“东西”命令

例如

screen -dmS new_screen -X stuff“cd / dir&& java -version

第二个引号位于下一行,以便在发送时执行