web-dev-qa-db-ja.com

xbindkeysは引用符をエスケープします

.xbindkeysrcコマンドで引用符をエスケープするにはどうすればよいですか?どちらも機能しません。

"pacmd dump|awk --non-decimal-data '$1~/set-sink-volume/{system ("pacmd "$1" "$2" "$3+2500)}'"

"pacmd dump|awk --non-decimal-data '\$1~/set-sink-volume/{system ("pacmd "\$1" "\$2" "\$3+2500)}'"

"pacmd dump|awk --non-decimal-data '\$1~/set-sink-volume/{system (\"pacmd \"\$1\" \"\$2\" \"\$3+2500)}'"

"pacmd dump|awk --non-decimal-data '$1~/set-sink-volume/{system (\"pacmd \"$1\" \"$2\" \"$3+2500)}'"

(コマンドはPulseAudioの音量レベルを上げます)

6
Danilo Bargen

ここには2つの別々の問題があり、両方に対処しようと思います。

1つ目は、.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/{system ("pacmd "$1" "$2" "$3+2500)}'

bashで問題なく動作するので、問題は他の場所にあると思います。

-vオプションを指定してxbindkeysを実行してみてください。これにより、xbindkeysがフォアグラウンドで実行され、端末でエラーを確認できます。

私の場合、根本的な原因は悪い引用ではないことを示していますが、pacmdはエラーを出します

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

しかし、PulseAudioが機能している場合は、pacmdpactlに変更する必要があると思います。これは、マニュアルページにpacmdは引数を取らないと書かれているためです。この目的のためにpactlを使用するWebショー。

6
Mikel

回避策として、コマンドラインに表示されるようにエスケープされていないコマンドを使用してシェルスクリプト〜/ bin/mychangevolumeを作成します。何かのようなもの

#!/bin/bash
incr=$1
pacmd dump | awk --non-decimal-data '$1~/set-sink-volume/{system ("pacmd "$1" "$2" "$3'$incr')}'"

次に、このスクリプトを.xbindkeysrcから呼び出します。

"mychangevolume +2500"
4
David Andersson