現在のバッテリー比率を示すプロンプトを作成しようとしていますが、作成された方法PS1
でコードを設定すると、ターミナルエミュレータの新しいインスタンスを開くときにインタラクティブシェルを初期化するときにデータが一度だけ確認されます。データを更新するには再ロードする必要があります。私はUnixシリーズのオペレーティングシステムに初めて触れたので、マイナーなものを見逃しているかもしれません。プロンプトを更新するにはデーモンを作成する必要がありますか?.bashrc
.bashrc
これはプロンプトの完全なコードではありませんが、データの変更に関連する部分です。
PS1="`upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep "percentage:" | awk '$1 == "percentage:" {print $2}'`$ "
答え1
値を積極的に更新する良い方法はわかりませんが、シェルにアクティビティがあるたびに(Enterキーを押すなど)、次のように更新できますPROMPT_COMMAND
。
update_ps1() {
PS1="$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep "percentage:" | awk '$1 == "percentage:" {print $2}')$ "
}
PROMPT_COMMAND=update_ps1
このようにして、実行時に変数をupdate_ps1
更新するbashという関数を追加しました。PS1
次に、PROMPT_COMMAND
変数を関数名に設定しました。によるとman bash
:
PROMPT_COMMAND If set, the value is executed as a command prior to issuing each primary prompt.
これにより、 bash がプロンプトに書き込むたびに bash が書き込み前に値を更新する value を実行するため、書き込みPROMPT_COMMAND
時点PS1
の最新の値が得られます。
答え2
あなたは必要ありませんupower
。すべてのシェルはループをサポートしているため、次のことができます。
#!/bin/sh
# Loop trough all batteries
for battery in /sys/class/power_supply/BAT?
do
# Get capacity of battery
capacity=$(cat "$battery"/capacity) || exit
# Get status of battery
status=$(cat "$battery"/status)
# Print capacity and status
echo "$capacity" \| "$status"
done
説明:バッテリー情報は/sys/class/power_supply/
個々のバッテリーに保存され、名前はBAT
数字で指定されますBAT0, BAT1, ...
。 Linuxのすべてのコンテンツはファイルなので、単にコンテンツを参照してBAT0/status
必要なBAT0/capacity
情報を取得して使用できますecho
。他に質問がある場合はお問い合わせください!