将标准输出重定向到程序参数

将标准输出重定向到程序参数

我在 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也可以使用它,但我喜欢将其保留用于多参数内容。我觉得反引号更适合您想要完成的任务。

相关内容