我在* 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)
答案 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
“
第二个引号位于下一行,以便在发送时执行