In this post, I want to share some of the scripts I once wrote for myself after installing Linux on my notebook.
My configuration on it is Ubuntu + i3wm + Polybar.
All the presented scripts should work fine with POSIX-compliant shells as long as their listed dependencies work.
By the way, the process of preparing this post forced me to refactor and improve a bit the scripts I haven’t touched quite a long time. This is where the advantages of open-source come in. 😏
Low battery warning
An annoying problem I was facing is that every time I hadn’t noticed how the notebook had been running out of battery and then it shut down.
Making a simple notification could be the solution to this problem. However, it has not to be annoying.
More specifically:
- The system shouldn’t notify me too often
- A notification shouldn’t appear under any conditions if the battery’s charging
Script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#!/bin/sh
export DISPLAY=:0
get_battery_level() {
level=$(acpi -b | cut -d',' -f2 | xargs)
level=${level%'%'}
echo $level
}
is_charging() {
status=$(acpi -b)
[ "$status" = "${status%'Discharging'*}" ]
}
# Notify if the battery level is less than some value
# (default 10%)
BATTERY_THRESHOLD=${1:-10}
# Make some pause between notifications
# (default 20 mins)
NOTIFY_DELAY=${2:-1200}
CACHE_FILE="/tmp/tmp.battery_notify_timestamp"
if [ -e $CACHE_FILE ]; then
latest_notify_time=$(cat $CACHE_FILE)
fi
cur_battery_level=$(get_battery_level)
timestamp=$(date +'%s')
echo $cur_battery_level
echo $latest_notify_time
if (! is_charging) && [ \
$cur_battery_level -lt $BATTERY_THRESHOLD -a \
\( -z "$latest_notify_time" -o \
$timestamp -gt $((latest_notify_time+NOTIFY_DELAY)) \
\) \
]; then
notify-send -u critical "Battery is low"
echo $timestamp > $CACHE_FILE
else
if [ -z $latest_notify_time ]; then
latest_notify_time=$timestamp
fi
echo $latest_notify_time > $CACHE_FILE
fi
|
Dependencies:
To periodically run it I used crontab:
* * * * * ~/scripts/battery_notification.sh >/dev/null 2>&1
Soft altering of screen brightness
When I made a simple script to change screen brightness by some constant value, I noticed that the lowest possible nonzero brightness wasn’t low/flexible enough in a dark environment.
Thus I needed some strategy of accounting low brightness level values. I decided to use a multiplier strategy if the additive one doesn’t apply to the current brightness level.
Script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#!/bin/sh
if_expr() {
[ ! $(echo "$1" | bc) -eq 0 ]
}
soft_alter() {
CUR_LEVEL=$(light)
MIN_STEP=0.01
CMD=$1
DELTA=$2
SCALE=$3
case $CMD in
inc)
EXPR=$( (if_expr $CUR_LEVEL'<'$DELTA) &&
((if_expr $CUR_LEVEL+$MIN_STEP'>'$CUR_LEVEL*$SCALE) &&
echo $CUR_LEVEL+$MIN_STEP ||
echo $CUR_LEVEL*$SCALE
) ||
echo $CUR_LEVEL+$DELTA
) ;;
dec)
EXPR=$( (if_expr $CUR_LEVEL'>='$DELTA*$SCALE) &&
((if_expr $CUR_LEVEL'<='$MIN_STEP) &&
echo $CUR_LEVEL ||
echo $CUR_LEVEL-$DELTA
) ||
echo $CUR_LEVEL/$SCALE
) ;;
esac
NEW_LEVEL=$(printf "%.2f\n" $(awk "BEGIN { print "$EXPR" }"))
echo $NEW_LEVEL
return 0
}
if [ "$#" -ge 1 -a \
"$#" -le 3 -a \
\( "$1" = "inc" -o \
"$1" = "dec" \) ];
then
CMD=$1
DELTA=${2:-5}
SCALE=${3:-1.5}
light -S $(soft_alter $CMD $DELTA $SCALE)
else
echo "Usage:"
echo " sh $(basename "$0") [CMD] [DELTA:5] [SCALE:1.5]"
echo "Parameters:"
echo " CMD {up, down}"
echo " DELTA Brightness alter value"
echo " SCALE Brightness scale coefficient for soft altering"
echo " in case of small brightness"
fi
|
Dependencies:
On my notebook, I’ve bound this script to the corresponding keys in i3wm config:
1
2
|
bindsym XF86MonBrightnessUp exec --no-startup-id ~/scripts/change_brightness.sh inc
bindsym XF86MonBrightnessDown exec --no-startup-id ~/scripts/change_brightness.sh dec
|
Charging indicator in status bar
The last one is a tiny script for a status bar that indicates whether the AC adapter is plugged in and charging the battery.
Script:
1
2
3
4
5
6
7
8
|
#!/bin/sh
status=$(acpi -b)
if [ "$status" != "${status%'Discharging'*}" ]; then
echo ''
else
echo '⚡'
fi
|
Dependencies:
In order to embed it in Polybar I added a new module named battery-status
to modules-right
and initialized it:
1
2
3
4
|
[module/battery-status]
type = custom/script
exec = ~/.config/polybar/get_battery_status.sh
interval = 5
|