r_bash – Telegram
can you make a text game in bash?

i just randomly started learning bash from youtube 4 fun although it'd be useful too for what i am doing and my job in the future, and now i have a question, can you make a decent text game in bash? i'd be quite fun to do so

https://redd.it/1agnvoh
@r_bash
Alias for Executable in Makefile

How do I make an executable an alias? So if I had an executable called ./out, and I wanted to run call "out2" to run the executable instead, how'd I do it?

I want to know because I want to run an executable file without having to use a command that starts with "./"

https://redd.it/1agpwug
@r_bash
Dynamic FFmpeg build noscript with extra codecs activated

This noscript represents the result of significant effort to compile FFmpeg while incorporating numerous additional programs into its code all done in Bash.

When you execute the noscript multiple times, it will automatically track the current version of each program. If a newer version is detected, it will update them accordingly. This ensures that you consistently have access to the latest code when building and running FFmpeg.

The noscript will detect if you have Nvidia GPU's and ask if you want to install the CUDA SDK toolkit. It will also detect AMD and install header files for it's GPU.

​

Supported Codecs

GitHub Script

https://redd.it/1agri1v
@r_bash
Why does this math expression throw an error and how can I catch it?

The purpose is to convert a string to +ve int. It works except for if the string begins with a number.

echo "$(( "9" ))"

>9

echo "$(( "99" ))"

> 99

echo "$(( "word" ))"

> 0

echo "$(( "word9" ))"

> 0

echo "$(( "9word" ))"

> bash: 9word: value too great for base (error token is "9word")

echo "$(( "99word" ))"

> bash: 99word: value too great for base (error token is "99word")


I don't much care if "9word" fails but I'd like for it to evaluate to 0.

https://redd.it/1ahqmmw
@r_bash
Help with a noscript

Hello everyone. I have problems with this noscript (not sure if it is the noscript itself). I created a cron job with sudo (otherwise it does not send the system to sleep). However, the system does not wake on demanded time, i.e., the noscript only works to send system to sleep.
I have already checked bios and it is configured.

This is code!

# Path to the log file
LOG_FILE="/home/user/folder/Logs/nameofnoscript.txt"

# Set sleep time (23:00h) and wake up time (06:00h)
SLEEP_TIME="23:00:00"
WAKE_UP_TIME="06:00:00"

# Get current date
CURRENT_DATE=$(date +"%Y-%m-%d")

# Convert sleep and wake up times to timestamps
SLEEP_TIMESTAMP=$(date -d "$CURRENT_DATE $SLEEP_TIME" +%s)
WAKE_UP_TIMESTAMP=$(date -d "$CURRENT_DATE $WAKE_UP_TIME" +%s)

# Calculate time difference until next suspension
TIME_DIFFERENCE=$((SLEEP_TIMESTAMP - $(date +%s)))

# Check if sleep time has already passed for today; if so, adjust for tomorrow
if [ $TIME_DIFFERENCE -lt 0 ]; then
SLEEP_TIMESTAMP=$((SLEEP_TIMESTAMP + 86400)) # Add 24 hours (in seconds)
TIME_DIFFERENCE=$((SLEEP_TIMESTAMP - $(date +%s)))
fi

# Log next suspension
echo "Next scheduled suspension for: $(date -d @$SLEEP_TIMESTAMP)" >> $LOG_FILE

# Schedule suspension using rtcwake
sudo rtcwake -m mem -t $SLEEP_TIMESTAMP >> $LOG_FILE 2>&1

# Log suspension completed
echo "System suspended at: $(date)" >> $LOG_FILE

Could anybody help or point me the right direction?

https://redd.it/1ahsvct
@r_bash
Running noscripts from master noscript causes them to fail

I have multiple bash noscripts that run in sequence. Normally they are scheduled as cron jobs and work perfectly. But, we want to change the process in which they are run - basically if one of them fails the others will not execute.

