-eq: operador unário esperado [duplicado]

2

Eu tenho esse script, que altera a vibração do NVIDIA-SETTINGS, quando determinado aplicativo / processo é lançado (no meu caso, o jogo Counter-Strike: Global Offensive)

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

O que há de errado com este script, por que isso me causa esses erros?

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

EDITAR:

#!/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
    
por Matas Esu 13.05.2017 / 18:30

2 respostas

1

Eu reescrevi o script para você, como discutido no bate-papo :

#!/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) - "
  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

Isso deve funcionar bem, exceto pelo caso se o comando nvidia-settings -q "DigitalVibrance" -t tiver saída vazia, em vez de retornar o valor atual das configurações como número.

Ele é mais bem formatado, corrige alguns erros que tivemos no script original, cita corretamente as variáveis no if tests e usa comandos de trabalho para obter e definir o valor das configurações da nvidia, conforme descobrimos o script original não fez nada no seu sistema. Também adicionei uma função de log opcional para mostrar alguma saída de status no console, que você pode desativar substituindo a linha log_enabled="true" por log_enabled="false" .

Sobre como iniciar este script automaticamente no login, você pode ler Como faço para iniciar aplicativos automaticamente no login? ou Como adicionar um script aos aplicativos de inicialização a partir da linha de comando?

    
por Byte Commander 14.05.2017 / 21:58
3

Para corrigir este problema específico

Existem outros problemas com o seu script presumivelmente tratados na resposta do Byte Commander, mas para aqueles que chegam do Google, para corrigir esse problema específico, sempre envolva variáveis com aspas duplas. Por exemplo, [ "$dv" -eq "$on" ] .

Explicação

Um operador unário tem apenas um argumento. Um operador binário tem dois argumentos.

Por exemplo, -eq é um operador binário, porque tem dois argumentos e descobre se são iguais.

Quando o shell vê [ 3 -eq 3 ] , está tudo bem, porque -eq recebe dois argumentos e recebeu dois argumentos, o 3 s. E se um desses estivesse em branco? Seria [ -eq 3 ] ou [ 3 -eq ] . Aqueles estão faltando um dos argumentos, então o shell começa a pensar que você pretendia usar um operador que tenha apenas um argumento, um operador unário.

Suas variáveis podem estar em branco, causando apenas este problema. Para evitar o problema, coloque todos os usos de uma variável entre aspas duplas.

    
por Chai T. Rex 15.05.2017 / 01:02