Статус аккумулятора в приглашении командной строки


kc - Posted on 27 Июль 2010

Бывает полезно, работая в командной строке, видеть уровень заряда батареи.
Вот один из способов:
( ОС - ARCH Linux )

#!/bin/zsh 
 
# Путь к инфо файлам
DIR_STAT='/proc/acpi/battery/BAT0/';
#
# Определяем уровень заряда аккумулятора на текущий момент 
# Было :: remaining_bat=`cat /proc/acpi/battery/BAT0/state | grep remaining | awk {'print $3'}`; 
#
# Определяем подключён сетевой провод или нет 
# Было :: stat=`cat /proc/acpi/battery/BAT0/state | grep charging | awk {'print $3'}`; 
#
# remaining_bat=$(awk '/remaining/ {print $3}' $DIR_STAT/state);
# stat=$(awk '/charging/ {print $3}' $DIR_STAT/state);
#
# Всё убрал в одну строку (спасибо, ramok :) )
#
 
eval $(awk '/remaining/ {print "remaining_bat="$3} /charging/ {print "stat="$3}' $DIR_STAT/state)
 
# Определяем 100% заряда для аккумулятора 
# Было :: full_bat=`cat /proc/acpi/battery/BAT0/info | grep full | awk {'print $4'}`; 
 
full_bat=$(awk '/full/ {print $4}' $DIR_STAT/info);
 
if   [ $stat = 'charging' ]; then 
     stat='+'; # Провод подключён ( ноут зяряжеается ) 
elif [ $stat = 'charged' ]; then 
     stat=''; # ( Аккумулятор зяряжен) 
else  
     stat='-'; # Провод не подключён ( ноут разряжается ) 
fi 
 
# получаем заряд батареи в % ( Школьная математика - Рулит! :) )
bat=$(($remaining_bat*100/$full_bat));
 
# основные цвета ( ESC - последовательности, подробнее - $ man console_codes )
RED="\033[31m";     # Красный 
YELLOW="\033[33m";  # Жёлтый
WHITE="\033[38m";   # Белый
 
# Цвет по-умолчанию
DEFAULT="\033[0m";
 
if   [ $bat -lt 10 ]; then # Если заряд аккамулятора меньше 10% (краасные цвет)
    result="$RED$stat$bat";
elif [ $bat -lt 30 ]; then # Если заряд аккамулятора меньше 30% (жёлтый цвет) 
    result="$YELLOW$stat$bat";
else
    result="$WHTE$stat$bat"; # Заряд аккамулятора больше 30% ( белый цвет )
fi
 
# Выводим результат
echo -e $result%%$DEFAULT;
 
exit 0;

Далее редактируем файл ~/.zshrc в функции precmd() прописываем где-нибудь в начале:

precmd() {
   BAT=`binf.sh`;
   PROMPT="battery:(`echo $BAT`)> "
.....

Вот такой вот элементарный скрипт. У меня на TERM='linux' возникли проблемы с цветами. Если есть вариант лучше и правильней очень прошу поделиться.

А я бы еще ифы инвертировал от большего к меньшему (чаще то батарея больше 30, зачем лишние 2 раза проверять :)

if   [ $bat -ge 30 ]; then
    # Заряд аккамулятора больше 30% ( белый цвет )
    result="$WHTE$stat$bat"
elif [ $bat -ge 10 ]; then
    result="$YELLOW$stat$bat";
else
    result="$RED$stat$bat";
fi

P.S. и да, это паранойа и "задротство"

никакая ни паранойя. очень даже одобрямс. когда цвет менятся, сразу видно, это вам не циферки Ж:-)

Про elif забыл... спасибо..
Инвертировать не буду.

у меня на ноуте нет /proc/acpi/battery/BAT*, например. Вообще, не нашел где у меня данные о батарейке в /proc
Поэтому, рекомендую пользоваться acpi, как наиболее переносимым решением:

$ acpi

Battery 0: Discharging, 95%, 02:35:29 remaining

в /proc может не быть, можно в /sys поискать

А какая ОС ?

кстати еще есть трюк, что бы два раза awk не вызывать для одного и того же файла

$ eval $(awk '/remaining/ {print "remaining_bat="$3} /charging/ {print "stat="$3}' $DIR_STAT/state)
$ echo $stat $remaining_bat
charged 7800

Спасибо, ramok. Подправил. Насчёт проверки наличия батареи - идея прикольная, можно будет попробовать как появиться свободная минутка.

супер! ... ты бы знал как мне помог.
у меня есть исторический архив логов в emulate_httpd_log on формате, написал быдлоскрипт который его конвертит в формат для запихивания в sqlite3.

