121 lines
16 KiB
HTML
121 lines
16 KiB
HTML
<!doctype html>
|
|
<html lang="en"><head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
<link rel="shortcut icon" href="http://localhost:1313/favicon.ico">
|
|
<link id="stylesheet" rel="stylesheet" href="/css/light.css">
|
|
|
|
<link rel="canonical" href="http://localhost:1313/teeny-tiny-bash-fetch-script/" />
|
|
<title>Teeny tiny bash fetch script</title>
|
|
</head>
|
|
<body><header id="banner">
|
|
<nav class="navbar">
|
|
<div class="nav-left">
|
|
|
|
<a href="http://localhost:1313/" class="home">~ 🏠</a>
|
|
|
|
<a
|
|
href="/info/"
|
|
title="--help"
|
|
>--help</a
|
|
>
|
|
</div>
|
|
<div class="nav-right">
|
|
|
|
<button id="toggle-button" class="toggle-button" onclick="toggleTheme()">🌚</button>
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
<main id="content">
|
|
<article>
|
|
<header id="post-header">
|
|
<h3>Teeny tiny bash fetch script</h3>
|
|
<div>
|
|
<time>December 10, 2022</time>
|
|
</div>
|
|
</header><p>This is my attempt at a neofetch, pfetch, whateverfetch style system info utility. My main concern was making something which looked nice, was easily configurable, and as portable as possible (I didn’t really try that hard with the portability). I didn’t think much about performance; I’m personally not a man who stresses too much when a command takes a quarter of a second instead of a tenth. The basic gameplan was to get an array of bash commands which would fetch various bits and bobs, then loop through this array formatting the text with ANSI escape codes. First things first, this was the associative array I came up with:</p>
|
|
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">declare</span> -A <span class="nv">fetch</span><span class="o">=(</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>user<span class="o">]=</span><span class="s2">"</span><span class="nv">$USER</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>host<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>cat /etc/hostname<span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>uptime<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>uptime <span class="p">|</span> awk <span class="s1">'{print $3}'</span> <span class="p">|</span> sed <span class="s1">'s/:/h / ; s/,/m/'</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>kernel<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>awk <span class="s1">'{print $3}'</span> /proc/version<span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>distro<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>sed -n <span class="s1">'s/^PRETTY_NAME="//p'</span> /etc/os-release <span class="p">|</span> sed <span class="s1">'s/"//'</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>shell<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>basename <span class="nv">$SHELL</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>de<span class="o">]=</span><span class="s2">"</span><span class="nv">$XDG_CURRENT_DESKTOP</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>terminal<span class="o">]=</span><span class="s2">"</span><span class="nv">$TERM</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>editor<span class="o">]=</span><span class="s2">"</span><span class="nv">$EDITOR</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>root<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>df -Th / <span class="p">|</span> tail -n <span class="m">1</span> <span class="p">|</span> awk <span class="s1">'{print $6}'</span><span class="k">)</span><span class="s2">,
|
|
</span></span></span><span class="line"><span class="cl"><span class="s2"> </span><span class="k">$(</span>df -Th / <span class="p">|</span> tail -n <span class="m">1</span> <span class="p">|</span> awk <span class="s1">'{print $2}'</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>ip<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>host myip.opendns.com resolver1.opendns.com <span class="p">|</span>
|
|
</span></span><span class="line"><span class="cl"> tail -n <span class="m">1</span> <span class="p">|</span> awk <span class="s1">'{print $4}'</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>battery<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>cat /sys/class/power_supply/BAT0/capacity<span class="k">)</span><span class="s2">%"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>cpu<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>sed -n 5p /proc/cpuinfo <span class="p">|</span> cut -d: -f2<span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>ram<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>free -h <span class="p">|</span> sed -n 2p <span class="p">|</span> awk <span class="s1">'{print $3}'</span><span class="k">)</span><span class="s2"> /
|
|
</span></span></span><span class="line"><span class="cl"><span class="s2"> </span><span class="k">$(</span>free -h <span class="p">|</span> sed -n 2p <span class="p">|</span> awk <span class="s1">'{print $2}'</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>swap<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>free -h <span class="p">|</span> sed -n 3p <span class="p">|</span> awk <span class="s1">'{print $3}'</span><span class="k">)</span><span class="s2"> /
|
|
</span></span></span><span class="line"><span class="cl"><span class="s2"> </span><span class="k">$(</span>free -h <span class="p">|</span> sed -n 3p <span class="p">|</span> awk <span class="s1">'{print $2}'</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="o">[</span>display<span class="o">]=</span><span class="s2">"</span><span class="k">$(</span>xrandr <span class="p">|</span> grep <span class="s1">'*'</span> <span class="p">|</span> awk <span class="s1">'{print $1}'</span><span class="k">)</span><span class="s2">,
|
|
</span></span></span><span class="line"><span class="cl"><span class="s2"> </span><span class="k">$(</span>xrandr <span class="p">|</span> grep <span class="s1">'*'</span> <span class="p">|</span> awk <span class="s1">'{print $2}'</span> <span class="p">|</span> sed <span class="s1">'s/*/Hz/ ; s/+//'</span><span class="k">)</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"><span class="o">)</span>
|
|
</span></span></code></pre></div><p>Each of these elements fetches a differenet piece of info. You could just use environment variables to get quite a few things (user), some were an issue of grabbing a particular piece of info from a file (distro name), and some of the more complicated ones I just reformatted output from other commands (ram usage).</p>
|
|
<p>Next order of business: colors. I wanted to put a chunk or randomly colored text at the start of each line so that each time you ran the command you got something that looked a little different. I made this array of escape codes each one referring to a different bold color:</p>
|
|
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">declare</span> -a <span class="nv">colors</span><span class="o">=(</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;30m"</span> <span class="c1"># black</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;31m"</span> <span class="c1"># red</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;32m"</span> <span class="c1"># green</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;33m"</span> <span class="c1"># blue</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;34m"</span> <span class="c1"># yellow</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;35m"</span> <span class="c1"># pink</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;36m"</span> <span class="c1"># magenta</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"\e[0;1;37m"</span> <span class="c1"># white</span>
|
|
</span></span><span class="line"><span class="cl"><span class="o">)</span>
|
|
</span></span></code></pre></div><p>I then repurposed a nice function from someone on stackoverflow to get a random element from this array. The variable ‘pre’ here is the text that I want formatted:</p>
|
|
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">pre</span><span class="o">=</span><span class="s2">"->"</span>
|
|
</span></span><span class="line"><span class="cl">
|
|
</span></span><span class="line"><span class="cl">random_color <span class="o">()</span> <span class="o">{</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="nv">size</span><span class="o">=</span><span class="si">${#</span><span class="nv">colors</span><span class="p">[@]</span><span class="si">}</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="nv">index</span><span class="o">=</span><span class="k">$((</span><span class="nv">$RANDOM</span> <span class="o">%</span> <span class="nv">$size</span><span class="k">))</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">"</span><span class="si">${</span><span class="nv">colors</span><span class="p">[</span><span class="nv">$index</span><span class="p">]</span><span class="si">}${</span><span class="nv">pre</span><span class="si">}</span><span class="s2">\e[0m"</span>
|
|
</span></span><span class="line"><span class="cl"><span class="o">}</span>
|
|
</span></span></code></pre></div><p>My plan was then to simply loop through the array, ’echo-ing’ out the random_color function, the key from the fetch array, a separator, and then the value form the fetch array. This worked mainly, the only issue being that each element from the fetch was not printed in the order it was declared. Ideally, I wanted the fetch elements to be printed in the order they were put in the array so you could configure the how they appeared. Once again my primitive understanding of bash had let me down; I turned to stackoverflow. I found the solution was to define another array containing the fetch keys and then use it to attack the other associative ‘fetch’ array:</p>
|
|
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">declare</span> -a <span class="nv">order</span><span class="o">=(</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"user"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"host"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"uptime"</span> <span class="c1"># uses uptime command</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"kernel"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"distro"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"shell"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"de"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"terminal"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="s2">"editor"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="c1"># "ip" # uses host command</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="c1"># "cpu"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="c1"># "ram" # uses free command</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="c1"># "swap" # uses free also</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="c1"># "root" # uses df command</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="c1"># "battery"</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="c1"># "display" # uses xrandr</span>
|
|
</span></span><span class="line"><span class="cl"><span class="o">)</span>
|
|
</span></span><span class="line"><span class="cl">
|
|
</span></span><span class="line"><span class="cl"><span class="k">for</span> info in <span class="s2">"</span><span class="si">${</span><span class="nv">order</span><span class="p">[@]</span><span class="si">}</span><span class="s2">"</span><span class="p">;</span> <span class="k">do</span>
|
|
</span></span><span class="line"><span class="cl"> <span class="nb">echo</span> -e <span class="s2">"</span><span class="k">$(</span>random_color<span class="k">)</span><span class="s2"> \e[0;1;3m</span><span class="nv">$info</span><span class="s2">\e[0m</span><span class="si">${</span><span class="nv">sep</span><span class="si">}${</span><span class="nv">fetch</span><span class="p">[</span><span class="nv">$info</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span>
|
|
</span></span><span class="line"><span class="cl"><span class="k">done</span>
|
|
</span></span></code></pre></div><p>This had the happy unintended consequence of allowing you to very easily configure which items you wanted in the fetch by simply commenting out keys from the order array. You can check out the script in its entirety <a href="https://gitlab.com/robbygozzarder/golazo">here</a>. This is a pretty picture of a few variations.</p>
|
|
<p><img src="/image/golazo.png" alt="golazo"></p>
|
|
</article>
|
|
</main>
|
|
|
|
<footer id="footer">
|
|
<p>-----------------</p>
|
|
<small>
|
|
made with <a href="https://gohugo.io">hugo</a> and my bastardised version of
|
|
<a href="https://github.com/LukasJoswiak/etch">this nice theme</a>
|
|
</small>
|
|
|
|
<script src="/js/search.js"></script>
|
|
<script src="/js/toggle.js"></script>
|
|
</footer>
|
|
|
|
</body>
|
|
</html>
|