mirror of
https://github.com/dylanaraps/pfetch.git
synced 2026-01-02 16:02:12 +01:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
987d3b61fd |
92
README.md
92
README.md
@@ -1,42 +1,80 @@
|
||||
<p align="center"><img src="https://user-images.githubusercontent.com/6799467/65944518-68834d80-e421-11e9-9b14-6ca26a16108a.png" width="350px"></p>
|
||||
<h1 align="center">pfetch</h1>
|
||||
<p align="center">A pretty system information tool written in POSIX sh</p><br>
|
||||
# pfetch
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/6799467/65945384-5bfff480-e423-11e9-863e-4e7cf16eb648.png" width="40%" align="right">
|
||||
A pretty system information tool written in POSIX `sh`.
|
||||
|
||||
The goal of this project is to implement a simple system
|
||||
information tool in POSIX `sh` using features built into
|
||||
the language itself (*where possible*).
|
||||
The goal of this project is to implement a simple system information tool in POSIX `sh` using features built into the language itself (*where possible*).
|
||||
|
||||
The source code is highly documented and I hope it will
|
||||
act as a learning resource for POSIX `sh` and simple
|
||||
information detection across various different operating
|
||||
systems.
|
||||
The source code is highly documented and I hope it will act as a learning resource for POSIX `sh` and simple information detection across various different operating systems.
|
||||
|
||||
If anything in the source code is unclear or is lacking
|
||||
in its explanation, open an issue. Sometimes you get too
|
||||
close to something and you fail to see the "bigger
|
||||
picture"!
|
||||
If anything in the source code is unclear or is lacking in its explanation, open an issue. Sometimes you get too close to something and you fail to see the "bigger picture"!
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
```sh
|
||||
➜ pfetch
|
||||
___ goldie@KISS
|
||||
(.· | os KISS Linux
|
||||
(<> | host Lenovo YOGA 900-13ISK
|
||||
/ __ \ kernel 5.3.1-coffee
|
||||
( / \ /| uptime 6h 20m
|
||||
_/\ __)/_) pkgs 130
|
||||
\/-____\/ memory 1721M / 7942M
|
||||
```
|
||||
|
||||
## OS support
|
||||
|
||||
- **Linux**
|
||||
- Alpine Linux, Arch Linux, Arco Linux, Artix Linux, CentOS, Debian, Elementary, Fedora, Gentoo, Guix, Hyperbola, KISS Linux, Linux Lite, Linux Mint, Mageia, Manjaro, MX Linux, NixOS, OpenSUSE, Parabola, Pop!\_OS, PureOS, Slackware, Ubuntu and Void Linux.
|
||||
- All other distributions are supported with a generic penguin logo.
|
||||
- **Android**
|
||||
- **BSD**
|
||||
- DragonflyBSD, FreeBSD, NetBSD and OpenBSD.
|
||||
- **Windows**
|
||||
- Windows subsystem for Linux.
|
||||
- **Haiku**
|
||||
- **MacOS**
|
||||
- **Minix**
|
||||
- **Solaris**
|
||||
- **BSD**
|
||||
- DragonflyBSD
|
||||
- FreeBSD
|
||||
- NetBSD
|
||||
- OpenBSD
|
||||
- **Windows**
|
||||
- Windows subsystem for Linux.
|
||||
- **Linux**
|
||||
- Alpine Linux
|
||||
- Arch Linux
|
||||
- Arco Linux
|
||||
- Artix Linux
|
||||
- CentOS
|
||||
- Debian
|
||||
- Elementary
|
||||
- Fedora
|
||||
- Gentoo
|
||||
- Guix
|
||||
- Hyperbola
|
||||
- KISS Linux
|
||||
- Linux Lite
|
||||
- Linux Mint
|
||||
- Mageia
|
||||
- Manjaro
|
||||
- MX Linux
|
||||
- NixOS
|
||||
- OpenSUSE
|
||||
- Parabola
|
||||
- Pop!\_OS
|
||||
- PureOS
|
||||
- Slackware
|
||||
- Ubuntu
|
||||
- Void Linux
|
||||
- Other distributions are supported with a generic penguin logo.
|
||||
|
||||
## TODO
|
||||
|
||||
- [ ] Add optional and additional information detection.
|
||||
- [ ] Terminal Emulator ([#12](https://github.com/dylanaraps/pfetch/pull/12))
|
||||
- The way I implement this in `neofetch` is interesting.
|
||||
- [ ] Expand operating system support.
|
||||
- [ ] Android
|
||||
- [ ] iOS
|
||||
- [ ] AIX ([#7](https://github.com/dylanaraps/pfetch/issues/7))
|
||||
- [ ] IRIX ([#8](https://github.com/dylanaraps/pfetch/issues/8))
|
||||
- [ ] FreeMiNT ([#9](https://github.com/dylanaraps/pfetch/issues/9))
|
||||
- [ ] Windows ([#10](https://github.com/dylanaraps/pfetch/issues/10))
|
||||
- [ ] CYGWIN
|
||||
- [ ] MSYS
|
||||
- [ ] MINGW
|
||||
|
||||
## Configuration
|
||||
|
||||
|
||||
128
pfetch
128
pfetch
@@ -129,7 +129,7 @@ get_os() {
|
||||
|
||||
case $os in
|
||||
Linux*)
|
||||
# Some Linux distributions (which are based on others)
|
||||
# Some Linux disttributions (which are based on others)
|
||||
# fail to identify as they **do not** change the upstream
|
||||
# distributions identification packages or files.
|
||||
#
|
||||
@@ -154,12 +154,6 @@ get_os() {
|
||||
if command -v lsb_release; then
|
||||
distro=$(lsb_release -sd)
|
||||
|
||||
# Android detection works by checking for the existence of
|
||||
# the follow two directories. I don't think there's a simpler
|
||||
# method than this.
|
||||
elif [ -d /system/app ] && [ -d /system/priv-app ]; then
|
||||
distro="Android $(getprop ro.build.version.release)"
|
||||
|
||||
else
|
||||
# This used to be a simple '. /etc/os-release' but I believe
|
||||
# this is insecure as we blindly executed whatever was in the
|
||||
@@ -216,35 +210,45 @@ get_os() {
|
||||
# says "populate $line with the third field's contents".
|
||||
while IFS='<>' read -r _ _ line _; do
|
||||
case $line in
|
||||
# Match 'ProductVersion' and read the next line
|
||||
# Match the key and read the next line
|
||||
# directly as it contains the key's value.
|
||||
ProductVersion)
|
||||
IFS='<>' read -r _ _ mac_version _
|
||||
#
|
||||
# Define a shell variable using the key's value.
|
||||
ProductName|ProductVersion)
|
||||
IFS='<>' read -r _ _ "${line?}" _
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done < /System/Library/CoreServices/SystemVersion.plist
|
||||
|
||||
# Use the ProductVersion to determine which macOS/OS X codename
|
||||
# the system has. As far as I'm aware there's no "dynamic" way
|
||||
# of grabbing this information.
|
||||
case $mac_version in
|
||||
10.4*) distro='Mac OS X Tiger' ;;
|
||||
10.5*) distro='Mac OS X Leopard' ;;
|
||||
10.6*) distro='Mac OS X Snow Leopard' ;;
|
||||
10.7*) distro='Mac OS X Lion' ;;
|
||||
10.8*) distro='OS X Mountain Lion' ;;
|
||||
10.9*) distro='OS X Mavericks' ;;
|
||||
10.10*) distro='OS X Yosemite' ;;
|
||||
10.11*) distro='OS X El Capitan' ;;
|
||||
10.12*) distro='macOS Sierra' ;;
|
||||
10.13*) distro='macOS High Sierra' ;;
|
||||
10.14*) distro='macOS Mojave' ;;
|
||||
10.15*) distro='macOS Catalina' ;;
|
||||
*) distro='macOS' ;;
|
||||
esac
|
||||
case ${ProductName?} in
|
||||
iPhone*)
|
||||
distro="iOS ${ProductVersion?}"
|
||||
;;
|
||||
|
||||
distro="$distro $mac_version"
|
||||
*)
|
||||
# Use the ProductVersion to determine which macOS/OS X
|
||||
# codename the system has. As far as I'm aware there's
|
||||
# no "dynamic" way of grabbing this information.
|
||||
case ${ProductVersion?} in
|
||||
10.4*) distro='Mac OS X Tiger' ;;
|
||||
10.5*) distro='Mac OS X Leopard' ;;
|
||||
10.6*) distro='Mac OS X Snow Leopard' ;;
|
||||
10.7*) distro='Mac OS X Lion' ;;
|
||||
10.8*) distro='OS X Mountain Lion' ;;
|
||||
10.9*) distro='OS X Mavericks' ;;
|
||||
10.10*) distro='OS X Yosemite' ;;
|
||||
10.11*) distro='OS X El Capitan' ;;
|
||||
10.12*) distro='macOS Sierra' ;;
|
||||
10.13*) distro='macOS High Sierra' ;;
|
||||
10.14*) distro='macOS Mojave' ;;
|
||||
10.15*) distro='macOS Catalina' ;;
|
||||
*) distro='macOS' ;;
|
||||
esac
|
||||
|
||||
distro="$distro ${ProductVersion?}"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
Haiku)
|
||||
@@ -345,7 +349,7 @@ get_host() {
|
||||
case $word in
|
||||
To | [Bb]e | [Ff]illed | by | O.E.M. | OEM |\
|
||||
Not | Applicable | Specified | System | Product | Name |\
|
||||
Version | Undefined | Default | string | INVALID | <20> | os )
|
||||
Version | Undefined | Default | string | INVALID | <20> )
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
@@ -461,24 +465,10 @@ get_pkgs() {
|
||||
Darwin*)
|
||||
# Commands which print packages one per line.
|
||||
has pkgin && pkgin list
|
||||
has port && port installed
|
||||
|
||||
# Directories containing packages.
|
||||
has brew && printf '%s\n' /usr/local/Cellar/*
|
||||
|
||||
# 'port' prints a single line of output to 'stdout'
|
||||
# when no packages are installed and exits with
|
||||
# success causing a false-positive of 1 package
|
||||
# installed.
|
||||
#
|
||||
# 'port' should really exit with a non-zero code
|
||||
# in this case to allow scripts to cleanly handle
|
||||
# this behavior.
|
||||
has port && {
|
||||
pkg_list=$(port installed)
|
||||
|
||||
[ "$pkg_list" = "No ports are installed." ] ||
|
||||
printf '%s\n' "$pkg_list"
|
||||
}
|
||||
;;
|
||||
|
||||
FreeBSD*|DragonFly*)
|
||||
@@ -551,7 +541,7 @@ get_memory() {
|
||||
# split is used on '.' to filter it out.
|
||||
while IFS=:. read -r key val; do
|
||||
case $key in
|
||||
*' wired'*|*' active'*|*' occupied'*)
|
||||
*wired*|*active*|*occupied*)
|
||||
mem_used=$((mem_used + ${val:-0}))
|
||||
;;
|
||||
esac
|
||||
@@ -771,17 +761,8 @@ get_wm() {
|
||||
# To extract the name, everything before '_NET_WM_NAME = \"'
|
||||
# is removed and everything after the next '"' is removed.
|
||||
wm=$(xprop -id "$id" -notype -len 25 -f _NET_WM_NAME 8t)
|
||||
|
||||
# Handle cases of a window manager _not_ populating the
|
||||
# '_NET_WM_NAME' atom. Display nothing in this case.
|
||||
case $wm in
|
||||
*'_NET_WM_NAME = '*)
|
||||
wm=${wm##*_NET_WM_NAME = \"}
|
||||
wm=${wm%%\"*}
|
||||
;;
|
||||
|
||||
*) wm= ;;
|
||||
esac
|
||||
wm=${wm##*_NET_WM_NAME = \"}
|
||||
wm=${wm%%\"*}
|
||||
}
|
||||
;;
|
||||
esac
|
||||
@@ -887,13 +868,13 @@ get_ascii() {
|
||||
|
||||
[Aa]rch*)
|
||||
read_ascii 4 <<-EOF
|
||||
${c6} /\\
|
||||
/ \\
|
||||
/\\ \\
|
||||
${c4} / \\
|
||||
/ ,, \\
|
||||
/ | | -\\
|
||||
/_-'' ''-_\\
|
||||
${c6} /\\
|
||||
/^^\\
|
||||
/\\ \\
|
||||
/${c7} __ \\
|
||||
/ ( ) \\
|
||||
/ __| |__\\\\
|
||||
/// \\\\\\
|
||||
EOF
|
||||
;;
|
||||
|
||||
@@ -982,12 +963,13 @@ get_ascii() {
|
||||
|
||||
[Ff]ree[Bb][Ss][Dd]*)
|
||||
read_ascii 1 <<-EOF
|
||||
${c1}/\\,-'''''-,/\\
|
||||
\\_) (_/
|
||||
${c1} /\\ _____ /\\
|
||||
\\_) (_/
|
||||
/ \\
|
||||
| |
|
||||
| |
|
||||
; ;
|
||||
'-_____-'
|
||||
\ /
|
||||
--_____--
|
||||
EOF
|
||||
;;
|
||||
|
||||
@@ -1003,7 +985,7 @@ get_ascii() {
|
||||
EOF
|
||||
;;
|
||||
|
||||
[Gg]uix[Ss][Dd]*|[Gg]uix*)
|
||||
[Gg]uix[Ss][Dd]*|guix*)
|
||||
read_ascii 3 <<-EOF
|
||||
${c3}|.__ __.|
|
||||
|__ \\ / __|
|
||||
@@ -1040,7 +1022,7 @@ get_ascii() {
|
||||
EOF
|
||||
;;
|
||||
|
||||
[Ll]inux*[Ll]ite*|[Ll]ite*)
|
||||
[Ll]inux*[Ll]ite*)
|
||||
read_ascii 3 <<-EOF
|
||||
${c3} /\\
|
||||
/ \\
|
||||
@@ -1174,7 +1156,7 @@ get_ascii() {
|
||||
EOF
|
||||
;;
|
||||
|
||||
[Oo]penSUSE*|[Oo]pen*SUSE*|SUSE*|suse*)
|
||||
openSUSE*|open*SUSE*|SUSE*|suse*)
|
||||
read_ascii 2 <<-EOF
|
||||
${c2} _______
|
||||
__| __ \\
|
||||
@@ -1233,7 +1215,7 @@ get_ascii() {
|
||||
EOF
|
||||
;;
|
||||
|
||||
[Ss]un[Oo][Ss]|[Ss]olaris*)
|
||||
[Ss]un[Oo][Ss])
|
||||
read_ascii 3 <<-EOF
|
||||
${c3} . .; .
|
||||
. :; :: ;: .
|
||||
@@ -1400,7 +1382,7 @@ main() {
|
||||
# N lines.
|
||||
#
|
||||
# This was a ternary operation but they aren't supported in Minix's shell.
|
||||
[ "${info_height:-0}" -lt "${ascii_height:-0}" ] &&
|
||||
[ "$info_height" -lt "$ascii_height" ] &&
|
||||
cursor_pos=$((ascii_height - info_height))
|
||||
|
||||
# Print '$cursor_pos' amount of newlines to correctly position the
|
||||
|
||||
Reference in New Issue
Block a user