.desktop 파일 실행 경로의 공백

.desktop 파일 실행 경로의 공백

.desktop 파일과 동일한 폴더에 있는 셸 스크립트를 실행하는 .desktop 파일을 만들려고 합니다. 지금까지 나는 다음을 수행했습니다.

Exec=bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'

이 명령에는 두 가지 문제만 있습니다. 첫 번째 문제는 desktop-file-validate여러 가지 오류가 반환된다는 것입니다.

start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character ''' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a non-escaped character '$' in a quote, but it should be escaped with two backslashes ("\\$")
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character ''' outside of a quote

나는 이것을 전혀 이해하지 못합니다. 전체 "bash" 매개변수 주위에는 작은따옴표가 있고, 그 안에 있는 모든 항목에는 큰따옴표가 있습니다. 데스크탑 파일은 작동하고 bash 명령 자체도 작동합니다(데스크탑 파일 외부에서 실행될 때). 그렇다면 이 확인 도구가 따옴표 누락에 대해 불평하는 이유는 무엇입니까? 왜 &&스크립트에서 이스케이프 해야 합니까 ?

두 번째 문제는 경로에 공백이 포함되어 있으면 데스크탑 파일이 작동하지 않는다는 것입니다. 나는 이것이 유효성 검사기가 나에게 주는 모든 오류와 관련이 있을 수 있다고 생각합니다.

그러나 나는 오류가 사라지도록 이것을 적절하게 이스케이프 처리하는 방법을 전혀 모릅니다. 이미 작은따옴표 안에 들어 있다는 사실을 피하는 것은 말이 되지 않습니다 &&. 그렇죠?

답변1

나는 이것을 이해하지 못한다

오류를 주의 깊게 읽으면 오류를 다음과 같이 줄일 수 있습니다.

error: value "bash -xc '...'" contains a reserved character ' outside of a quote

'먼저 참조하지 않으면 사용할 수 없음을 알려줍니다. 한 가지 옵션은 모든 항목에 큰따옴표를 붙이는 것입니다. 이 경우 내부 큰따옴표를 이스케이프해야 할 수도 있습니다. 또 다른 옵션은 작은따옴표를 이스케이프하여 특수 연산자가 아닌 줄의 일부로 간주하는 것입니다.

나는 다음 중 하나가 작동할 것이라고 생각합니다.

Exec=bash -xc \'cd \"\$(dirname %k)\" \&\& bash ./patch.sh \&\& bash -c \"read -n1\"\'
Exec="bash -xc 'cd \"$(dirname %k)\" \&& bash ./patch.sh && bash -c \"read -n1\"'"

&&왜 스크립트에서 이스케이프해야 합니까?

&&bash 연산자입니다. 이 줄을 구문 분석하는 것이 무엇이든 그것은 bash가 아닙니다. 대신 라인을 가져와 전처리하고(사용자가 앱에 알리기를 원하는 특정 사항을 검색) 나머지에 태그를 지정한 다음 첫 번째 태그로 프로세스를 시작하고 나머지를 매개변수 전달로 전달할 수 있습니다. 고유한 특수 규칙과 구문이 있을 수 있습니다.

답변2

보다사양. 복잡해요. 예약된 문자(매우 긴 목록)를 사용하여 매개변수를 인용해야 하지만큰따옴표만 사용하세요.. 따라서 귀하의 명령은 실제로 'cd에 대한 두 번째 인수로 전달됩니다 bash. 또한 &&큰따옴표 안에 있지 않으므로 오류가 발생합니다.

나는 gnome을 사용하지 않으므로 이것을 테스트할 수 없지만 사양에서는 "`\$문자열 내부의 문자를 이스케이프해야 한다고 나와 있습니다(예: 필드 코드를 사용하지 않으려면 이스케이프해야 함). %다음 %%과 같은 것을 시도해보세요

bash -xc "cd \"\\$(dirname %k)\" && bash ./patch.sh && bash -c \"read -n1\""

이 사양은 구체적이고 중요한 몇 가지 예를 제공할 수 있습니다.

관련 정보