r_bash
43 subscribers
350 photos
16 videos
8.42K links
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Free online editor where you can write Bash scripts, run them, take notes, and export to PDF
https://redd.it/1sd0v1g
@r_bash
Clean WhatsApp messages

MYNAME="Homer Simpson" sed -E "s/^[[^]]+] ${MYNAME}: //" | sed -E "s/^[^]+] ^:+: /> /"

# Before

17:09, 4/5/2026 Homer Simpson: Nuclear plant back online!
17:09, 4/5/2026 Mr. Burns: Thank you for this. Who are you again?
17:10, 4/5/2026 Homer Simpson: Homer Simpson, sir 😅

# After

Nuclear plant back online!
> Thank you for this. Who are you again?
Homer Simpson, sir 😅

https://redd.it/1sdjuja
@r_bash
tool for helping me find commands

I've struggled a lot moving to linux from windows, and one of the things that has been a thorn in my side has been forgetting what commands to use, what they are called, and how to use them correctly.

Today I made myself this little tool to make life easier so I don't have to scroll through loads of 'man' pages just getting more confused. It's not a professional tool by any means, it was literally just made this morning to solve a basic problem, but I figured if it's useful for me it's probably useful to others too.

I am not great at linux, at software, at git, or anything like some people here, so don't tear me apart just because my tool sucks. I am aware. But it made my life easier, and i hope it will help others who are struggling.

https://github.com/koryfargodev/mytools

https://preview.redd.it/e3ezellgk7tg1.png?width=656&format=png&auto=webp&s=5446c86e4d8968a52859aa29ac328db7e68a1d96

https://redd.it/1scf9ss
@r_bash
Is using $SHLVL a good way to tell if a script is running in a terminal window?

So, I want to make it so that a script I'm running will ONLY run in a terminal emulator window, and will sleep for 3 seconds then exit if it's not in a terminal emulator window. I've done a little bit of looking, but I'm not entirely sure if it would work as I intend, and if there are ways in which it could fail/if there are more reliable methods.i was thinking of something along the lines of:

If $SHLVL > 1 then
Echo running in terminal
Echo continuing
Elif $SHLVL =< 1 then
Sleep 3
Exit
Else
Echo how is this even possible?
Fi

(Obviously that's not correct syntax, it's just the general structure/idea of what I want to do) I'm not at my PC rn (on a road trip) but I'm trying to write a general test script on my phone that I can test on my PC once I return home.

Edit: to clarify I should mention that I'm on Debian x86_64, and when I say "in a terminal window" I mean that it's running with stout and sterr being displayed on a terminal emulator window, and stdin being read from the terminal emulator window.

https://redd.it/1schwjv
@r_bash
Why does grep .* skip . and .. in ls -a output?

Let me clarify the situation first. As we know `ls -a` shows all files including `.` (current directory) and `..` (parent directory).

And If we want to print only the hidden files excluding `.` and `..` . We can run `echo .[!.]*` , and we can also use `ls -A | grep .*` it will not look as clean as `echo .[!.]*` but works. and I used `-A` because it already excludes `.` and `..` .

But i suppose If I run `ls -a | grep .*` , shouldn’t it also show `.` and `..`? But It doesn’t, those two entries are missing as if I'm using `-A` .

Am I misunderstanding how `grep .*` behaves here?

Be kind please even if it's something obvious, the noob is still learning.

https://redd.it/1sbuopd
@r_bash
How declarative can bash scripts get?

I'm doing sanity testing of containers using bash and wonder how close I can get bash to the testing workflow of tools like Playwright.

For example. Here is my current script for 1 sanity test

#!/bin/bash
set -euo pipefail


PASS=0
FAIL=0
GREEN='\0330;32m'
RED='\033[0;31m'
RESET='\033[0m'


ok() {
echo -e " ${GREEN}[PASS${RESET} $"
((++PASS))
}
fail() {
echo -e " ${RED}[FAIL]${RESET} $
"
((++FAIL))
}

echo ""
echo "=== 1. Container status ==="
if podman inspect "$CONTAINER" --format '{{.State.Running}}' 2>/dev/null | grep -q true; then
ok "Container '$CONTAINER' is running"
else
fail "Container '$CONTAINER' is NOT running"
fi

