我在 Arch Linux 笔记本电脑上运行 Minecraft 服务器。Minecraft 的服务器软件作为命令行上的交互式程序运行,因此我会在分离的屏幕会话中启动它,这样每次需要访问它时我都可以重新连接。
为此,我使用了一个脚本(我其他时候都不使用屏幕,所以不必担心“grep SCREEN”)
#!/bin/bash
PID=ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'
sudo screen -r $PID
这将获取服务器正在运行的屏幕会话的 PID,然后重新连接到该屏幕。
现在我想知道,因为我在任何地方都找不到这个,是否可以使用一行代码来重定向
ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'
直接到 $argument 中
sudo screen -r $argument
无需跨越两行
基本上我想将 awk 的标准输出重定向到争论屏幕,而不是作为屏幕的标准输入。
这看起来应该相对容易找到和做到,但我在 Google 上找不到任何关于它的信息。
任何帮助都非常感谢!谢谢
答案1
相反ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'
,你可以这样做
ps aux | awk '/SCREEN/{print $2;exit}'
或者,更推荐您安装procps
:
pgrep SCREEN
(按照说明将这些命令包装在反引号中,或使用$()
更易于阅读和嵌套且执行相同操作的构造。)
甚至更多的建议:如果您只运行一个 Screen 会话,则只需:
screen -r
将默认附加到唯一现有的会话。
正如评论中所述:如果您将来可能想要运行多个 Screen 会话,请使用会话命名功能。使用以下命令启动命名会话
screen -S minecraft
然后重新连接
screen -r minecraft
答案2
xargs 可以做到这一点
$echo abc | xargs prog
在上面的例子中,xargs 将使用参数 abc 执行 prog,即 $prog abc
另一个例子
$ echo abc | xargs echo w x
w x abc
答案3
假设您使用的是 bash,另一种方法是使用反引号。据我所知,反引号首先被求值,结果将用于表达式的其余部分。
sudo screen -r `ps aux | grep SCREEN | sed -n 1p | awk '{ print $2; }'`
我认为那应该可以实现你想要的效果。
正如另一位评论者指出的那样,您xargs
也可以使用它,但我喜欢将其保留用于多参数内容。我觉得反引号更适合您想要完成的任务。