特定のアプリケーション/プロセスが起動されると、NVIDIA-SETTINGSの雰囲気を変えるこのスクリプトがあります(私の場合、Counter-Strike:Global Offensiveゲーム)
脚本:
#!/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
編集:
#!/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"
に置き換えることで無効にできます。
ログイン時にこのスクリプトを自動的に起動する方法については、 ログイン時にアプリケーションを自動的に起動するにはどうすればよいですか? または コマンドラインから起動アプリケーションにスクリプトを追加する方法
おそらくあなたのスクリプトには、Byte Commanderの回答で対処された他の問題がありますが、Googleから来た人にとっては、この特定の問題を修正するために、変数を常に二重引用符で囲んでください。たとえば、[ "$dv" -eq "$on" ]
。
単項演算子には引数が1つしかありません。二項演算子には2つの引数があります。
たとえば、-eq
は2つの引数を持ち、それらが等しいかどうかを判断するため、二項演算子です。
シェルが[ 3 -eq 3 ]
を見ると、-eq
が2つの引数を取り、2つの引数3
sが与えられているため、すべてが正常です。ただし、それらのいずれかが空白だった場合はどうなりますか? [ -eq 3 ]
または[ 3 -eq ]
のいずれかになります。引数の1つが欠落しているため、シェルは、引数が1つのみの演算子(単項演算子)を使用するつもりであると考えます。
変数が空白になる可能性があるため、この問題が発生します。この問題を回避するには、変数のすべての使用を二重引用符で囲みます。