Here's my first attempt at making it more declarative:


describe() {
echo ""
echo "--- $1 ---"
}


it() {
local title=$1
shift
if "$@"; then ok "$title"; else fail "$title"; fi
}

containerisrunning() {
podman inspect "$CONTAINER" --format '{{.State.Running}}' 2>/dev/null | grep -q true
}


describe "Container"
it "container '$CONTAINER' is running" podman inspect "$CONTAINER" --format '{{.State.Running}}' 2>/dev/null | grep -q true


Ultimately, i'm not going to go with the second style since it it's not that readable. I can't pass the function body as an arugment as you'd do in JS and the alternatives (eval) will make the code worse.

Before I chuck this whole concept down, I thought I'd make a post and see if thats really impossible in Bash, or I may be missing something.



https://redd.it/1sahl6s
@r_bash
cURL file upload patterns - multipart, batch uploads, xargs, and piping from stdin

Kept re googling the same cURL commands for uploading files, so I put everything in one place.

Covers:
\- Basic upload with -F
\- Auth headers and API keys
\- Looping through a directory
\- Parallel uploads with xargs
\- Piping tar output directly into an upload endpoint
\- What -F, -H, -X, -o, and --max-time actually do
\- Common errors like 413, 401, and 400, plus how to fix them

https://filepost.dev/blog/how-to-upload-files-with-curl

Hopefully this saves someone else the same trial and error.

https://redd.it/1sdvw2w
@r_bash
Best learning resource

Dear Linux administrators, how did you learn bash and bash scripting and what are the best ways you’ve used bash in enterprise environments? Give some examples of how you’ve used bash in server side scripting, infrastructure operations and automation and tell us what resources did you use to learn as a beginner to get to where you are now?

https://redd.it/1sdz4k9
@r_bash
Shell function for installing/removing packages using fzf!

A shell function for removing/installing packages from AUR, system repos and flatpak mainly only using fzf as dependency. Should work with most Arch Linux based distros(I am on CachyOS and works perfectly) if you have fzf, yay installed and AUR enabled :)


mngpkg() {
local selections=$( (
yay -Slq | awk '{print "[yay-ins] " $1}' &
flatpak remote-ls flathub --columns=application | awk '{print "[flt-ins] " $1}' &
pacman -Qq | awk '{print "[yay-rm] " $1}' &
flatpak list --app --columns=application | awk '{print "[flt-rm] " $1}' &
wait
) | fzf --multi --header 'Search All Repos & Installed Apps (Tab to select)' \
--preview '
tag=$(echo {} | awk "{print \$1}");
pkg=$(echo {} | awk "{print \$2}");
if [ "$tag" = "[yay-ins]" ]; then
yay -Si "$pkg"
elif [ "$tag" = "[yay-rm]" ]; then
pacman -Qi "$pkg"
elif [ "$tag" = "[flt-ins]" ]; then
flatpak remote-info flathub "$pkg"
elif [ "$tag" = "[flt-rm]" ]; then
flatpak info "$pkg"
fi
' )

[ -z "$selections" ] && return

local yay_in=$(echo "$selections" | grep '^\[yay-ins\]' | awk '{print $2}')
local flat_in=$(echo "$selections" | grep '^\[flt-ins\]' | awk '{print $2}')
local yay_rm=$(echo "$selections" | grep '^\[yay-rm\]' | awk '{print $2}')
local flat_rm=$(echo "$selections" | grep '^\[flt-rm\]' | awk '{print $2}')

if [ -n "$yay_rm" ] || [ -n "$flat_rm" ]; then
printf "Delete app data and configuration files for removed packages? (y/N): "
read -r delete_data
fi

if [ -n "$yay_rm" ]; then
if [[ "$delete_data" =~ ^[Yy]$ ]]; then
echo "$yay_rm" | xargs -ro sudo pacman -Rns
else
echo "$yay_rm" | xargs -ro sudo pacman -Rs
fi
fi

if [ -n "$flat_rm" ]; then
if [[ "$delete_data" =~ ^[Yy]$ ]]; then
echo "$flat_rm" | xargs -ro flatpak uninstall --delete-data
else
echo "$flat_rm" | xargs -ro flatpak uninstall
fi
fi

if [ -n "$yay_in" ]; then
echo "$yay_in" | xargs -ro yay -S
fi

if [ -n "$flat_in" ]; then
echo "$flat_in" | xargs -ro flatpak install flathub
fi
}


https://redd.it/1se2jym
@r_bash
Hi - sharing a tool where you can expose Bash commands with guardrails
https://redd.it/1sfxbf9
@r_bash
radiosh - A minimalist, lightning-fast terminal radio player written in pure Bash
https://redd.it/1sg3yu0
@r_bash
What happened to Greg's Wiki?

https://mywiki.wooledge.org/BashProgramming was gone this morning. Anyone seen it?

https://redd.it/1sg43dq
@r_bash
Tetris in bash

I had no reason to do this other than learning, but I got Tetris running in bash. I severely underestimated how hard this was going to be. But it works surprisingly well.

Learned way too much about terminal control along the way. Feedback welcome :)

