r_bash – Telegram
how to change prompt(+command) just before execution (PS0)

Hi, it is easy to invert the colors of my prompt+command: PS1="\e[7m> "; PS0="\e[27m". I want to achieve this look, but only after hitting enter. Does anyone have an idea how to achieve this?

https://redd.it/1i3pr9t
@r_bash
Recommendations for optimizations to bash alias

I created a simple alias to list contents of a folder. It just makes life easier for me.

alias perms="perms"
function perms
{

END=$'\e[0m'
FUCHSIA2=$'\e[38;5;198m'
GREEN=$'\e[38;5;2m'
GREY2=$'\e[38;5;244m'

for f in *; do
ICON=$(stat -c '%F' $f)
NAME=$(stat -c '%n' $f)
PERMS=$(stat -c '%A %a' $f)
FILESIZE=$(du -sh $f | awk '{ print $1}')
UGROUP=$(stat -c '%U:%G' $f)
ICON=$(awk '{gsub(/symbolic link/,"🔗");gsub(/regular empty file/,"");gsub(/regular file/,"📄");gsub(/directory/,"📁")}1' <<<"$ICON")

printf '%-10s %-50s %-17s %-22s %-30s\n' "${END}‎ ‎ ${ICON}" "${GREEN}${NAME}${END}" "${PERMS}" "${GREY2}${FILESIZE}${END}" "${FUCHSIA2}${UGROUP}${END}"
done;
}


It works pretty well, however, it's not instant. Nor is it really "semi instant". If I have a folder of about 30 or so items (mixed between folders, files, symlinks, etc). It takes a good 5-7 seconds to list everything.

So the question becomes, is their a more effecient way of doing this. I threw everything inside the function so it is easier to read, so it needs cleaned.

Initially I was using sed for replacements, I read online that awk is faster, and I had originally used multiple steps to replace. Once I switched to awk, I added all the replacements to a single command, hoping to speed it up.

And originally, I was using a single stat command, and using all of the flags, but then if you had files of different lengths, then it started to look like jenga, with the columns mis-aligned. That's when I broke it up into different calls, that way I could format it with printf.

Originally it was:
file=$(stat -c ' %F  %A     %a    %U:%G         %n' $1)


So I'm assuming that the most costly action here, is the constant need to re-run stat in order to grab another piece of information.

Any pointers would be great. Hopefully I can get this semi-fast. It seems stupid, but it really helps with seeing my data.


https://redd.it/1i4nou3
@r_bash
Export ain't working I'm so confused

So apparently if you change a variable and then export it, then say you open a new terminal then the variable would have changed, but this didn't work for me, even with child processes like so:

I did:

PS1="Bash is cool! "

export PS1

Then:

qterminal

but the shell prompt was still default

and even if I did the following but instead of qterminal I wrote "bash" (to show a new prompt), then it was still the same.


Why???

https://redd.it/1i5gder
@r_bash
Help with Permission Issue in Bash Script (Cronjob)

Hey everyone, I’ve been stuck on an issue for a while and hope someone here can help me out. I’m trying to run a Bash noscript with Cron that creates Restic backups and stores a PID file. However, I keep getting the following error: Line 60: /var/tmp/restic_backup.pid: Permission denied I’ve already verified that /var/tmp/ has the correct permissions: drwxrwxrwt 16 root root 4096 Jan 20 10:50 /var/tmp The cron job is running as the correct user (poan). I’ve also tried changing the noscript to write in other directories like /tmp/ or /home/poan/tmp/, but the error still persists. Does anyone have any ideas on what I might be overlooking or what else I can try to resolve the issue? Any tips would be greatly appreciated! Thanks in advance!

https://redd.it/1i5n4c1
@r_bash
Command substitution problem

I do have a problem that drives me crazy:

I have a binary that needs to be run in a bash noscript, but in some case fails and then needs to be run in a chroot for the rest of the noscript.

When it first fails I set a variable RUN_IN_CHROOT=yes.

I catch the output of the binary via command substitution.

So my noscript looks like this:

MY_BINARY=/path/to/binary
mode=$(${MY_BINARY} -m $param1)

If that doesn't work:
RUN_IN_CHROOT=yes

mode=$(${RUN_IN_CHROOT:+chroot} ${RUN_IN_CHROOT:+/mnt} ${MY_BINARY} -m $param1)

So from this point every call to the binary has the RUN_IN_CHROOT checks and should prepend the chroot /mnt.

But I get the error: chroot /mnt: No such file or directory

It treats both as a single command, which can obviously not be found.

