バッテリーを無人で実行するときにコンピューターをスリープ状態にする簡単なスクリプトを作成しようとしています。次の簡単なスクリプトがあります。
#!/bin/sh
if [ `cat /sys/class/power_supply/ADP1/online` -eq 0 ]; then
cat /sys/class/power_supply/ADP1/online; # actual sleep command goes here
fi
を使用して実行すると、xautolock -time 1 -noclose -locker /path/to/script.sh
期待どおりに動作し、AC電源が切断された場合は、毎分ゼロを印刷し、マウスを動かしたり電源アダプタを接続したりすると静かになります。今まではそんなに良くなった。
ただし、不明な理由でラインとして機能させることはできません。
xautolock -time 1 -noclose -locker "if [ `cat /sys/class/power_supply/ADP1/online` -eq 0 ]; then cat /sys/class/power_supply/ADP1/online; fi"
以下はサンプル出力です。
0 # I start with the charger disconnected
0
0 # Here I connect the charger
1
1
^C
ご覧のとおり、/sys/class/power_supply/ADP1/online
期待どおりに値が変わりますが、状態は初期値にとどまるようです。同様に、AC電源が接続された状態でスクリプトを起動すると、後で端末に何も印刷されません。
コマンド置換は最初にのみ評価され、その後は出力が再利用されるようです。なぜこれが起こるのかについて合理的な説明がありますか?
PS。代替の代替構文を試しましたが、$()
同じ結果が得られました。
答え1
はい、コマンド置換はコマンドがxautolock
二重引用符で囲まれているため、コマンドが解析された直後に評価されます。
ifステートメントを一重引用符で囲む必要があります。
個人的には、lockerコマンドを別のスクリプトに入れます。