На этот вопрос уже есть ответ здесь:
У меня есть этот скрипт, который изменяет вибрацию NVIDIA-SETTINGS, когда запускается определенное приложение/процесс (в моем случае Counter-Strike:Global Offensive game)
Script:
#!/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
Что не так с этим скриптом, почему он выдает мне эти ошибки?
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
Я переписал сценарий для Вас, как обсужденный в чате :
#!/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
Это должно хорошо работать, за исключением случая, если команда nvidia-settings -q "DigitalVibrance" -t
имеет пустой вывод вместо того, чтобы возвратить текущее значение настроек как число.
Это более приятно отформатировано, фиксирует некоторые ошибки, которые мы имели в исходном сценарии, правильно заключает переменные в кавычки в if
тесты и использование, на самом деле работающее команды, чтобы получить и установить значение настроек Nvidia, поскольку мы узнали, что те в исходном сценарии ничего не сделали в Вашей системе. Я также добавил дополнительную функцию входа для проявления некоторого вывода состояния в консоли, которую можно отключить путем замены строки log_enabled="true"
с log_enabled="false"
.
О том, как запустить этот сценарий автоматически на входе в систему, можно ли читать , Как я запускаю приложения автоматически на входе в систему? или , Как добавить сценарий для Запущения Приложений из командной строки?
существуют другие проблемы со сценарием, по-видимому, имел дело с в ответе Командующего Байта, но для тех, которые входят от Google, чтобы решить эту определенную проблему, всегда окружать переменные двойными кавычками. Например [ "$dv" -eq "$on" ]
.
унарный оператор А только имеет один аргумент. Бинарный оператор имеет два аргумента.
, Например, -eq
бинарный оператор, потому что он имеет два аргумента и выясняет, равны ли они.
, Когда оболочка видит [ 3 -eq 3 ]
, все прекрасно, потому что -eq
берет два аргумента, и ей дали два аргумента, 3
с. Что, если один из тех был пробелом, хотя? Это было бы или [ -eq 3 ]
или [ 3 -eq ]
. Они пропускают один из аргументов, таким образом, оболочка добирается до размышления, что Вы означали использовать оператор, который только имеет один аргумент, унарный оператор.
Ваши переменные могут быть пробелом, вызвав просто эту проблему. Для предотвращения проблемы окружите все использование переменной с двойными кавычками.