So, I decided to put them in a master noscript which calls the other noscripts in sequence. It checks the exit code from each noscript and only executes the next one if the exit code was 0. It sends an alert via email and SMS if there was an error.

The problem is, the individual jobs run just fine as cron jobs but sometimes fail when run from the master cron job. I added a ton of logging, including the old "$logfile" 2>&1, and there is really no reason for the failure. It just randomly fails. The exit code in the called job is 0, but the master noscript thinks it is not.

Is there some trick to getting something like this to work? Am I doing something stupid here and there is a better way to do it?


#!/bin/bash
logger -s "SCRIPT - FOOBARSCRIPTS - Started at $(date)"
. /home/noscripts/alerts/alerts.function
log
file="/fee/fi/fo.fum"
rm -f /fee/fi/fo.fum
touch /fee/fi/fo.fum
#
/bin/bash /foo/bar/baz.sh >> "$logfile" 2>&1
if [ $? -eq 0 ]; then
logger -s "SCRIPT - FOOBARSCRIPTS - /foo/bar/
baz.sh completed successfully"
else
logger -s "SCRIPT - FOOBARSCRIPTS - Error running /foo/bar/
baz.sh"
sendalert FOOBARSCRIPTS
exit 99
fi
#
/bin/bash /foo/bar/
qux.sh >> "$logfile" 2>&1
if $? -eq 0 ; then
logger -s "SCRIPT - FOOBARSCRIPTS - /foo/bar/qux.sh completed successfully"
else
logger -s "SCRIPT - FOOBARSCRIPTS - Error running /foo/bar/qux.sh"
sendalert FOOBARSCRIPTS
exit 99
fi
logger -s "SCRIPT - FOOBARSCRIPTS - Ended at $(date)"

https://redd.it/1ai2wzg
@r_bash
How to get the output of a program as finally seen on the screen?

Hi,

I have a program (foo) that outputs something while in progress, then deletes the current line to write the final output:

in progress foo bar<DELETE WHOLE LINE>done foo bar

So the final string seen on the screen is [done] foo bar.

I'd like to call this program from a bash noscript. The problem I am facing is:

echo "Result: $(foo)" does not result in: Result: [done] foo bar

Instead, the prefixed string "Result: " is deleted: [done] foo bar

How can I achieve an output like: Result: [done] foo bar

https://redd.it/1aimagi
@r_bash
Block, I-beam, or Underscore. What's your kink?

Can't tolerate block, underscore tolerable, but beam is the boss.

https://redd.it/1ain39t
@r_bash
[update] forkrun (the insanely fast pure-bash loop parallelizer) just got updated to v1.1 and got a new feature!!!

