Bashコマンドプロンプトに更新データを入れるには?

Bashコマンドプロンプトに更新データを入れるには?

現在のバッテリー比率を示すプロンプトを作成しようとしていますが、作成された方法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。他に質問がある場合はお問い合わせください!

関連情報