J'ai ce script qui modifie la vibrance NVIDIA-SETTINGS lors du lancement de certains processus/applications (dans mon cas, Counter-Strike: jeu Global Offensive)
Scénario:
#!/bin/bash
on="1023"
off="0"
dv="0"
# RESET
sleep 10
log "RESET"
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"
while true; do #daemon mode
dv=`nvidia-settings -q "[gpu:0]/DigitalVibrance[DFP-0]" -t`
if pgrep -l csgo | grep csgo_linux
then
# log "Process csgo_linux found"
if [ $dv -eq $off ]; then
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$on"
fi
else
# No process found
if [ $dv -eq $on ]; then
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"
fi
fi
if [ $dv -eq $on ]; then
sleep 5
else
sleep 1
fi
done
Quel est le problème avec ce script, pourquoi il me donne ces erreurs?
622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected
622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected
622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected
622 csgo_linux64
/home/matas/Desktop/vib-gui.sh: line 18: [: -eq: unary operator expected
/home/matas/Desktop/vib-gui.sh: line 28: [: -eq: unary operator expected
EDIT:
#!/bin/bash
on="1023"
off="0"
dv="0"
# RESET
sleep 10
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"
while true; do #daemon mode
dv=`nvidia-settings -q "[gpu:0]/DigitalVibrance[DFP-0]" -t`
if pgrep -l csgo | grep csgo_linux
then
# log "Process csgo_linux found"
if [ "$dv -eq $off" ]; then
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$on"
fi
else
# No process found
if [ "$dv" -eq "$on" ]; then
nvidia-settings -a "[gpu:0]/DigitalVibrance[DFP-0]=$off"
fi
fi
if [ "$dv -eq $on" ]; then
sleep 5
else
sleep 1
fi
done
J'ai réécrit le script pour vous, comme discuté dans le chat :
#!/bin/bash
# set log_enabled="true" for status output, else log_enabled="false"
log_enabled="true"
on="1023"
off="0"
dv="0"
log () {
if $log_enabled
then
echo "$(date +%H:%M:%S) - $1"
fi
}
log "waiting 10 seconds..."
sleep 10
log "resetting DigitalVibrance to $off (off)"
nvidia-settings -a "DigitalVibrance=$off" > /dev/null
log "beginning to watch for csgo_linux processes"
while true
do
dv=$(nvidia-settings -q "DigitalVibrance" -t)
log "current DigitalVibrance setting: $dv"
if pgrep "csgo_linux" > /dev/null
then # if CS:GO is running
if [ "$dv" -eq "$off" ]
then # if DigitalVibrance is currently off
log "setting DigitalVibrance to $on (on)"
nvidia-settings -a "DigitalVibrance=$on" > /dev/null
fi
else # if CS:GO is not running
if [ "$dv" -eq "$on" ]
then # if DigitalVibrance is currently on
log "setting DigitalVibrance to $off (off)"
nvidia-settings -a "DigitalVibrance=$off" > /dev/null
fi
fi
if [ "$dv" -eq "$on" ]
then
sleep 5
else
sleep 1
fi
done
Cela devrait fonctionner correctement, sauf dans le cas où la commande nvidia-settings -q "DigitalVibrance" -t
a une sortie vide au lieu de renvoyer la valeur des paramètres actuels sous forme de nombre.
Il est plus joliment formaté, corrige quelques erreurs que nous avions dans le script original, cite correctement les variables dans les tests if
et utilise des commandes réellement fonctionnelles pour obtenir et définir la valeur des paramètres nvidia, comme nous l’avons découvert celles que le script original ne permet pas. faire n'importe quoi sur votre système. J'ai également ajouté une fonction de journalisation facultative pour afficher une sortie d'état dans la console, que vous pouvez désactiver en remplaçant la ligne log_enabled="true"
par log_enabled="false"
.
Pour savoir comment démarrer ce script automatiquement lors de la connexion, vous pouvez lire Comment démarrer des applications automatiquement lors de la connexion? ou Comment ajouter un script aux applications de démarrage à partir de la ligne de commande?
Il y a d'autres problèmes avec votre script probablement traités dans la réponse de Byte Commander, mais pour ceux qui viennent de Google, pour résoudre ce problème spécifique, entourez toujours les variables de guillemets. Par exemple [ "$dv" -eq "$on" ]
.
Un opérateur unaire n'a qu'un seul argument. Un opérateur binaire a deux arguments.
Par exemple, -eq
est un opérateur binaire, car il a deux arguments et détermine s'ils sont égaux.
Lorsque le shell voit [ 3 -eq 3 ]
, tout va bien, car -eq
prend deux arguments, et on lui a donné deux arguments, le 3
s. Et si l'un d'entre eux était vide, cependant? Ce serait soit [ -eq 3 ]
ou [ 3 -eq ]
. Il manque à l’un des arguments ces arguments. Le shell commence donc à penser que vous vouliez utiliser un opérateur qui n’a qu’un seul argument, un opérateur unaire.
Vos variables peuvent être vides, causant simplement ce problème. Pour éviter le problème, entourez toutes les utilisations d'une variable avec des guillemets doubles.