eval + sed 组合的令人困惑的结果

eval + sed 组合的令人困惑的结果

我从 Steam 运行一款游戏,该游戏从游戏公司启动器应用程序开始,我必须单击另一个按钮才能启动实际游戏。游戏启动器非常慢,包含不必要的广告,我不应该被迫体验这些,因为我完全支付了游戏费用,这不是免费的在线游戏通过广告付费,它将我的遥测数据发送到世界各地的不同服务器!

有人在社区指南中提供了一些简单的代码来绕过启动器,但我无法让它工作,原因对我来说毫无意义。

他们的简单代码就是将此命令放入适用于他们和其他用户的游戏的 steam 属性中

eval $( echo “%command%” | sed -E “s#Launcher/dowser.exe#Cities2.exe#g” )

但是当我在steam中启动游戏时没有任何反应,它只是在30秒左右后退出。所以我添加了球座使用命令查看 sed 的输出,如下所示

eval $( echo “%command%” | sed -E “s#Launcher/dowser.exe#Cities2.exe#g” | tee ~/foot.txt)

并且 foo.txt 是空的,这没有意义,因为如果我运行这个命令

eval $( echo “%command%” | foo.bash )

这是哪个脚本

#/bin/bash

echo "$*" > ~/foo.txt

然后 foo.txt 具有 bash 在 STDIN 上接收到的预期命令行,而 sed 应该接收到该命令行。

然后我使用 --debug 开关运行相同的 sed 命令并在日志中获取此输出

SED PROGRAM:
  s/Launcher\/dowser.exe/Cities2.exe/g
INPUT:   'STDIN' line 1
PATTERN: /home/user/.local/share/Steam/ubuntu12_32/reaper SteamLaunch AppId=949230 -- /home/user/.local/share/Steam/ubuntu12_32/steam-launch-wrapper -- '/home/user/.local/share/Steam/steamapps/common/SteamLinuxRuntime_sniper'/_v2-entry-point --verb=waitforexitandrun -- '/home/user/.local/share/Steam/steamapps/common/Proton 8.0'/proton waitforexitandrun  '/home/user/.local/share/Steam/steamapps/common/Cities Skylines II/Launcher/dowser.exe'
COMMAND: s/Launcher\/dowser.exe/Cities2.exe/g
MATCHED REGEX REGISTERS
  regex[0] = 409-428 'Launcher/dowser.exe'
PATTERN: /home/user/.local/share/Steam/ubuntu12_32/reaper SteamLaunch AppId=949230 -- /home/user/.local/share/Steam/ubuntu12_32/steam-launch-wrapper -- '/home/user/.local/share/Steam/steamapps/common/SteamLinuxRuntime_sniper'/_v2-entry-point --verb=waitforexitandrun -- '/home/user/.local/share/Steam/steamapps/common/Proton 8.0'/proton waitforexitandrun  '/home/user/.local/share/Steam/steamapps/common/Cities Skylines II/Cities2.exe'
END-OF-CYCLE:
/home/user/.local/share/Steam/ubuntu12_32/reaper SteamLaunch AppId=949230 -- /home/user/.local/share/Steam/ubuntu12_32/steam-launch-wrapper -- '/home/user/.local/share/Steam/steamapps/common/SteamLinuxRuntime_sniper'/_v2-entry-point --verb=waitforexitandrun -- '/home/user/.local/share/Steam/steamapps/common/Proton 8.0'/proton waitforexitandrun  '/home/user/.local/share/Steam/steamapps/common/Cities Skylines II/Cities2.exe'

因此 sed 正在从 STDIN 上的 steam 接收预期数据,并且 sed 命令行脚本正在生成预期结果,但令人费解的是 eval 没有收到 sed 输出或没有执行它。

然后为了看看会发生什么,我再次运行相同的命令,但在 sed 命令之后链接调试日志中的 sed 输出,因此 sed 的结果和输出将被丢弃,并且将运行附加的命令,如下所示

eval $( echo “%command%” | sed -E “s#Launcher/dowser.exe#Cities2.exe#g” & /home/user/.local/share/Steam/ubuntu12_32/reaper SteamLaunch AppId=949230 -- /home/user/.local/share/Steam/ubuntu12_32/steam-launch-wrapper -- '/home/user/.local/share/Steam/steamapps/common/SteamLinuxRuntime_sniper'/_v2-entry-point --verb=waitforexitandrun -- '/home/user/.local/share/Steam/steamapps/common/Proton 8.0'/proton waitforexitandrun  '/home/user/.local/share/Steam/steamapps/common/Cities Skylines II/Cities2.exe')

并且游戏在没有启动器的情况下成功运行!

我不明白,为什么 eval 不执行 sed 输出作为命令,而是执行 sed 显然在 sed 命令之后链接时输出的命令行?

该执行的唯一缺点是,当我退出游戏时,Steam 无法识别游戏已关闭,但我可以忍受这一点。

我在 Ubuntu 23.10 上运行,在 X 中使用 steam

答案1

您的代码正在使用弯引号而不是直引号,所以解决这个问题。

仅供参考,如果您已将代码复制/粘贴到 shellcheck.net 中(按照标签和其他)它会告诉你这个问题。这是使用您正在使用的 shell 标记 shell 问题的另一个原因 - 与该 shell 的标记关联的信息可能包含一些有用的信息。

答案2

我复制命令的网站在代码中包含我没有注意到的弯引号,按照 @Ed Morton 的建议将其替换为直引号解决了这个问题。

相关内容