我正在尝试编写一个简短的脚本来打开一个新的终端窗口,执行一个启动游戏服务器的变量,并记录该新窗口的输出。
服务器在控制台中发送了大量完全无用的垃圾邮件,因此我还想附加 -q 以便隐藏窗口。
我的最终目标是使用 grep 查看“已连接到 Steam 服务器”的日志,并在主控制台中报告它。目前我有以下内容:
$server="$game_path/server_executable"
gnome-terminal -- $server
我添加到 gnome-terminal 的任何内容都会破坏代码。我尝试使用 gnome-terminal -- "$server 2>&1 | tee server.log"
gnome-terminal 线,但它坏了。我也尝试过,gnome-terminal -- "@server >> server.log"
但也失败了。我无法找出让新 shell 运行服务器命令的答案和将输出导出到日志文件。
在 Debian 12 上运行。
答案1
更好的方法是使用类似screen
或tmux
的东西,以便在关闭终端窗口时服务继续运行。然而,这不是你问的......
gnome-terminal -- "$server 2>&1 | tee server.log"
这几乎是正确的。我们来看看文档 ( man gnome-terminal
)
gnome-terminal [OPTION…] [-- PROGRAM [ARG…]]
而且,有点令人困惑的是,
--command, -e=COMMAND
以与 shell 相同的方式将此选项的参数拆分为程序和参数,并在终端内执行生成的命令行。此选项已弃用。相反,应使用--
来终止选项,并将程序和参数放在其后执行:例如,不使用gnome-terminal -e "python3 -q"
,而是更喜欢使用gnome-terminal -- python3 -q
。
到目前为止一切顺利。但,
请注意,它
COMMAND
不是通过 shell 运行:它被分割成单词并作为程序执行。如果需要 shell 语法,请使用以下形式gnome-terminal -- sh -c '...'
最后一段是关键:你不能直接使用|
and ;你必须调用 shell 来解释它:>
gnome-terminal
$server="$game_path/server_executable"
gnome-terminal -- sh -c "$server 2>&1 | tee server.log"
就我个人而言,我更喜欢使用screen
, 有或没有gnome-terminal
:
gnome-terminal -- screen sh -c 'game_path/server_executable 2>&1 | tee server.log'
或者,如果您真的不想要该gnome-terminal
部分,而它只是启动游戏服务器的一种方法,
screen -md sh -c 'game_path/server_executable 2>&1 | tee server.log'
很多帮助在 U&L 上用于操纵screen
会话,例如我的答案到在 Ubuntu 中的单独屏幕中暂停进程并将其带回前台