Earlier today I pushed a larger update to the main [forkrun](https://github.com/jkool702/forkrun) branch on github, bumping it up to forkrun v1.1.

For those that missed it, [here](https://www.reddit.com/r/bash/comments/19985k2/presenting_forkrun_the_fastest_purebash_loop/?utm_source=share&utm_medium=web2x&context=3) is the initial (v1.0) `forkrun` release thread here on /r/bash.

***

**The main "new feature" introduced in forkrun v1.1 is the ability to split up stdin based on the "number of bytes read"**. Previously, you could only split up stdin by the "number of lines read" (or, more generally, by the "number of delimiters read"). Two new flags have been introduced to facilitate this capability: `-b <bytes>` and `-B <bytes>`:

* `-b <bytes>`: this flag causes `forkrun` to read up to `<bytes>` at a time from stdin. However, if less than `<bytes>` is available on stdin when a given worker coproc is reading data it will not wait and will proceed with less than `<bytes>` data
* `-B <bytes>`: this flag causes `forkrun` to read exactly `<bytes>` at a time from stdin. If less than `<bytes>` is available on stdin when a given worker coproc is reading data it will wait and will not proceed until it accumulates `<bytes>` of data or all of stdin has been used.
* for both flags, `<bytes>` can be specified using a trailing `k`, `m`, `g`, `t`, or `p` (for `1000^{1,2,3,4,5}`) or `ki`, `mi`, `gi`, `pi`, or `ti` (for `1024^{1,2,3,4,5}`). Adding the trailing `b` and/or using capital letters is accepted, but does not change anything (e.g., `64kb`, `64KB`, `64kB`, `64Kb`, `64k` and `64K` all mean 64,000 bytes).

There is also a minor enhancement in the `-I` / `--INSERT` flag's functionality, and (of course) a handful of minor bug fixes and even a few more minor optimizations.

***

Its been awesome to hear from a couple of you out there that `forkrun` is being used and is working well! As always, let me know of any bugs you encounter and I'll try to find am squash them ASAP. If `forkrun` is missing a feature that you would find useful feel free to suggest it, and if I can figure out a good way to add it I will.

https://redd.it/1aj2na5
@r_bash
bash command overwritten by later command

Under what conditions can a bash command be overwritten by a later command?

https://redd.it/1ajd4je
@r_bash
Bash noscript that turns on the led on the mute key

I have a working bash noscript, but so far I have not implemented a trigger for it. It also requires sudo privileges which I'm afraid may interfere. How do I trigger this noscript when I press a specific function key (certainly not a bash noscripting question, sorry)? Currently it's in a .noscripts folder in $HOME. Here's the noscript:
echo `amixer get Capture | tail -n 2 | grep -q '\[on\]'; echo $?` | sudo tee /sys/class/leds/platform\:\:micmute/brightness

I know this is quite a small noscript but any suggestions on making the noscript is appreciated.

Thank you.

https://redd.it/1ajhtyg
@r_bash
scp-turbo

Speeding up multiple files copy over SSH, uses scp syntax, e.g. scp-turbo.sh myremote:/etc/apache2 /backups/apacheconf. (assuming myremote is an alias you have configured in ~/.ssh/config)

This is a bash wrapper for running something like tar -czf - /etc/apache2 | ssh myremote "tar -xzf - -C /backups/apacheconf".

#!/usr/bin/env bash

# uses scp syntax e.g.:
#
# REMOTE -> LOCAL
# scp-turbo.sh myremote:/etc/apache2 /tmp/mylocal/dir
#
# LOCAL -> REMOTE
# scp-turbo.sh /tmp/mylocal/dir myremote:/home/user32/

if [[ $# -eq 0 ]]; then
printf "USAGE:\n\t${0##*/} <source> <destination>\n\n"
echo "NOTE: Source and destination can be in the format host:path or just path"
exit 1
fi

source=$1
dest=$2

if [[ $source == *:* ]]; then
source_host=${source%%:*}
source_dir=${source#*:}
else
source_host=""
source_dir=$source
fi

if [[ $dest == *:* ]]; then
dest_host=${dest%%:*}
dest_dir=${dest#*:}
else
dest_host=""
dest_dir=$dest
fi

echo SOURCE_HOST: "$source_host"
echo SOURCE_DIR: "$source_dir"
echo
echo DEST_HOST: "$dest_host"
echo DEST_DIR: "$dest_dir"

read -p "Press any key to start copying..." -n 1 -s

# create target dir if not exist
if [[ ! -d "$dest_dir" ]]; then
mkdir -p "$dest_dir"
fi

# REMOTE -> LOCAL
if [[ -z "$dest_host" ]] && [[ -n "$source_host" ]] && [[ -n "$source_dir" ]] && [[ -n "$dest_dir" ]]; then
ssh "$source_host" tar --ignore-failed-read -cvf - -C "$source_dir" . | tar xvf - -C "${dest_dir}"
echo "Done!"
exit 0
fi

# LOCAL -> REMOTE
if [[ -z "$source_host" ]] && [[ -n "$source_dir" ]] && [[ -n "$dest_host" ]] && [[ -n "$dest_dir" ]]; then

ssh "$dest_host" mkdir -p "$dest_dir"

tar -cvf - -C "${source_dir}" . | ssh "$dest_host" "tar -xvf - -C $dest_dir"
echo "Done!"
exit 0
fi


github gist

https://redd.it/1ajkmvh
@r_bash
Replace output with next one while running noscript

I have this command that runs a noscript containing functions with wget

$SUDOCOMMAND ./$arg 2>&1 | grep -v ": "

This is a part of the long output I can see (from 1 to 100%)

...
152250K .......... .......... .......... .......... .......... 75% 8,15M 6s
152300K .......... .......... .......... .......... .......... 75% 8,53M 6s
152350K .......... .......... .......... .......... .......... 75% 9,76M 6s
152400K .......... .......... .......... .......... .......... 75% 8,49M 6s
152450K .......... .......... .......... .......... .......... 75% 8,46M 6s
152500K .......... .......... .......... .......... .......... 76% 6,30M 6s
152550K .......... .......... .......... .......... .......... 76% 8,51M 6s
152600K .......... .......... .......... .......... .......... 76% 8,11M 6s
152650K .......... .......... .......... .......... .......... 76% 8,14M 6s
152700K .......... .......... .......... .......... .......... 76% 8,51M 6s
152750K .......... .......... .......... .......... .......... 76% 8,85M 6s
152800K .......... .......... .......... .......... .......... 76% 8,52M 6s
152850K .......... .......... .......... .......... .......... 76% 8,46M 6s
152900K .......... .......... .......... .......... .......... 76% 6,72M 6s
152950K .......... .......... .......... .......... .......... 76% 8,94M 6s
153000K .......... .......... .......... .......... .......... 76% 8,14M 6s
153050K .......... .......... .......... .......... .......... 76% 8,48M 6s
153100K .......... .......... .......... .......... .......... 76% 8,88M 6s
153150K .......... .......... .......... .......... .......... 76% 6,09M 6s
153200K .......... .......... .......... .......... .......... 76% 8,49M 6s
...

How can I overwrite each line with the next one (until it reaches 100%) to have a smaller output (so I can see percentage and countdown on the right increasing/decreasing)?

https://redd.it/1ajxwfs
@r_bash
Online environment for online demo of bash projects

I'm making a text based adventure game in bash and I'm looking for a way to set up a shareable environment with my git repo cloned and set up to play the game in the browser.

I only need a hand full of shell tools like cat, grep, ls and such.

I tried replit, but idk if I did it wrong or what, but the shared replit doesn't show the bash console so that rules it out.

I've been searching for about an hour now and the only option seems to be to setup xterm.js with some kind of backed that runs bash code in a server.

I'm sure I've seen other repos that had an in-browser demo of their noscripts, but I can't remember what they used.

Is there a (preferably free) service or tool or website that I can use for this purpose?

PS: I could probably redirect people to jslinux but all my pretty boxes break and look like a*s there.

https://redd.it/1ak2sum
@r_bash
Pass argument to bash noscript to vary end of a path?

I have a noscript that will do something with a path like:

Launch /home/joe/file1

Launch /home/joe/file2

You'd basically pass the "file2" as an argument to the noscript and it fills in the file1 or file2 or whatever depending on the argument you supply to the noscript.

So typing "somenoscript.sh file1"

Would build the line

Launch /home/joe/file1

If I typed "somenoscript.sh foo" it'll make:

Launch /home/joe/foo


Thanks

https://redd.it/1ak5q8y
@r_bash
Test if variable is a float?

Hi

I test if a variable contains an integer like this

[ $var == ?(-)+([[:digit:]) ]]


Is there a similar test to see if it is a float, say 1.23 or -1.23

Thanks

&#x200B;

https://redd.it/1ak9a1l
@r_bash
Any flaws in this noscript that could be potentially bad?

#!/bin/bash

# Check if three arguments are provided
if "$#" -ne 3 ; then
echo "Usage: $0 <begtime> <endtime> <logfilegzipped>"
exit 1
fi

beg=$1
end=$2
logfilegzipped=$3
function nongzipped() {
LC
ALL=C awk -v beg="$beg" -v end="$end" '
match($0, /0-20-9:0-50-9:0-50-9/) {
t = substr($0, RSTART, 8)
if (t >= end) selected = 0
else if (t >= beg) selected = 1
}
selected' "$logfilegzipped" #ignore the name lol
}

function gzipped() {
zcat "$logfilegzipped" | LCALL=C awk -v beg="$beg" -v end="$end" '
match($0, /[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/) {
t = substr($0, RSTART, 8)
if (t >= end) selected = 0
else if (t >= beg) selected = 1
}
selected'
}
if [[ "$log
filegzipped" == *.gz ]]; then
gzipped
else
non
gzipped
fi

I just modified this noscript that I wrote few months ago to accomodate both cases of gzipped and non gzipped log files. Any flaws with this you can notice. This works on my machine.

Any ways to make this better? Please don't post solutions. I'd have asked chatgpt but I like the journey in learning rather than getting answers quickly. Only correct me if there is serious flaw in this.

https://redd.it/1akbuj9
@r_bash
Any better solutions than this one?

print_progress(){
local progress_msg="${1}"; shift

local separator_string=
for ((i = 0; i < COLUMNS; i = i + 1)); do
separator_string+='='
done
printf '\n%s\n%s\n%s\n' \
"${separator_string}" \
"${progress_msg}" \
"${separator_string}"
}
print_progress 'Currently doing blablabla...'


https://redd.it/1akuntp
@r_bash
Help with noscript - creating a 'simple' compose file on remote server via ssh

I run a bash noscript on my local pc. Its configures a remote server by ssh, adding users, installing docker etc. Theres a part in it that writes and then runs a traefik compose file but there is a line in it that bash doent seem to like:

\- "traefik.http.routers.api.rule=Host(`website.com`)"

It ends up writing the line:

\- "traefik.http.routers.api.rule=Host()"

This causes the container to fail.

&#x200B;

Ive even tried (unsuccessfully) writing the file with commands such as:

printf '%s\\n' " - traefik.http.routers.api.rule=Host('website.com')"

&#x200B;

How do i get round this problem. GPT is looping on me and getting nowhere. Part of my noscript:

&#x200B;

su - bob -c "

\# Create and write to the file

cat > docker-compose_traefik.yml << 'EOF'

version: "3.3"

&#x200B;

services:

traefik:

image: traefik:v3.0

restart: always

container_name: traefik

ports:

\- "80:80"

\- "8080:8080"

\- "443:443"

command:

\- --api.insecure=true

\- --api.dashboard=true

\- --api.debug=true

\- --log.level=DEBUG

\- --providers.docker=true

\- --providers.docker.exposedbydefault=false

\- --providers.file.filename=/dynamic.yaml

\- --providers.docker.network=web

\- --entrypoints.web.address=:80

volumes:

\- /var/run/docker.sock:/var/run/docker.sock

\- ./dynamic.yaml:/dynamic.yaml

networks:

\- web

labels:

\- "traefik.enable=true"

\- "traefik.http.routers.api.rule=Host(`website.com`)"

\- "traefik.http.routers.api.service=api@internal" access

&#x200B;

networks:

web:

external: true

EOF

&#x200B;

https://redd.it/1akyrk4
@r_bash
Code review request

I tested the program on 5 machines running on matic 23.10 and cant find any issues. Would like to know if there are any issues with the code. As code is broken down into many functions i cant upload snippets here.
I would like reviewers to point to memory_init function which is an odd ball in the whole hierarchy.
Here is the link.

https://github.com/ioprojecton/CPU-Y

Thanks.

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