Repo:

https://github.com/benny-e/bash-tetris.git

https://redd.it/1sgunm7
@r_bash
what's the proper way to set a script to run on startup?

i tried to set protonvpn to connect automatically when i log in, and when it couldn't connect for the first time, cachy fully stopped booting lmfao

had to TTY in and delete the script just so it wouldnt hang on a black screen

am i an idiot for putting it in /etc/profile.d/ ? what's the safe way to go about it?

also open to good resources about bash scripting just for users, im not really doing any enterprise level shit and a lot of it seems geared towards that. i just wanna be a power user like i was with windows, 20 years of using that shit and i feel like a baby on linux :(

https://redd.it/1sh40jq
@r_bash
Shellac: Shell scripting library, a hands-on AI review

**TL;DR:** I used Claude Code for advancing a shell library project and was expecting bad times. Most things turned out better than expected.

---

**First, the links:**

* [Github repo](https://github.com/rawiriblundell/shellac)
* [Documentation](https://rawiriblundell.github.io/shellac/)
* There are a couple of dedicated pages in there that are relevant to this post:
* [Use of AI](https://rawiriblundell.github.io/shellac/docs/Use%20of%20AI/) <-- Has some performance metrics.
* [On Vibe Coding](https://rawiriblundell.github.io/shellac/docs/on_vibe_coding/) <-- Seriously, read this one.

I'm going to state upfront that the most obvious AI-slop is the single-shot use of ChatGPT to generate a logo. All other AI use was Claude Code with constraints that we'll get to soon. I'm also going to state upfront that I don't expect this project to go anywhere - it's just me itching a scratch for fun. If there's something in there that's of use to you, then that's great.

**Context:**

So as some regulars of this subreddit might recall, a few years back I dumped a bunch of code out of my code attic and structured it into a library framework. I also curated a list of similar shell library projects, which I've shared many times in this subreddit. Then life, work and the universe drew my attention away from that project and it spun down.

I was recently irked by the AI slop being blindly spammed across multiple technical subreddits. You know the ones: lots of emdashes, emojis, and predictable sentences promoting some low-effort vibe-coded mess.

But... don't knock it until you try it, as they say. I've actually been using Claude and Claude Code as a websearch-on-steroids, proof-reader, and [rubber duck](https://en.wikipedia.org/wiki/Rubber_duck_debugging) for some time now, so I figured: Why not point that rubber duck at my shell library project and let's see what happens?

I have to say I'm reasonably and conditionally impressed with the results, and I think that *how* I've used AI is specifically what makes the difference between this and some of the slop posts we've all seen in this subreddit and elsewhere.

**Achievements and metrics:**

More detail with tables and graphs can be found [here](https://rawiriblundell.github.io/shellac/docs/Use%20of%20AI/). Some highlights below.

In 23 active days:

* 315 commits
* Function count: 700-ish -> 828.
* Yeah, lots of batteries included. A kitchen sink full of them.
* 44 Github Issues opened, 59 closed (pre-existing ones were addressed/closed)
* I use GH issues as a task tracker and a way to maintain some independent state between Claude sessions.
* The integration is easy to setup and seamless to operate directly within Claude code.
* Stand up of BATS testing
* 84 bats test files created, covering 1432 tests
* 16 bugs were subsequently found and addressed.
* Review of 58 similar repos.
* Those with compatible licenses were reviewed for code that made sense to add to this one.
* Attribution is a strict non-negotiable for me
* Review against stdlibs of a handful of other languages to identify any coverage holes
* Multiple codebase-wide sweeps for standards compliance and several significant refactors
* Implementation of mkdocs with CI pipeline
* Time saved:
* ~13 months when compared to the previous cadence of "30 minutes a night, a couple nights a week"
* 3.5 months saved when compared to a stricter "30 minutes every night" cadence
* Force multiplier: Claude peaked at approx 75x at 6-7 days in, and that number will obviously go down as the codebase settles. It is currently sitting at 27x.

**So, how/why is this any different to any other vibe-slop post?**

Very simply:

* I started with a whole bunch of existing code, standards and a structure already.
* I have curated Claude code's configuration. These are covered at a high level in [the documentation](https://rawiriblundell.github.io/shellac/docs/Use%20of%20AI/#guiding-inputs):
* `~/.claude/CLAUDE.md` (95% [Karpathy's
CLAUDE.md](https://raw.githubusercontent.com/forrestchang/andrej-karpathy-skills/refs/heads/main/CLAUDE.md))
* `~/.claude/rules/deslop.md` General deslop guidance using [this resource](https://www.mooch.agency/deslop-a60e4b10f9df43f3bf6ea366eed1b31f)
* `~/.claude/rules/shell-scripting.md` Shell style guidelines and rules.
* `~/.claude/rules/shellac.md` Project-specific guidelines
* The above two files have been merged into a [CLAUDE.md in the project root](https://github.com/rawiriblundell/shellac/blob/main/CLAUDE.md).
* I was intentionally clear with my instructions, and firm when necessary, giving less room for Claude Code to go off on tangents
* I tried to remain consciously in the loop, rather than letting Claude completely have at it

By defining my expectations for coding style, standards, edge case handling etc, Claude Code behaved a lot closer to my expectations. In other breaking news: computer does as it's bloody told.

And I really think that's it: [Don't vibe code](https://rawiriblundell.github.io/shellac/docs/on_vibe_coding/), AI is a tool, configure the damn tool and use it properly.

**Now, my concerns:**

I do genuinely believe that if I were to lean back and rely on AI more, then my comprehension level would fade. I might learn the odd thing here and there, but those would be stored in my head as vague memories rather than baked into muscle memory. I have personally lost half a dozen languages, both programming and spoken, through non-use and subsequent atrophy. And I don't know about you guys, but I think that there's a fun-side to shell scripting; in the challenge of making it work well despite its warts and limitations. Just blindly handing that over to an LLM kinda sucks the joy out of it.

Without a deeper understanding first of a knowledge domain, AI has an almost immeasurable ability to misguide. Those using AI to learn `bash` will still pick up crappy habits, just faster and more confidently than they would have from blindly copying out of StackOverflow like a lot of us probably did. These days, if I see a submission that includes the Unofficial Strict Mode, I see that as a vibe-coding red-flag.

I estimate that Claude Code was abjectly wrong about 5% of the time, and required pushbacks and clarifications maybe another 5% of the time. And that's Claude Code that has been intentionally setup!

**So let's bring this in to land:**

I shared this experience because I do think that the skill-atrophy risk is perhaps under-discussed. Most AI concerns seem to revolve around poor quality outputs, negative impacts on upskilling newcomers and potential job losses. These are certainly real concerns, but they're also kinda abstract if you're not directly impacted. Losing your own hard-earned skills is more insidious, in my view.

The [Handyman's Invoice](https://www.snopes.com/fact-check/know-where-man/) story might resonate here, too. The value isn't in knowing how to chalk the mark, it's in knowing _where_ to chalk it. AI is the same: if you don't fluently understand the domain, you can't catch it out when it's wrong.

So feel free to have a poke around the codebase, ask questions, give feedback etc. Give my mind something to do so that it doesn't dissolve to a sedentary mush :)

https://redd.it/1shex3u
@r_bash