ohmu
·
2026-09-26
1#!/bin/sh
2
3## OS/ENVIRONMENT INFO DETECTION
4
5ostype="$(uname)"
6
7version=8.4.2
8font=nerd
9distrotype=none
10osi=""
11ki=""
12ri=""
13pi=""
14ui=""
15ci=""
16
17case $1 in
18"-p")
19 font=phosphor
20 osi=""
21 ki=""
22 ri=""
23 pi=""
24 ui=""
25 ci=""
26 ;;
27"-c")
28 font=cozette
29 ki="♥"
30 ri=""
31 pi=""
32 ui=""
33 ci=""
34 ;;
35"-e")
36 font=emoji
37 osi="🐧"
38 ki="💓"
39 ri="🐐"
40 pi="📦"
41 ui="☕"
42 ci="🎨"
43 ;;
44"-v")
45 echo "NerdFetch $version"
46 exit
47 ;;
48"-h"|"--help")
49 echo "Flags:
50-c: Cozette font
51-p: Phosphor font
52-e: Emoji font
53-v: Version"
54 exit
55 ;;
56esac
57
58if command -v getprop 1>/dev/null 2>&1; then
59 distrotype=android
60fi
61kernel=$(uname -r)
62kernel=${kernel%%-*}
63case $ostype in
64*"Linux"*)
65 if [ $distrotype = android ]; then
66 host="$(hostname)"
67 USER="$(whoami)"
68 os="Android $(getprop ro.build.version.release)"
69 case $font in
70 phosphor) osi="" ;;
71 emoji) osi="🤖" ;;
72 *) osi="" ;;
73 esac
74 else
75 host="$(cat /proc/sys/kernel/hostname)"
76 . /etc/os-release
77 if [ -f /bedrock/etc/bedrock-release ]; then
78 os="$(brl version)"
79 else
80 os="${PRETTY_NAME}"
81 if [ $font = nerd ]; then
82 case ${ID%% *} in
83 debian) osi="" ;;
84 arch) osi="" ;;
85 endeavouros) osi="" ;;
86 fedora) osi="" ;;
87 gentoo) osi="" ;;
88 rhel) osi="" ;;
89 slackware) osi="" ;;
90 void) osi="" ;;
91 alpine) osi="" ;;
92 nixos) osi="" ;;
93 artix) osi="" ;;
94 exherbo) osi="" ;;
95 mageia) osi="" ;;
96 manjaro) osi="" ;;
97 opensuse) osi="" ;;
98 solus) osi="" ;;
99 ubuntu) osi="" ;;
100 linuxmint) osi="" ;;
101 trisquel) osi="" ;;
102 puppy) osi="" ;;
103 coreos) osi="" ;;
104 mx) osi="" ;;
105 vanilla) osi="" ;;
106 pop_os) osi="" ;;
107 raspbian) osi="" ;;
108 deepin) osi="" ;;
109 almalinux) osi="" ;;
110 garuda) osi="" ;;
111 centos) osi="" ;;
112 rocky) osi="" ;;
113 esac
114 elif [ $font = cozette ]; then
115 case ${ID%% *} in
116 debian) osi="" ;;
117 arch) osi="" ;;
118 fedora) osi="" ;;
119 gentoo) osi="" ;;
120 slackware) osi="" ;;
121 void) osi="" ;;
122 alpine) osi="" ;;
123 nixos) osi="" ;;
124 mageia) osi="" ;;
125 manjaro) osi="" ;;
126 opensuse) osi="" ;;
127 ubuntu) osi="" ;;
128 linuxmint) osi="" ;;
129 coreos) osi="" ;;
130 centos) osi="" ;;
131 esac
132 fi
133 fi
134 fi
135 ;;
136*"Darwin"*)
137 host="$(hostname -f | sed -e 's/^[^.]*\.//')"
138 mac_product="$(/usr/libexec/PlistBuddy -c "Print:ProductName" /System/Library/CoreServices/SystemVersion.plist)"
139 mac_version="$(/usr/libexec/PlistBuddy -c "Print:ProductVersion" /System/Library/CoreServices/SystemVersion.plist)"
140 os="${mac_product} ${mac_version}"
141 case $font in
142 nerd) osi="" ;;
143 phosphor) osi="" ;;
144 cozette) osi="" ;;
145 emoji) osi="🍎" ;;
146 esac
147 ;;
148*"FreeBSD"*)
149 host="$(hostname)"
150 distrotype=bsd
151 os="FreeBSD $(freebsd-version | sed 's/-.*//')"
152 case $font in
153 nerd) osi="" ;;
154 phosphor) osi="" ;;
155 cozette) osi="" ;;
156 emoji) osi="😈" ;;
157 esac
158 ;;
159*"OpenBSD"*)
160 host="$(hostname)"
161 distrotype=bsd
162 os="OpenBSD $(uname -r)"
163 case $font in
164 nerd) osi="" ;;
165 phosphor) osi="" ;;
166 cozette) osi="⌘" ;;
167 emoji) osi="🐡" ;;
168 esac
169 ;;
170*"NetBSD"*)
171 host="$(hostname)"
172 distrotype=netbsd
173 os="NetBSD $(uname -r)"
174 case $font in
175 nerd) osi="" ;;
176 phosphor) osi="" ;;
177 cozette) osi="" ;;
178 emoji) osi="🚩" ;;
179 esac
180 ;;
181*)
182 os="Unix-like"
183 host="host"
184 ;;
185esac
186
187## PACKAGE MANAGER AND PACKAGES DETECTION
188
189MANAGER=$(for x in nix-env pkg flatpak yum zypper dnf rpm dpkg-query brew port pacman xbps-query emerge cave apk kiss pmm /usr/sbin/slackpkg bulge birb yay paru pacstall pmm opkg eopkg getprop; do command -v $x; done 2>/dev/null)
190manager=${MANAGER##*/}
191if [ $distrotype = netbsd ]; then
192 manager="pkg_info-netbsd"
193fi
194case $manager in
195cpm) packages="$(cpm C)" ;;
196flatpak) packages="$(flatpak list --app | wc -l)" ;;
197brew) packages="$(printf '%s\n' "$(brew --cellar)/"* | wc -l)" ;;
198port) packages="$(($(port installed | wc -l) - 1))" ;;
199dpkg-query) packages="$(dpkg-query -f '${binary:Package}\n' -W | wc -l)" ;;
200rpm) packages="$(rpm -qa --last | wc -l)" ;;
201yum) packages="$(yum list installed | wc -l)" ;;
202dnf) packages="$(dnf list installed | wc -l)" ;;
203zypper) packages="$(zypper se | wc -l)" ;;
204pacman) packages="$(pacman -Q | wc -l)" ;;
205yay) packages="$(yay -Q | wc -l)" ;;
206paru) packages="$(paru -Q | wc -l)" ;;
207pacstall) packages="$(pacstall -L | wc -l)" ;;
208kiss) packages="$(kiss list | wc -l)" ;;
209emerge) packages="$(qlist -I | wc -l)" ;;
210pkg) packages="$(pkg info | wc -l | tr -d ' ')" ;;
211cave) packages="$(cave show installed-slots | wc -l)" ;;
212xbps-query) packages="$(xbps-query -l | wc -l)" ;;
213nix-env) packages="$(nix-store -q --requisites /run/current-system/sw | wc -l)" ;;
214apk) packages="$(apk list --installed | wc -l)" ;;
215pmm) packages="$(/bedrock/libexec/pmm pacman pmm -Q 2>/dev/null | wc -l)" ;;
216opkg) packages="$(opkg list-installed | wc -l)" ;;
217eopkg) packages="$(eopkg li | wc -l)" ;;
218slackpkg) packages="$(ls /var/log/packages | wc -l)" ;;
219bulge) packages="$(bulge list | wc -l)" ;;
220birb) packages="$(birb --list-installed | wc -l)" ;;
221pkg_info)
222 packages="$(pkg_info -A | wc -l)"
223 manager="pkg"
224 ;;
225pkg_info-netbsd)
226 packages="$(pkg_info -a | wc -l)"
227 manager="pkg"
228 ;;
229*)
230 if [ $distrotype = android ]; then
231 packages="$(pkg list-installed 2>/dev/null | wc -l)"
232 manager="pkg"
233 else
234 packages="$(ls /usr/bin | wc -l)"
235 manager="bin"
236 fi
237 ;;
238esac
239
240packages="${packages#"${packages%%[![:space:]]*}"}"
241manager=${manager%-query}
242
243## UPTIME DETECTION
244
245if [ $distrotype = android ]; then
246 uptime="$(uptime -p | cut -c 4-)"
247elif [ $distrotype = bsd ] || [ $distrotype = netbsd ]; then
248 uptime="$(uptime | sed -e 's/.* up //; s/, [0-9]* user.*//')"
249else
250 case $ostype in
251 *"Linux"*)
252 IFS=. read -r s _ </proc/uptime
253 ;;
254 *)
255 s=$(sysctl -n kern.boottime)
256 s=${s#*=}
257 s=${s%,*}
258 s=$(($(date +%s) - s))
259 ;;
260 esac
261 d="$((s / 60 / 60 / 24))"
262 h="$((s / 60 / 60 % 24))"
263 m="$((s / 60 % 60))"
264 # Plurals
265 [ "$d" -gt 1 ] && dp=s
266 [ "$h" -gt 1 ] && hp=s
267 [ "$m" -gt 1 ] && mp=s
268 [ "$s" -gt 1 ] && sp=s
269 # Hide empty fields.
270 [ "$d" = 0 ] && d=
271 [ "$h" = 0 ] && h=
272 [ "$m" = 0 ] && m=
273 [ "$d$h$m" != "" ] && s=
274 # Make the output of uptime smaller.
275 [ "$d" ] && uptime="$d day$dp, "
276 [ "$h" ] && uptime="$uptime$h hour$hp, "
277 [ "$m" ] && uptime="$uptime$m min$mp"
278 [ "$s" ] && uptime="$uptime$s sec$sp"
279 uptime=${uptime%, }
280fi
281
282## RAM DETECTION
283
284case $ostype in
285*"Linux"*)
286 while IFS=':k ' read -r key val _; do
287 case $key in
288 MemTotal)
289 mem_used=$((mem_used + val))
290 mem_full=$val
291 ;;
292 Shmem) mem_used=$((mem_used + val)) ;;
293 MemFree | Buffers | Cached | SReclaimable) mem_used=$((mem_used - val)) ;;
294 esac
295 done </proc/meminfo
296 mem_used=$((mem_used / 1024))
297 mem_full=$((mem_full / 1024))
298 ;;
299*"Darwin"*)
300 mem_full=$(($(sysctl -n hw.memsize) / 1024 / 1024))
301 [ $mem_full -gt 0 ] || mem_full=$(expr $(sysctl -n hw.memsize) / 1024 / 1024)
302 while IFS=:. read -r key val _; do
303 case $key in
304 'Anonymous '*|*' wired'* | *' occupied'*)
305 mem_used=$((mem_used + ${val:-0}))
306 ;;
307 *' purgeable'*)
308 mem_used=$((mem_used - ${val:-0}))
309 ;;
310 esac
311 done <<-EOF
312 $(vm_stat)
313 EOF
314
315 mem_used=$((mem_used * ( $(sysctl -n vm.pagesize) / 1024 ) / 1024))
316 ;;
317*"BSD"*)
318 mem_full=$(($(sysctl -n hw.physmem) / 1024 / 1024))
319 [ $mem_full -gt 0 ] || mem_full=$(expr $(sysctl -n hw.physmem) / 1024 / 1024)
320 if [ $distrotype = netbsd ]; then
321 mem_free=$(($(vmstat | awk 'NR==3 {print $4}') / 1024))
322 else
323 mem_free=$(($(sysctl -n vm.stats.vm.v_free_count) * ( $(sysctl -n vm.stats.vm.v_page_size) / 1024 ) / 1024))
324 fi
325 mem_used=$((mem_full - mem_free))
326 ;;
327*)
328 mem_full=1
329 mem_used=0
330 ;;
331esac
332memstat="${mem_used}/${mem_full} MiB"
333mempercent='('$((mem_used * 100 / mem_full))'%)'
334
335## DEFINE COLORS
336
337bold='[1m'
338black='[30m'
339red='[31m'
340green='[32m'
341yellow='[33m'
342blue='[34m'
343magenta='[35m'
344cyan='[36m'
345white='[37m'
346grey='[90m'
347reset='[0m'
348
349## USER VARIABLES -- YOU CAN CHANGE THESE
350
351lc="${reset}${bold}${magenta}" # labels
352nc="${reset}${bold}${yellow}" # user
353hn="${reset}${bold}${blue}" # hostname
354ic="${reset}${green}" # info
355c0="${reset}${grey}" # first color
356c1="${reset}${white}" # second color
357c2="${reset}${yellow}" # third color
358
359## OUTPUT
360
361cat <<EOF
362
363${c0} ___ ${nc}${USER}${red}@${reset}${hn}${host}${reset}
364${c0} (${c1}.. ${c0}\ ${lc}${osi} ${ic}${os}${reset}
365${c0} (${c2}<> ${c0}| ${lc}${ki} ${ic}${kernel}${reset}
366${c0} /${c1}/ \\ ${c0}\\ ${lc}${ri} ${ic}${RAM}${memstat} ${mempercent}
367${c0} ( ${c1}| | ${c0}/| ${lc}${pi} ${ic}${packages} (${manager})${reset}
368${c2} _${c0}/\\ ${c1}__)${c0}/${c2}_${c0}) ${lc}${ui} ${ic}${uptime}${reset}
369${c2} \/${c0}-____${c2}\/${reset} ${lc}${ci} ${red}███${green}███${yellow}███${blue}███${magenta}███${cyan}███${reset}
370EOF