grep이 이 명령에서 작동하지 않는 이유는 무엇입니까?

grep이 이 명령에서 작동하지 않는 이유는 무엇입니까?

저는 Wine에서 GTA San Andreas를 실행하고 있습니다. 하지만 게임을 종료하면 터미널에 멈춰 있고 프로세스에 여전히 리소스가 남아 있어서 종료할 수 없습니다. 그래서 저는 다음 명령을 만들었는데, 게임 출력의 라인을 반복하고 남은 리소스를 발견하면 종료할 것이라고 생각했습니다.

bash -c 'cd /opt/GTA/San-Andreas && wine ./gta_sa.exe | while read line; do if [[ $(echo $line | grep -i "leftover resource") ]]; then killall gta_sa.exe; exit; fi; done'

gta_sa.exe가 중단되기 전에 다음과 같은 출력이 표시됩니다.

fixme:d3d:wined3d_device_uninit_3d Something's still holding the implicit swapchain.
fixme:d3d:wined3d_device_decref Device released with resources still bound, acceptable but unexpected.
fixme:d3d:wined3d_device_decref Leftover resource 0x539a5e8 with type WINED3D_RTYPE_TEXTURE_2D (0x2).
fixme:d3d:wined3d_device_decref Leftover resource 0x1b8ea8 with type WINED3D_RTYPE_TEXTURE_2D (0x2).
fixme:d3d:wined3d_device_decref Leftover resource 0x1b8cb0 with type WINED3D_RTYPE_TEXTURE_2D (0x2).
fixme:d3d:wined3d_device_decref Leftover resource 0x1b74b8 with type WINED3D_RTYPE_TEXTURE_2D (0x2).

그러나 작동하지 않으며 프로세스가 여전히 중단됩니다. 이 명령이 작동하지 않는 이유는 무엇입니까?

참고하세요: 이것은 Wine에 관한 질문이 아니라 제가 만든 스크립트에 관한 질문입니다.

답변1

출력의 문자를 통해 wine나는 이것이 일종의 오류 메시지이므로 아마도 stdout이 아닌 stderr로 리디렉션될 것이라는 결론을 내렸습니다. 이 경우 파이프는 메시지를 전송하지 않으며 while다음 명령( )의 입력에는 아무것도 없습니다. 이 문제를 해결하려면 파이프 앞에 를 추가하여 winestderr를 stdout으로 리디렉션 해야 합니다.2>&1|

관련 정보