while read STR;                                        
do                                                     
 IP=$(echo "$STR" | cut -d\  -f1 )                     
 DTstr=$(echo "$STR" | cut -d\  -f 4,5) && DT=$(date --date="${DTstr:1:2} ${DTstr:4:3} ${DTstr:8:4} ${DTstr:13:8}" +%s)
 REQUEST=$(echo "$STR" | cut -d\" -f 2)                
 SIZE=$(echo "$STR" |  cut -d\" -f 3 | cut -d\  -f3 )  
 RESULT_CODE=$(echo "$STR" | cut -d\" -f 3 | cut -d\  -f2)
 CACHE_CODE=$(echo "$STR" | cut -d\" -f 3 | cut -d\  -f4)
 echo -e "${IP}\t${DT}\t${REQUEST}\t${SIZE}\t${RESULT_CODE}\t${CACHE_CODE}"                                                                                  
done

этот "шедевр" выдавал нагора порядка 160 записей в секунду на 1м ядре моего Intel(R) Core(TM)2 Duo CPU E6750 @ 2.66GHz (можно было 2 ядра использовать, но всероавно тупо)

Да, если такое переписать на sed или awk или perl или tclsh/expect, будет порядочно быстрее Ж:-)
В данном конкретном случае больше expect подходит, так как в нем есть замечательная командочка regexp которая умеет разбрасывать то что замачил регесп по переменным. tclsh просто не умеет однострочники. При том что tcl/expect создает байткод на лету => работать должно быстрее.

$ expect -c 'while {[gets stdin l] >= 0} {regexp -- {((\d+\.){3}\d+) .+ .+ \[([^]]+)] "([^"]+)" (\d+) (\d+)} $l -> ip -> time req size res; puts "$ip\t[clock scan $time -format "%d/%b/%Y:%T %Z" -gmt 1]\t$req\t$res\t$size"}' < apache.log

Такое можно и на perl сварганить применяя ключик e к s/// для разбрасывания данных по переменным. Только там strtime кривой какой. Не дает строку в другой формат переконвертить, что бы ненадо было разбивать на элементы. Может как нить докавыряю..

PS
Нашел у тебя две бульбы в коде:
1. Не учитывается GMT (если скрипт запустишь на тачке с другим GMT, то скрипт будет не правильно выдавать время). В моем примере это пофикшено
2. CACHE_CODE не определяется, по крайней мере у меня с таким вот форматом апача:

91.211.121.18 - - [02/Aug/2010:17:53:02 +0200] "GET / HTTP/1.1" 401 721 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-us) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8"

Мой старый скрипт, показывает ресурс батареи

#!/bin/sh
 
b_curr=`cat /proc/acpi/battery/BAT*/state | grep remaining | awk {'print $3'}`
b_state=`cat /proc/acpi/battery/BAT*/state | grep charging | awk {'print $3'}` 
b_full=`cat /proc/acpi/battery/BAT*/info | grep full | awk {'print $4'}`
b_desg=`cat /proc/acpi/battery/BAT*/info | grep 'design capacity:' | awk {'print $3'}`
b_prcb=`cat /proc/acpi/battery/BAT*/info | grep full | awk {'print $4'}`
b_prc=0
 
b_curr2=$b_curr
 
b_prcb=$(($b_prcb*100/$b_desg))
 
b_curr=$(($b_curr*100))
 
b_prc=$(($b_curr/$b_full))
if [ $b_prc -gt 100 ]; then
  b_prc=100
fi 
 
#echo 'Relative capacity : '$b_prc%
 
#echo 'State : '$b_state
 
#echo 'Design Capacity : '$b_desg
 
#echo 'Current capacity : '$b_curr2
 
echo 'Battery capacity : '$b_prcb%
 
echo `date --rfc-3339=date` $b_prcb% >> ~/.battery

хорошая идея, спасибо. еще вставить проверку наличия батареи. и еще если батарея не одна. и проверку того что батарея не одна, но она не подключена (в этих файлах будет пусто)...

совсем отличо будет Ж:-)

PS
если совсем кошерно, то такие параметры в промпте нужно передавать через %1v и подобные перемные как тут

PPS
эх, надо бы добавить советы с показанием в промпте zsh текущего режима в vi режиме и для predict-on, да руки никак не доходят опубликовать..

вот эти строки:

full_bat=`cat /proc/acpi/battery/BAT0/info | grep full | awk {'print $4'}`; 
stat=`cat /proc/acpi/battery/BAT0/state | grep charging | awk {'print $3'}`;

можно сократить до

full_bat=$(awk '/full/{print $4}' /proc/acpi/battery/BAT0/info); 
stat=$(awk '/charging/ {print $3}' /proc/acpi/battery/BAT0/state);

такой вызов меньше форкает процессов, а соответственно экономит батарею.

Спасибо.

У мене на робочій станції акумулятора немає, то цей скрипт із тріском вилітає. Так що перевірка помилок — святе діло:

state=`cat /proc/acpi/battery/BAT0/state 2>/dev/null` || exit 1
remaining_bat=`echo "$state" | grep remaining | awk {'print $3'}`

Як доберуся до лаптопа, протестую кольори.

краще робити так

[ -r /proc/acpi/battery/BAT0/state ] || exit 1
remaining_bat=$(awk '/remaining/{print $3} /proc/acpi/battery/BAT0/state')

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.