r_bash – Telegram
What is the "-" called and what is it exactly doing?

hey bashers,

tar -cvzf - some.file | split -b 150M - "some.file-part"

I know what this line does, but I do not really understand the " - " and i don't know how this concept is called. Does this have a name? "Buffer into Terminal"?

​

Best

​

https://redd.it/14jevh3
@r_bash
Keep a Mac awake for any duration with a user friendly easy to setup noscript that uses the native MacOS pmset disablesleep

Hey all,

​

I often need to prevent a Mac from sleeping and Caffeinate & Amphetamine are neither open source not work very well so I created a light user friendly Bash noscript with more advanced options.

​

You can keep your Mac awake indefinitely or for any duration you set. It also works when a MacBook lid is closed and to cancel a sleep you simply press the return key. Can't be easier than that..

​

You can specify a wake duration in seconds, minutes, or hours, and it can even handle multiple arguments at the same time. (e.g. by running ```./stay-awake 1h 30m 15s```)

​

Check out the open-source repository at - [https://github.com/Post2Fix/macos-stay-awake\](https://github.com/Post2Fix/macos-stay-awake)

​

There are simple instructions on how to setup and run a Bash noscript on MacOS which can be handy to know anyway.

​

I'll try to turn it into an executable MacOS app for everyone but until then hopefully some early adopters will find it useful. Let me know if you have any suggestions or issues.

​

Best.

https://redd.it/14mmksd
@r_bash
Point me in the right direction, please - writing a bash function involving a user prompt

So I'm trying to make a function that creates the directory structure for ansible roles, example command that works standalone, below:

mkdir -p RoleName/{tasks,handlers,defaults,vars,templates}

I've only really done basic work in bash, so I'm a bit lost.

I initially tried to setup an alias, init-role, to run the above using "read -p" to get the folder name, but that didn't quite work. After searching around online, it seems a function is what I want. Here is a list of commands that work, and would probably work if I threw them into a noscript:

# ask for the name of the role
read -p 'Enter the role name: ' RoleName

# use RoleName as the root folder, and make the subfolders
mkdir -p $RoleName/{tasks,handlers,defaults,vars,templates}

# Remove the alias
unset $RoleName

# Show the directory structure
tree

After configuring my \~/.bashrc to look at \~/.bash_functions, and threw the above into a function, I quickly learned it wasn't correct. This is what I have:

function init-role () {
# ask for the name of the role
read -p 'Enter the role name: ' RoleName

# use RoleName as the root folder, and make the subfolders
mkdir -p $RoleName/{tasks,handlers,defaults,vars,templates}

# Remove the alias
unset $RoleName

# Show the directory structure
tree
}

Right now I'm stuck on getting user input and putting it into a variable. I've tried:

$RoleName = read -p 'Enter the role name: '
$RoleName = read -p "Enter the role name: "
$RoleName = "read -p Enter the role name: "

My search queries aren't getting me anywhere regarding getting user input, and assigning it to a variable, within a function. I'm sure it's out there, I'm just not finding it.

​

It's probably clear that I haven't written a bash function before, and I'm not really looking for an answer to be handed to me, but rather a pointer in the right direction, please.

https://redd.it/14mszdj
@r_bash
How can I add this functionality to my Bash?

In this video the presenter installs zsh and is able to type git st, then use the tab key to bring up a list of commands that start with git st (stash, status, stripspace) and brief denoscriptions of each. Is there a way to do this with Bash?

https://redd.it/14v7kqm
@r_bash
Execute a command in every sub-directory that contains wav files.

# Problem is solved! Thank you all for Helping! See comments for solution.

Hey there,

I have a collection of Drum Staples for Producing Music. The are Organized in different Folder for every Drum-Machine. In most sub-directories the samples are located directly in this folder. In some directories there are sub-folders for the different sounds (bass drum, snare, hats...).

I need a noscript or command that executes "normalize-audio -b \*.wav" in every sub-directory.

Searching the Web, I found this:

find ./* -type d -execdir echo Doing something in folder {} \; -execdir echo Done something in {} \;

It works well and executes the Echo command in every Sub. So i Changed it to

find ./* -type d -execdir normalize-audio -b {}/*.wav;

I tried it without the {} and put the Normalize Command in ' , But it just gives me error messages, mostly this one:

find: missing argument to `-execdir'

I've been tinkering with this command for 3 hours. Now it's time to admit that this is above my level and ask the community for advice.

Greetings from Germany!

https://redd.it/14v4rtw
@r_bash
A universal noscript to open Firefox with piped search terms in Bash

#!/bin/bash
set -e
shopt -s lastpipe
read -r input;

getos () {
uname
s="$(uname -s)"
if echo "$unames" | grep 'Darwin' >/dev/null
then
baseos='osx'
else
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null ; then
baseos='windows'
else
baseos='linux'
fi
fi
echo $baseos
}

set
firefoxpath () {
if [ "$(get
os)" == "windows" ]; then
export FIREFOXBIN="/mnt/c/Program Files/Mozilla Firefox/firefox.exe"
elif [ "$(get
os)" == "linux" ]; then
export FIREFOXBIN="firefox"
elif [ "$(get
os)" == "osx" ]; then
export FIREFOXBIN="/Applications/Firefox.app/Contents/MacOS/firefox"
else
echo "Unknown OS"
exit 1
fi
}

google () {
TLD=".
co.uk"
search=""
for term in "$@"; do
search="${search}%20${term}"
done
"${FIREFOX
BIN}" "https://www.google${TLD}/search?q=${search}" &
}

setfirefoxpath
google "${input}"

https://redd.it/14uosqq
@r_bash
Better way to get variables out of file

I have two files:

#config
nextcloud-1="/var/www/nextcloud-1"
nextcloud-2="/var/www/nextcloud-2"

and the actual noscript:

#!/bin/bash
dir="$1"
dir=$(cat /opt/dirs.txt | grep "$dir" | sed -e 's/.*"\(.*\)".*/\1/')
cd $dir
sudo -u www-data php -f occ app:update --all

This noscript updates all Nextcloud apps on the selected instance: `./updateapps.sh nextcloud-1`. Is there a more efficient way of doing this, with error handling in case of a non-existent directory/variable for directory?

https://redd.it/14tzjik
@r_bash
Help me

So i got this problem as summer homework:Write a bash noscript that prompts the user to enter an upper limit. The program will calculate the sum of all prime numbers between 2 and the specified limit. Next, the program will have to generate a text file called "primes.txt" that will contain the prime numbers found, one per line. This is what i wrote:

#!/bin/bash
# Function that checks if a number is prime
function is_prime() {
if (( $1 < 2 )); then
return 1
fi
for (( i=2; i*i<=$1; i++ )); do
if (( $1 % $i == 0 )); then
return 1
fi
done
return 0
}
# Function that calculates the sum of prime numbers up to a given limit
function calculate_prime_sum() {
local limit=$1
local sum=0
for (( num=2; num<=limit; num++ )); do
if is_prime $num; then
      (( sum += num ))
fi
done
echo $sum
}
# Read a number from input
read -p "Enter an upper limit: " limit
# Calculate the sum of prime numbers up to the limit
prime_sum=$(calculate_prime_sum $limit)
echo "The sum of prime numbers up to $limit is $prime_sum"
# Generate a text file with prime numbers up to the limit
echo "Prime numbers up to $limit:" > primes.txt
for (( num=2; num<=limit; num++ )); do
if is_prime $num; then
echo $num >> primes.txt
fi
done
echo "primes.txt file generated successfully."
I dont know why but it gives an error :( can someone help me?

https://redd.it/14u6cfy
@r_bash
Using printf in a function to replace echo

Since I've learned about some drawbacks of the echo command, e.g. the lack of support for -- to indicate the end of options, I thought it would be reasonable to just stick with printf.

So I thought, why not write a function that allows me to use printf without having to retype the format strings.

Something like this:

output() {
printf '%s\n' "$*"
}

output "$foo is $bar"


But I'm not sure if this is syntactically correct. Normally, I would write printf '%s is %s\n' foo bar, instead of printf '%s\n' "$foo is $bar". Both seem to work the same; also, output "foo is bar" gives me the expected result. Shellcheck doesn't complain either. But is it safe to use, or are there any edge cases where my function wouldn't work as expected?

Thanks in advance.

https://redd.it/14tl682
@r_bash
What is a good tool to enable dynamic auto complete as you type in Bash 5.2

I have seen examples as you type, it will display a popup window above the line with the history of the shell.

https://redd.it/14toulb
@r_bash
Part of noscript doesn't execute when launched through cron

Here is my noscript: (tome is my username)

#!/bin/zsh

month_day=$(date -d "$D" '+%d')
week_day=$(date +%u)

if [ $month_day = 07 ] || [ $month_day = 14 ] || [ $month_day = 21 ] || [ $month_day = 28 ]
then
echo "$(date +'%H:%M:%S %d/%m/%y : weekly backup '$month_day' starts')" >> /home/tome/.log/backup.log
weekly_backup
echo "$(date +'%H:%M:%S %d/%m/%y : weekly backup '$month_day' ok')" >> /home/tome/.log/backup.log
else
echo "$(date +'%H:%M:%S %d/%m/%y : daily backup '$week_day' starts')" >> /home/tome/.log/backup.log
daily_backup
echo "$(date +'%H:%M:%S %d/%m/%y : daily backup '$week_day' ok')" >> /home/tome/.log/backup.log
fi

updatedb

and the relevant part of the output of `sudo crontab -e`:

0 1 * * * /home/tome/.noscripts/backup

(btw `/home/tome/.noscripts/` is where I store all my noscripts, including `daily_backup`, but I double-checked it's part of `$PATH` both for tome *and* root - also, the permissions are correct and the noscripts are executable).

However, here's what I get :

* from `~/.log/backup6.log` (6 because it's Saturday and that's how I classify my backups): ***simply nothing.***
* from `~/.log/backup.log`:

&#8203;

01:00:01 08/07/23 : daily backup 6 starts
01:00:01 08/07/23 : daily backup 6 ok

Notice how the noscript completed in less than one second.

I don't want to put my whole `daily_backup` code here, I don't think that would be useful. Let's just say that the noscript *always* takes *at least* 10 minutes to run, and *a lot* is supposed to end up in `~/.log/backup6.log`, since evey task completed succesfully by the noscript leaves a message in the log.

My only conclusion is that: `backup` launches normally, but then skips `daily_backup` altogether.

And all this only happen when I run `backup` from root cron, if I do a `sudo backup` in a terminal suddenly it seems to work.

Please help if you can (that's really a background job I need cron to do for me)

-----------

EDIT: I think the issue was that `cron` used its own, minimalistic, $PATH. So I specified my $PATH in the `cron` file's beginning, and it works now.

Thanks to everyone for your help.

https://redd.it/14tp1l4
@r_bash
sudo su in a bash/zsh noscript (but only part of that noscript)

I'm trying to run some noscripts on openSUSE Tumbleweed (or rather its WSL but it doesn't matter)

Here's what I want to do (mind that this code does not work, I'm trying to get as close as possible to this with a working noscript):

#!/bin/zsh

# some command as normal user:

cp /home/tome/.zshrc /home/tome/.zshrcroot
sed -i 's/agnoster/avit/g' /home/tome/.zshrc
root

# and here comes the part I don't know how to do

read -p "root password:" password

sudo su -p $password <<HERE

# here goes some stuff I want to run as the root user (not just prepending a sudo to the commands, the actual root user!)

cp /home/tome/.zshrcroot /root/.zshrc
cp -r /home/tome/.vim /root/.
cp /home/tome/.zsh
history /home/tome/.vimrc /root/.
cd /root
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
git clone https://github.com/zsh-users/zsh-autosuggestions /root/.oh-my-zsh/custom/plugins/zsh-autosuggestions
source /root/.zshrc
source /root/.vimrc

HERE

# and finally some non-sudo user commands again, could be anything

pwd && echo "I'm not sudo"

I found many ways to "run as root" commands in a bash/zsh noscript, but none of them gave me a satifying result... I know I have done this kind of thing to automate SQL commands, so I don't see why I couldn't do it with sudo su...?

All help will be greatly appreciated!

https://redd.it/14thn0c
@r_bash
What do you think are the good features a bash prompt should have?

I recently went into customizing my PS1 variable and I noticed that Im not really sure of knowing what I want. Do I want to see the full path of my current directory? Do I want to see my user name and hostname? The only thing I know for sure is the git branch. Does anyone has an opinion of what is and what is not a good PS1 variable? Should I use linebreaks for splitting the prompt line from the input? Thank you in advance.

EDIT: no one is talking about differentiating different prompt inputs by using a linebreak. Imho I think this is really helpful.

https://redd.it/14sg2nw
@r_bash
ppd - a pushd/popd alternative written in bash

I use pushd/popd often, however I felt there was something lacking from the functionality offered by those commands, so I decided to build ppd.

ppd allows you to perform the following actions on a directory stack:

- list directories in the stack
- push directories to the stack
- pop directories from the stack
- navigate to directories in the stack
- add directories to the stack
- remove directories from the stack
- clear directories from the stack

You can find a demo of how it works in the README:

https://github.com/paololazzari/ppd

https://redd.it/14sj1cy
@r_bash
how do i list .txt files in defferent sub directories from the working directory



https://redd.it/14vpdcb
@r_bash
how to accumulate the strings through a loop in text file or a variable?

Hi everyone I am trying to read a JSON and putting the results in a text file or a variable(it would be optimal). I already have this error.json file. But I tried putting nested loop but doesnt work.

&#x200B;

outputFile="errors.json"

jsonData=$(jq '.' "$outputFile")

IDs=$(echo "$jsonData" | jq -r '.result.details.componentFailures | length')

for (( i=0; i<IDs; ++i )); do

#getting changeset name
branch=$(jq --arg i "$i" -r '.result.details.componentFailures[$i|tonumber].fullName' <<<"$jsonData")
# echo "$branch"

#getting their changeset record IDs
IDofCSs=$(jq --arg i "$i" -r '.result.details.componentFailures[$i|tonumber].problem' <<<"$jsonData")
# echo "$IDofCSs"

testing="${branch}=====${IDofCSs}"$'\n'

echo "$testing"

done

my output

Vehicle_Media_Update_Image_Sequence=====The field "EPM_Image_Sequence__c" for the object "EPM_Vehicle_Media__c" doesn't exist.

Account_Score_Inactivity_Decrease=====Update_Accounts_IER (Action) - We can't find an action with the name and action type that you specified.

WebForm_RecordTrigger_WebFormFlow=====Update_WFH_Score (Update Records) - The field "EPM_Score__c" for the object "EPM_Web_Form_History__c" doesn't exist.

The output is fine but I want it whole in one variable. Because every time its overriding the "testing" variable.

https://redd.it/14se6f0
@r_bash