When I run with bash -x I see that it tries to call 'chroot /mnt' /path/to/binary -m 8

Why does it encapsulate it in this weird way, and how can I stop it from doing so?

Thanks for your help.

Sorry for the lack of formatting.

https://redd.it/1i5ohag
@r_bash
I made a simple "UI Library" for bash called basil. And a small helper for sourcing the library and creating a ready to run file.

Black and white mode

normal mode

retro mode

BASIL

https://redd.it/1i5sn8w
@r_bash
rmdir "No such file or directory" but ls shows folder isn't empty

I am trying to clean up some old media files.

When I use ls to show the contents of my current folder, it lists one folder. When I use rmdir to remove that folder, it states:

ls: folder: No such file or directory


How do I get rid of the target directory?

https://redd.it/1i61br6
@r_bash
Error oh my bash theme development

Good evening everyone, I'm making another theme for Oh My Bash that has the same base as my old theme, but it's not overwriting the base properly, these are the codes



New theme



if [ -z "${NEKONIGHT_BASE_LOADED}" ]; then
source ~/.oh-my-bash/themes/nekonight/nekonight-base.sh
export NEKONIGHT_BASE_LOADED=true
fi


icon_start="╭─"
icon_user=" 🌙 ${_omb_prompt_bold_olive}\u${_omb_prompt_normal}"
icon_host=" at 🌙 ${_omb_prompt_bold_cyan}\h${_omb_prompt_normal}"
icon_directory=" in 🌙 ${_omb_prompt_bold_magenta}\w${_omb_prompt_normal}"
icon_end="╰─${_omb_prompt_bold_white}λ${_omb_prompt_normal}"

_omb_theme_nekonight_git_prompt_info
_omb_theme_nekonight_scm_git_status

function _omb_theme_PROMPT_COMMAND() {
PS1="${icon_start}${icon_user}${icon_host}${icon_directory} in $(_omb_theme_nekonight_git_prompt_info)\n${icon_end} "
}

_omb_util_add_prompt_command _omb_theme_PROMPT_COMMAND





Base theme


 shell
icon_start="╭─"
icon_user=" 🐱 ${_omb_prompt_bold_olive}\u${_omb_prompt_normal}"
icon_host=" at 🐱 ${_omb_prompt_bold_cyan}\h${_omb_prompt_normal}"
icon_directory=" in 🐱 ${_omb_prompt_bold_magenta}\w${_omb_prompt_normal}"
icon_end="╰─${_omb_prompt_bold_white}λ${_omb_prompt_normal}"

function _omb_theme_nekonight_git_prompt_info() {
local branch_name
branch_name=$(git symbolic-ref --short HEAD 2>/dev/null)
local git_status=""

if [[ -n $branch_name ]]; then
git_status="${_omb_prompt_bold_white}(🐱 $branch_name $(_omb_theme_nekonight_scm_git_status))${_omb_prompt_normal}"
fi

echo -n "$git_status"
}

function _omb_theme_nekonight_scm_git_status() {
local git_status=""

if git rev-list --count --left-right @{upstream}...HEAD 2>/dev/null | grep -Eq '^[0-9]+\s[0-9]+$'; then
git_status+="${_omb_prompt_brown}↓${_omb_prompt_normal} "
fi

if [[ -n $(git diff --cached --name-status 2>/dev/null) ]]; then
git_status+="${_omb_prompt_green}+${_omb_prompt_normal}"
fi

if [[ -n $(git diff --name-status 2>/dev/null) ]]; then
git_status+="${_omb_prompt_yellow}•${_omb_prompt_normal}"
fi

if [[ -n $(git ls-files --others --exclude-standard 2>/dev/null) ]]; then
git_status+="${_omb_prompt_red}⌀${_omb_prompt_normal}"
fi

echo -n "$git_status"
}





The prompt gets all buggy, it looks like this


