eval+sed 組み合わせの混乱の結果

eval+sed 組み合わせの混乱の結果

Games Companyランチャーアプリで起動するSteamのゲームを実行していますが、実際のゲームを実行するには別のボタンをクリックする必要があります。ゲームは非常に遅く開始され、不要な広告が含まれています。ゲームの費用を全額支払い、このゲームは無料のオンラインゲームではないので、この現象を強制してはいけません。広告によるお支払い、世界中のさまざまなサーバーに私のテレメトリデータを送信します!

誰かがランチャーを迂回するためにコミュニティガイドにいくつかの簡単なコードを提供しましたが、わからない理由で動作させることはできません。

彼らの簡単なコードは、このコマンドを自分と他のユーザーのゲームのSteamプロパティに入れることです。

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

しかし、スチームでゲームを実行すると何も起こらず、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がゲームが終了したことを認識していませんが、それでも耐えられることです。

XでSteamを使用してUbuntu 23.10で実行しています。

答え1

あなたのコードは以下を使用していますカール引用符直線引用符の代わりに問題が解決されます。

参考までに、コードをshellcheck.netにコピー/貼り付けた場合(次の手順に従ってください)タグなど)問題をお知らせします。これは、使用中のシェルにシェルをタグ付けするのに問題があるもう1つの理由です。そのシェルのタグに関連する情報には、いくつかの有用な情報を含めることができます。

答え2

私がコマンドをコピーしたWebサイトには、私が気付かなかったコードに丸い引用符があり、@Ed Mortonが問題解決を提案したように、直線引用符に置き換えました。

関連情報