У меня есть этот скрипт, который меняет вибрацию NVIDIA-SETTINGS, когда запускается определенное приложение / процесс (в моем случае Counter-Strike: Глобальная атака)
Сценарий:
#!/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: [ ! d9] #!/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".
О том, как начать этот скрипт автоматически при входе в систему, вы можете прочитать в чате или Как добавить скрипт к Startup Applications из командной строки?
Я переписал вам сценарий, как обсуждалось в чате:
#!/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".
О том, как начать этот скрипт автоматически при входе в систему, вы можете прочитать в чате или Как добавить скрипт к Startup Applications из командной строки?
Я переписал вам сценарий, как обсуждалось в чате:
#!/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".
О том, как начать этот скрипт автоматически при входе в систему, вы можете прочитать в чате или Как добавить скрипт к Startup Applications из командной строки?
Есть и другие проблемы с вашим сценарием, которые, по-видимому, рассматриваются в ответе Byte Commander, но для тех, кто приходит от Google, чтобы исправить эту конкретную проблему, всегда окружайте переменные двойными кавычками , Например [ "$dv" -eq "$on" ].
Унарный оператор имеет только один аргумент. Бинарный оператор имеет два аргумента.
Например, -eq является двоичным оператором, потому что он имеет два аргумента и определяет, являются ли они равными.
Когда оболочка видит [ 3 -eq 3 ], все нормально, потому что -eq принимает два аргумента, и ему даны два аргумента, 3 s. Что, если один из них был пустым? Это будет либо [ -eq 3 ], либо [ 3 -eq ]. Этим недостает один из аргументов, поэтому оболочка начинает думать, что вы хотите использовать оператор, у которого есть только один аргумент, унарный оператор.
Ваши переменные могут быть пустыми, что вызывает именно эту проблему. Чтобы избежать этой проблемы, используйте все переменные с двойными кавычками.
Есть и другие проблемы с вашим сценарием, которые, по-видимому, рассматриваются в ответе Byte Commander, но для тех, кто приходит от Google, чтобы исправить эту конкретную проблему, всегда окружайте переменные двойными кавычками , Например [ "$dv" -eq "$on" ].
Унарный оператор имеет только один аргумент. Бинарный оператор имеет два аргумента.
Например, -eq является двоичным оператором, потому что он имеет два аргумента и определяет, являются ли они равными.
Когда оболочка видит [ 3 -eq 3 ], все нормально, потому что -eq принимает два аргумента, и ему даны два аргумента, 3 s. Что, если один из них был пустым? Это будет либо [ -eq 3 ], либо [ 3 -eq ]. Этим недостает один из аргументов, поэтому оболочка начинает думать, что вы хотите использовать оператор, у которого есть только один аргумент, унарный оператор.
Ваши переменные могут быть пустыми, что вызывает именно эту проблему. Чтобы избежать этой проблемы, используйте все переменные с двойными кавычками.
Есть и другие проблемы с вашим сценарием, которые, по-видимому, рассматриваются в ответе Byte Commander, но для тех, кто приходит от Google, чтобы исправить эту конкретную проблему, всегда окружайте переменные двойными кавычками , Например [ "$dv" -eq "$on" ].
Унарный оператор имеет только один аргумент. Бинарный оператор имеет два аргумента.
Например, -eq является двоичным оператором, потому что он имеет два аргумента и определяет, являются ли они равными.
Когда оболочка видит [ 3 -eq 3 ], все нормально, потому что -eq принимает два аргумента, и ему даны два аргумента, 3 s. Что, если один из них был пустым? Это будет либо [ -eq 3 ], либо [ 3 -eq ]. Этим недостает один из аргументов, поэтому оболочка начинает думать, что вы хотите использовать оператор, у которого есть только один аргумент, унарный оператор.
Ваши переменные могут быть пустыми, что вызывает именно эту проблему. Чтобы избежать этой проблемы, используйте все переменные с двойными кавычками.