bad.util.spawn_with_shell 명령에서 텍스트를 이스케이프하는 방법은 무엇입니까?

bad.util.spawn_with_shell 명령에서 텍스트를 이스케이프하는 방법은 무엇입니까?

을 기반으로제안, 이제 다음 전화를 받습니다rc.lua:

awful.util.spawn_with_shell('vlc $(xclip -o)')

출력이 xclip이스케이프되었는지 확인하는 방법공백 문자매개변수 구분 기호가 아닌가요? 예를 들어, 문자열 "foo bar"(따옴표 제외)를 선택하고 Mod4+를 누르면 vVLC가 열 수 없다고 불평합니다.둘 다"부자"그리고"술집".

이를 설명하기 위해 다음과 같이 쉘 컨텍스트에서 문제를 확인하겠습니다.

$ params() {
    for param
    do
        echo "$param"
    done
}
$ params $(xclip -o)
params
$(xclip
-o)

다음과 같이 수정하세요.

$ params "$(xclip -o)"
params "$(xclip -o)"

그러나 Lua 호출을 이것으로 변경하면 아무 작업도 수행되지 않습니다.

awful.util.spawn_with_shell('vlc "$(xclip -o)"')

답변1

쉘은 xclip의 출력을 다시 평가하지 않기 때문에 필요하지 않습니다. 쉘은 vlc를 실행하고 xclip -o출력을 평가하지 않고 매개변수를 값으로 설정합니다.

직접 테스트하려면 다음 명령을 실행할 수 있습니다.

echo $(echo '`ls`')
echo $(echo '$PATH')
echo $(echo '$(echo foobar)')

답변2

변수 대체 및 명령 대체는 항상 큰따옴표로 묶으십시오. 이는 대체 결과의 토큰화 및 와일드카드를 억제합니다. 이것은 작동합니다:

awful.util.spawn_with_shell('vlc -- "$(xclip -o)"')

왜 아무것도 하지 않는지 설명할 수는 없습니다. 아마도 Lua에 제가 눈치채지 못한 미묘한 부분이 있을 수도 있습니다. 해결 방법으로 한 줄 스크립트를 작성할 수 있습니다.

#!/bin/sh
vlc -- "$(xclip -o)"

Awesome에서 스크립트를 호출합니다.

관련 정보