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에 복사/붙여넣었다면(다음을 따르세요)태그 및 기타) 문제를 알려줄 것입니다. 이는 사용 중인 쉘에 쉘을 태그하는 데 문제가 있는 또 다른 이유입니다. 해당 쉘의 태그와 연관된 정보에는 몇 가지 유용한 정보가 포함될 수 있습니다.

답변2

내가 명령을 복사한 웹 사이트에는 내가 알아차리지 못한 코드에 둥근 따옴표가 있었고 @Ed Morton이 문제 해결을 제안한 대로 직선 따옴표로 바꾸었습니다.

관련 정보