2017-02-01 3 views
0

J'utilise volnoti, un service de notification, ainsi que mon gestionnaire de fenêtres i3, dans mon fichier i3config j'ai essayé de mettre en œuvre les commandes pour volnoti comme ceci:commande Shell ne fonctionne pas

# Pulse Audio controls 
# Increase sound volume 
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume 1 +5% && pkill -RTMIN+1 i3blocks && volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*') 
# Decrease sound volume 
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume 1 -5% && pkill -RTMIN+1 i3blocks && volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*') 
# Mute sound 
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 1 toggle && pkill -RTMIN+1 i3blocks && if [[ -n $(amixer -c 1 -M -D pulse get Master | grep '\[off\]' -m 1) ]]; then volnoti-show -m; else volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*'); fi 

L'augmentation et la diminution est montré sans problème, mais si je mute les journaux sonores i3 cette erreur:

ERROR: Could not translate string to key symbol: "split+h" 
[libi3] ERROR: Surface 0x555ee0dfd3b0 is not initialized, skipping drawing. 
[libi3] ERROR: Surface 0x555ee0dfd3b0 is not initialized, skipping drawing. 
[libi3] ERROR: Surface 0x555ee0dfd3b0 is not initialized, skipping drawing. 
ERROR: Received ConfigureNotify for unknown window 0x00800000 
ERROR: Received ExposeEvent for unknown window 0x00800000 
ERROR: Received ConfigureNotify for unknown window 0x00800000 
ERROR: Received ConfigureNotify for unknown window 0x00800003 
ERROR: Received ConfigureNotify for unknown window 0x00800003 
ERROR: Received ConfigureNotify for unknown window 0x00800006 
ERROR: Received ConfigureNotify for unknown window 0x00800006 
ERROR: Received ConfigureNotify for unknown window 0x00800009 
ERROR: Received ConfigureNotify for unknown window 0x00800009 
ERROR: Received ConfigureNotify for unknown window 0x0080000c 
ERROR: Received ConfigureNotify for unknown window 0x0080000c 
ERROR: Expected one of these tokens: <end>, '[', 'move', 'exec', 'exit', 'restart', 'reload', 'shmlog', 'debuglog', 'border', 'layout', 'append_layout', 'workspace', 'focus', 'kill', 'open', 'fullscreen', 'sticky', 'split', 'floating', 'mark', 'unmark', 'resize', 'rename', 'nop', 'scratchpad', 'title_format', 'mode', 'bar' 
ERROR: Your command: exec --no-startup-id pactl set-sink-mute 1 toggle && pkill -RTMIN+1 i3blocks && "if [[ -n $(amixer -c 1 -M -D pulse get Master | grep '\[off\]' -m 1) ]]; then volnoti-show -m; else volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*'); fi" 
ERROR:                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Je dois admettre, ce n'est pas la solution la plus élégante. Mais ça marche, sauf pour la dernière ligne. Si j'exécute la dernière partie directement dans un terminal, il fonctionne très bien et muet est détectée correctement:

if [[ -n $(amixer -c 1 -M -D pulse get Master | grep '\[off\]' -m 1) ]]; then volnoti-show -m; else volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*'); fi 
+0

pouvez-vous s'il vous plaît expliquer le downvote? – Jonas

Répondre

1

Il y a beaucoup de pièges lors de l'utilisation des commandes shell complexes dans la configuration i3. i3 utilise certains caractères spéciaux comme éléments syntaxiques mais ne fournit pas une manière complète de les citer. Dans ce cas i3 interprète le ; comme séparateur de commande i3 et attend qu'il est suivi d'une commande i3, qui then est pas.


Vous pouvez essayer de placer la partie de commande complète entre guillemets, par ex.

bindsym XF86AudioMute exec --no-startup-id "pactl set-sink-mute 1 toggle && pkill -RTMIN+1 i3blocks && if [[ -n $(amixer -c 1 -M -D pulse get Master | grep '\[off\]' -m 1) ]]; then volnoti-show -m; else volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*'); fi" 

Cela peut ne pas fonctionner. (Et dans le message d'erreur, il semble que vous avez déjà essayé de citer une partie de la commande)


Une meilleure façon de résoudre des problèmes comme celui-ci est généralement de mettre le code shell dans un script et lier tout cela à un raccourci.

Script, par ex. volcontrol.sh:

#!/bin/sh 
# Pulse Audio controls 
case $1 in 
    raise) 
    # Increase sound volume 
    pactl set-sink-volume 1 +5% && pkill -RTMIN+1 i3blocks && volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*') 
    ;; 
    lower) 
    # Decrease sound volume 
    pactl set-sink-volume 1 -5% && pkill -RTMIN+1 i3blocks && volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*') 
    ;; 
    mute) 
    # Mute sound 
    pactl set-sink-mute 1 toggle && pkill -RTMIN+1 i3blocks && if [[ -n $(amixer -c 1 -M -D pulse get Master | grep '\[off\]' -m 1) ]]; then volnoti-show -m; else volnoti-show $(amixer -c 1 -M -D pulse get Master | grep -o '[0-9]*%' -m 1 | grep -o '[0-9]*'); fi 
    ;; 
esac 

i3 config

# Pulse Audio controls 
# Increase sound volume 
bindsym XF86AudioRaiseVolume exec --no-startup-id /path/to/volcontrol.sh raise 
# Decrease sound volume 
bindsym XF86AudioLowerVolume exec --no-startup-id /path/to/volcontrol.sh lower 
# Mute sound 
bindsym XF86AudioMute exec --no-startup-id /path/to/volcontrol.sh mute 

Cela évite les problèmes avec i3 code shell malentendu pour les paramètres de configuration et permet ainsi une plus grande flexibilité, en particulier lorsque enchaînant plusieurs commandes shell ou en utilisant plus contstructs de coquille complexes.