xbindkeys экранировать кавычки

816
Danilo Bargen

Как я могу избежать кавычек в командах .xbindkeysrc? Ни одна из этих работ.

"pacmd dump|awk --non-decimal-data '$1~/set-sink-volume/'"  "pacmd dump|awk --non-decimal-data '\$1~/set-sink-volume/'"  "pacmd dump|awk --non-decimal-data '\$1~/set-sink-volume/'"  "pacmd dump|awk --non-decimal-data '$1~/set-sink-volume/'" 

(Команды повышают уровень громкости PulseAudio)

4

2 ответа на вопрос

4
David Andersson

В качестве обходного пути создайте сценарий оболочки ~ / bin / mychangevolume с не экранированными командами, как они будут отображаться в командной строке. Что-то вроде

#!/bin/bash incr=$1 pacmd dump | awk --non-decimal-data '$1~/set-sink-volume/'" 

Затем вызовите этот скрипт из .xbindkeysrc

"mychangevolume +2500" 
4
Mikel

Здесь есть два отдельных вопроса, и я постараюсь решить оба.

Во-первых, как правильно указать команду в .xbindkeysrc.

Все, что вам нужно сделать, это взять команду, которая работает bash, а затем заключить ее в двойные кавычки.

Например, для команды с пробелом в ней вам нужно выполнить

"/home/user/My Programs/progname" 

или же

/home/user/My\ Programs/progname 

в bash.

Что означает, что вам нужно

""/home/user/My Programs/progname"" 

или же

"/home/user/My\ Programs/progname" 

в вашем .xbindkeysrc.

Технически происходит то, что xbindkeys удаляет внешнюю пару двойных кавычек, а затем запускает оставшуюся строку, используя sh -c.


В вашем примере команда

pacmd dump|awk --non-decimal-data '$1~/set-sink-volume/' 

отлично работает в Bash, так что я думаю, что проблема в другом месте.

Попробуйте запустить xbindkeysс -vопцией, которая делает xbindkeysзапуск на переднем плане, чтобы вы могли увидеть любые ошибки на вашем терминале.

В моем случае это показывает, что основная причина заключается не в плохом цитировании, а pacmdв ошибке

... No PulseAudio daemon running, or not running as session daemon. 

но если у вас работает PulseAudio, я думаю, что вам нужно перейти pacmdна него pactl, потому что на странице руководства написано, что pacmdаргументы не принимаются, и несколько других примеров в Интернете показывают использование pactlдля этой цели.

Спасибо, помещение команды в двойные кавычки без экранирования вообще сработало :) Danilo Bargen 11 лет назад 1