\\\[\\e\[97;1m\\\](🐱 main \\\[\\e\[0;31m\\\]↓\\\[\\e\[0m\\\] \\\[\\e\[0;93m\\\]•\\\[\\e\[0m\\\]\\\[\\e\[0;91m\\\]⌀\\\[\\e\[0m\\\])\\\[\\e\[0m\\\]\\\[\\e\[0;31m\\\]↓\\\[\\e\[0m\\\] \\\[\\e\[0;93m\\\]•\\\[\\e\[0m\\\]\\\[\\e\[0m\\\]╭─ 🌙 brunociccarino at 🌙 DESKTOP-27DNBRN in 🌙 \~ in (🐱 main ↓ •⌀)

╰─λ


https://redd.it/1i6wedj
@r_bash
style enforcement tool?

Hi folks, looking for a sh and bash enforcement tool. I found bashate but seems too limited.

https://redd.it/1i5yexv
@r_bash
Sed replacement with a variable needs single and double quotes

Hi all, this may be a stupid question, so sorry in advance. I have just started to get into the world of bash noscripting, and I decided to create an install noscript for my NixOS build. Within that, I want to create a new host, so I have decided to use sed to add a block of Nix code from a text file in place of a comment that I have there by default. The problem arises then that I need to evaluate bash noscript within it using double quotes "" as well as using the s option at the start, which from what I can see only works with single quotes ''.
From what I could find when googling this, I need to exit the single quotes with double quotes when writing the expression, then go back to singles to finish it.
https://askubuntu.com/questions/1390037/using-sed-with-a-variable-inside-double-quote

So this is what i have so far sudo sed -i 's|#Install new host hook|'"$(< /etc/nixos/noscripts/helperFiles/newHostFlakeBlock.txt)"'|' /etc/nixos/flake.nix

https://redd.it/1i8te4k
@r_bash
Creating a simple latex launcher

Hello!

I'm not sure I'm posting in the good subreddit, don't hesitate to redirect me!

I've a little problem I'm not able to solve, because I don't understand well enough the problem to know where to search.

I would like to create a noscript that manages a .tex file such as :
- it opens a terminal and launches latex -pdf -pvc $FILE, $FILE being the argument file
- it opens the file with kwrite

Ideally, I declare this noscript as an application that I can set as the default application for .tex files. This way, when I double click on the file every of these actions execute themselves.

I first tried to create a latex.sh noscript (yes it's executable) :

#!/bin/bash
latexmk -pdf -pvc $1 &
kwrite $1 &


Then I added a .desktop file in ~/.local/share/applications and tried to open a .tex file with this application. Without surprise it does not work, but I don't really know what exactly is the process I want to see in the system so it's difficult to improve the noscript...

Thanks in advance for your help!

https://redd.it/1i8aa47
@r_bash
Importance of checking IFS

I just wanted to spread a word about importance of explicitly defining and assigning values to IFS.

After years of noscripting in bash in Ubuntu i never thought of non standard IFS values in other linux based operating systems.

Few minutes ago figured out why some of my noscripts weren’t working properly in openwrt. IFS in openwrt contains only /n newline character vs tab space and newline.

Can be checked by looking into environment via set (printenv is not installed by default) or simply by echoing IFS and piping into cat: echo “$IFS” | cat -A

Hope this will save someone down the road from wasting hours on debugging.

My noscripts weren’t working simply copied to openwrt as they were working on Ubuntu and didnt show any issues at first glance. I want to pinpoint here that i didnt write in openwrt environment or else i would have checked IFS. From now on i will make a habit to assign it right after the shebang.

Thanks.

https://redd.it/1i9qz8r
@r_bash
HELP!

I'm trying to make a simple OS that uses BASH and coreutils as a base.
I searched and asked to chatgpt how to compile it to a unknown os and basically everything went wrong.

btw, i'm on windows 11 with nasm,gcc, mingw, msys2 and Arch WSL.
Can someone help me?

https://redd.it/1i9qukp
@r_bash
Chatgpt in bash

Hi, first post here so please go easy..... !

I love modifying bash, and have recently thought about having Chatgpt work directly from bash by just typing a simple command whenever needed/wanted. As a result i have created the following, it seems to work fine and have added a menu to it for added functionality.

Feedback would be most welcome please - https://github.com/Fenlanddavid/AI-command/blob/main/gpt.sh

https://redd.it/1ial3l3
@r_bash
Simple noscript to integrate chat-gpt into bash

Will try this post again now...

I love messing around and modifying bash, my latest project has been to integrate chat-gpt into the command line. wanted to just type a normal command and have it reply whenever i needed/wanted it too. It became a little more complicated as i went on and had to add various functions such as save session memory for it to be effective-also added a simple menu. Works ok on my system but just after a little feedback please **you will need your own openai API key**

https://github.com/Fenlanddavid/arch-ai

Ps- did attach image but does not seem to be displaying.....

https://redd.it/1iap1xd
@r_bash
Shunpo: A Bash Tool for Quick Directory Navigation

Hi fellow redditors. I recently wrote a minimalistic navigation tool for bash. A few of my colleagues liked it, so I thought I'd make the repository public and share it. Here's a video demo-ing it . I hope it helps speed up your navigation!

Link to the repo:
https://github.com/egurapha/Shunpo

Link to a youtube video:
https://www.youtube.com/watch?v=TN66A3MPo50

https://i.redd.it/o2t12nrceefe1.gif

https://redd.it/1iap8nv
@r_bash
YAML manipulating with basic tools, without yq

The problem. I have a YAML file with this:

network:
version: 2
renderer: networkd
ethernets:
wifis:
wlx44334c47dec3:
dhcp4: true
dhcp6: true

As you can see, there is an empty section ethernets, but we could also have wifis section empty. This is invalid structure and I need to remove those empty sections:

This result:

network:
version: 2
renderer: networkd
wifis:
wlx44334c47dec3:
dhcp4: true
dhcp6: true

can be achieved easily with:

yq -y 'del(.network.ethernets | select(length == 0)) | del(.network.wifis | select(length == 0))'

But I want to achieve the same with sed / awk / regex. Any idea how?

https://redd.it/1ib15ky
@r_bash
want to print only the real time

time ./prog

real 0m0.004s
user 0m0.001s
sys 0m0.003s

but i only want to print the first line

real 0m0.004s or 0m0.004s

is there any way ?```

https://redd.it/1ib76ah
@r_bash
convert nested css to standard syntax css

Hi im new in this sub and i don't have much experience with bash in general, i was trying to create a noscript that allows me to convert nested css that has multi-selector in to standard css, currently i got my noscript working for nested css, but it seem i can't find a way to eleaborate multi selector (es. #foo, .bar).
Also tryed to ask gpt but it just added some comments and made me feel more miserable.
Can someone give me a hand?

#!/bin/bash

# Ensure the noscript receives correct arguments
if [ "$#" -ne 2 ]; then
    echo "Usage: $0 input_file output_file"
    exit 1
fi

input_file=$1
output_file=$2

# Check if the input file exists and is readable
if [ ! -f "$input_file" ]; then
    echo "Error: Input file '$input_file' does not exist or is not a file."
    exit 1
fi

# Create or clear the output file
>"$output_file"

# Initialize variables
current_selector=""
current_styles=""
parent_selector_stack=()
multi_selector_members=()
is_multi_selector=false
media_query=false

# Function to flush a selector and its styles
flush_selector() {
    trimmed_current_styles=$(echo "$current_styles" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
    trimmed_current_selector=$(echo "$current_selector" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
    check_style=$(echo "$current_styles" | tr -d '[:space:]\\n')

    # Only flush if the selector and styles are not empty
    if [ -n "$trimmed_current_selector" ] && [ -n "$check_style" ]; then
        {
            echo "$trimmed_current_selector {"
            echo -e "$trimmed_current_styles"
            echo "}"
        } >>"$output_file"
    fi
    current_styles=""
}

# Handle multi-selectors (combine selectors with commas and ensure proper space)
handle_multi_selectors_with_children() {
    local base_selectors=("$@")
    local child_selector="$current_selector"
    local combined_selectors=""

    # Loop through each base selector and append the child selector
    for base_selector in "${base_selectors[@]}"; do
        if [ -n "$child_selector" ]; then
            combined_selectors+="$base_selector $child_selector, "
        else
            combined_selectors+="$base_selector, "
        fi
    done

    # Remove trailing comma and space
    combined_selectors=$(echo "$combined_selectors" | sed 's/, $//')

    echo "$combined_selectors"
}

# Read the input file line by line
while IFS= read -r line || [ -n "$line" ]; do
    # Remove leading and trailing whitespace
    line=$(echo "$line" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

    if [[ "$line" =~ ^@media ]]; then
        # If it's a media query, start a new media query block
        flush_selector
        media_query=true
        current_selector=$(echo "$line" | sed 's/{//g')
        parent_selector_stack=("$current_selector")
        continue
    elif [[ "$line" =~ ^[.#\[][^,{]*\{$ ]]; then
        # Handle new selector block or nested multi-selector
        if [ "$is_multi_selector" = true ]; then
            # If multi-selector handling was active, expand them with the current child selector
            expanded_selectors=$(handle_multi_selectors_with_children "${multi_selector_members[@]}")
            current_selector="$expanded_selectors"
            flush_selector
            multi_selector_members=() # Clear the multi-selector list
            is_multi_selector=false
        fi

        # Flush the previous selector before processing the new one
        flush_selector

        # Extract the current selector and add it to the multi-selector array if needed
        new_selector=$(echo "$line" | sed 's/{//g' | tr -d '\n')

        if [ "$is_multi_selector" = true ]; then