r_bash – Telegram
Why is Bash needed to interpret the Homebrew install noscript?

I use zsh on macOS. The Homebrew installation noscript is:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Because I’m using zsh and not bash, I assumed that I should tweak the path to /bin/zsh (instead of /bin/bash) but this returns an error message saying that bash is required to interpret the noscript. Why is that? Thanks for the help!

https://redd.it/15wtydk
@r_bash
Shell/tab completion, who usually supplies it?

Is it more common for an application to supply a drop in file for tab completion, or a separate project to supply it?

Specifically, I started getting more in depth with tmux, and noticed it had no tab completion. However I found/installed a separate project offering one: https://github.com/imomaliev/tmux-bash-completion

I've never really thought much about this. I guess there was always tab completion available for everything I've needed over the years.

I filed an issue on the tmux github page pointing out the no tab completion and provided a link to the ready made one, but he wasn't interested. Suggested taking it up with my shell or distro packager. This doesn't seem like a bash thing at all to me, and Arch wouldn't include it with tmux, don't even need to ask based on their packaging policy.

Tmux has a 2890 line man page with a metric shit ton of commands, options, etc. Seems to me tab completion made using it much easier to get a handle on and learn...

Anyone have thoughts or experience with this?

https://redd.it/15wx1zf
@r_bash
Troubleshooting basic commands

Hi!
I’m a bit of a newb so bare with me. I have been tasked with a mini project because of learning path - but I’m slighting stumped. I just need to run a one liner with basic Unix commands - to extract information (file name and size). This information is given by an internal tool and I just need to append it to a file afterwards for all the files in that folder. But how can I test my code without having access to the tool? Or I’m overthinking this and should just follow the format.
Thanks

https://redd.it/15xi8eh
@r_bash
Problem with renaming files

I'm looking for files of a particular name on a system, and if those files are found, I want to rename them. My goal is to upload the noscript into JAMF and have it run on all our Macbooks at work.

The "find" part of the noscript is working correctly (I'm just testing locally on my own system for now), but the part of the noscript that does the rename is returning odd results and I don't know why.

This is my first attempt at writing a bash noscript. I've found examples of different noscripts online and wound up with the following:

​

#!/bin/bash
filenames=$(find / -type f ( -name "test-1.2.3.rtf" -o -name "test-1.2.4.rtf" ))
for old_name in "${filenames[@]}"; do
if [ -e "$old_name" ]; then echo “Found file $old_name”
extension="${old_name##*.}"
new_name="RENAMED_${old_name}"
mv "$old_name" "$new_name" echo "Renamed '$old_name' to '$new_name'"
else
echo "File '$old_name' not found."
fi
done

#

​

When I run just the "filenames" line, it correctly finds the test files I created on my system. But then when running through the "if" loop to do the rename, here are the messages I'm getting from bash that I don't understand (I've replaced the actual user name returned with "\[USERNAME\]"):

>File '/System/Volumes/Data/Users/\[USERNAME\]/Downloads/test-1.2.3.rtf/System/Volumes/Data/Users/\[USERNAME\]/Downloads/test-1.2.4.rtf/Users/\[USERNAME\]/Downloads/test-1.2.3.rtf/Users/\[USERNAME\]/Downloads/test-1.2.4.rtf/dev/fd/6/System/Volumes/Data/Users/\[USERNAME\]/Downloads/test-1.2.3.rtf/dev/fd/6/System/Volumes/Data/Users/\[USERNAME\]/Downloads/test-1.2.4.rtf/dev/fd/6/Users/\[USERNAME\]/Downloads/test-1.2.3.rtf/dev/fd/6/Users/\[USERNAME\]/Downloads/test-1.2.4.rtf' not found.“Found file ??mv: rename / to RENAMED\_/: Is a directoryRenamed '/' to 'RENAMED\_/'File '-type' not found.File 'f' not found.File '(' not found.File '-name' not found.File 'test-1.2.3.rtf' not found.File '-o' not found.File '-name' not found.File 'test-1.2.4.rtf' not found.File ')' not found.

​

https://redd.it/15xjjdp
@r_bash
"syntax error: operand expected" in mathematical operation

I have a noscript with a mathematical operation:

myfunction(){
VAR=$((bc -l <<<"$VAR_1 * $VAR_2 * $VAR_3"))
return VAR
}

I'm getting this error, but I don't know why:

`bc -l <<<3508 * 60 * 0.393701: syntax error: operand expected (error token is "<3508 * 60 * 0.393701")`

I think it can be due to the double parenthesis, but I need it to be a floating number.

https://redd.it/15xigen
@r_bash
really long flag

Why do some commands have a really long seemingly random flag? In 2048's case it resets your score but I can't tell what the ssh one does.

ex. ssh and 2048

https://redd.it/15xtn6e
@r_bash
Need to read file and remove content from results.

I have a file that generate all the bad IP for my firewall from several site I have a line to delete any of my IPs but would loved to tell it to remove any ips in a file instead of adding them to my .sh file here is the command below can anyone tell me what to change to tell it to omit whitelistips.txt

curl -sk $IPBAN $FW $MAIL $BLOCKIP $DEB $DES |\

grep -oE '[0-9]{1,3}+[.][0-9]{1,3}+[.][0-9]{1,3}+[.][0-9]{,3}+(/[0-9]{2})?' |\

awk 'NR > 0 {print $1}' | sort -u | grep -v XXX.182.158.* | grep -v 10.10.20.* | grep -v XXX.153.56.212 | grep -v XX.230.162.184 | grep -v XXX.192.189.32 | grep -v XXX.192.189.33 | grep -v >

so I need to replace grep -v XXX.153.56.212 | grep -v XX.230.162.184 | grep -v XXX.192.189.32 | grep -v XXX.192.189.33 | grep -v > with my file name

If you can modify my code because I am not a developer It would be much appreciated.

https://redd.it/15y3q95
@r_bash
{: command not found, shellcheck shows no errors though.

Using shellcheck and no errors, but keeping getting `{: command not found`,

Just using aws cli to create cloudfront invalidation and store the output in variable `invalidation_ouput` Then take that `invalidation_output` and extract the `invalidation_id` and `invalidation_status`.

And bash noscripts asynchronous? Does it wait till the aws cloudfront command to get an output?

My errors are specifically showing on `invalidation_id` line and `invalidation_status` line. The aws cloudfront doesn't seem to be succeeding.

`test.sh`

# 1. Create invalidation
invalidation_output=$(aws cloudfront create-invalidation --region "${REGION}" --distribution-id "${CLOUDFRONT_ID}" --paths '/*')

invalidation_id=$("${invalidation_output}" | jq -r '.Invalidation.Id')
invalidation_status=$("${invalidation_output}" | jq -r '.Invalidation.Status')

https://redd.it/15y8gdm
@r_bash
Assigning tar parameters using variables... help?

Bash noscripting newbie here, I'm trying to write a noscript that generates tar archives of some model data that I've been generating. I have set years for the start and end of each archive. Here's what I'm working with so far:

#!/bin/bash -l

shopt -s extglob

### DEFINE START AND END YEARS HERE
srtYr=$(2451)
endYr=$(2500)

cd /usr/scratch/data/SF_SU_55Ma_init/ocn/
tar -czvf /usr/archive/SF_SU_55Ma_init/ocn/SF_SU_55Ma_init.$srtYr-$endYr.ocn.tar.gz SF_SU_55Ma_init.ocn.h.{$srtYr..$endYr}-??.nc
cd /usr/scratch/data/SF_SU_55Ma_init/atm/
tar -czvf /usr/archive/SF_SU_55Ma_init/atm/SF_SU_55Ma_init.$srtYr-$endYr.ocn.tar.gz SF_SU_55Ma_init.atm.h.{$srtYr..$endYr}-??.nc
cd /usr/scratch/data/SF_SU_55Ma_init/ice/
tar -czvf /usr/archive/SF_SU_55Ma_init/ice/SF_SU_55Ma_init.$srtYr-$endYr.ocn.tar.gz SF_SU_55Ma_init.ice.h.{$srtYr..$endYr}-??.nc

So, I am trying to set the start and end years in both the name of the tar files, and in the brace expansion that defines the range of files to use. This doesn't work, though, as I get these errors:

bash: 2451: command not found
bash: 2500: command not found
tar: SF_SU_55Ma_init.ocn.h.{..}-??.nc: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
tar: SF_SU_55Ma_init.atm.h.{..}-??.nc: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
tar: SF_SU_55Ma_init.ice.h.{..}-??.nc: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

It looks like I'm not able to call variables within the brace expansion. Also, I'm not sure what those initial bash errors might be. Does anyone know what I'm doing wrong, or what I could do for a workaround? Thanks in advance!

https://redd.it/15yb8v2
@r_bash
Can't pass installation command to function in POSIX noscript

I wrote this noscript to install rust alongside other tools:

#!/bin/sh

set -e

install_dependency() {
id_dependency="$1"
id_denoscription="$2"
id_installation_command="$3"

if ! command -v "$id_dependency"; then
echo "Installing '$id_denoscription' ('$id_dependency' binary)..."
$id_installation_command
echo "Installed '$id_dependency' successfully.
Please make sure '$id_dependency' binary is in your \$PATH."
exit 1
fi
}

install_dependency rustc Rust 'curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh'

The problem appears when I run it:

Installing 'Rust' ('rustc' binary)...
curl: option --proto: is badly used here
curl: try 'curl --help' or 'curl --manual' for more information

I don't understand why: I expect everything work fine, as I didn't quote `$id_installation_command`. While I can run `curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh` directly (and it works) I need this function to install several tools and not to duplicate code several times.

https://redd.it/15yoxle
@r_bash
POSIX-compliant noscript to generate DocOpt-compatible help messages with colors

I've written a noscript to generate help messages with colors. Here is how it looks:

&#x200B;

https://preview.redd.it/7ghkhdhglsjb1.png?width=1920&format=png&auto=webp&s=1e97f83ef40249060034a208cf8320f732e1dc29

Firstly, I tell my program explanation (Colorful help message generator. here as the first argument), then after double dashes I list all options should be put in my help message in this format: -<short>/--<long>='Some denoscription'. All options and their denoscriptions are automatically aligned to form a table.

You can preview a generated message, or the whole help() function generated via this noscript. Also, it's possible to copy the output via xclip to clipboard when --copy/-c is passed.

In this example I've obtained this Bash code generated:

help() {
echo -e "\e30mColorful help message generator.

\e[36mOptions:
\e[31m--help|-h \e[35mPrint help
\e[31m--version|-v \e[35mPrint version
\e[31m--text-color|-t \e[35mSpecify text color
\e[31m--header-color|-h \e[35mSpecify header color
\e[31m--option-color|-o \e[35mSpecify option color
\e[31m--option-denoscription-color|-O \e[35mSpecify option denoscription color
\e[31m--preview|-p \e[35mWhether to preview generated message
\e[31m--copy|-c \e[35mWhether to copy generated function to clipboard"
}


&#x200B;

[https://redd.it/15ytyu5

@r_bash
Backslash doesn't seem to remain literal inside double quotes when doesn't follow any special character in dash

Dash [man page](https://manpages.ubuntu.com/manpages/focal/en/man1/sh.1.html) states that:

> The backslash inside double quotes is historically weird, and serves to quote only the following characters:
> $ ` " \ <newline>
> Otherwise it remains literal.

I've tried to execute `echo "1\2"` and expected to see `1\2` while got `1`. In Bash it works as expected. Is it me misunderstanding man page or what? When I see `it remains literal` phrase, I interpret it automatically as `it is being displayed as it is`.

https://redd.it/15z0lm8
@r_bash
Send output of tail to another tail

I am looking to condense the following into one line

I am plumbing logs that are of the format keyword.randomstring.joblog, looking for the last line to have the keyword rc in it.

I currently use

ls -tr $LogDirectory | grep keyword | tail -1 then manually copy that to tail -1 $LogDirectory/FilenameHere | grep rc

Can this be condensed to one line?

Thanks!

https://redd.it/15zdfnf
@r_bash
How Ctrl-V prevents Terminal Driver Sending SIGINT to foreground group?

Hello,

Sorry if this question is a little mercurial and pedantic...or obvious. Trying to fully understand some behaviour rigorously.

If I am running in interactive bash session and I run something like trap report_SIGINT SIGINT to a function that just logs the reception of the SIGINT, then I Ctrl -V Ctrl - C to implement the character literally as in the bash manual I get the Ctrl - C as the manual would suggest literally printed. All good so far according to the manual.

However, this causes a problem I can't quite account for:

Since the terminal driver acts on things before readline library receives stuff from it, why doesn't the driver receive the Ctrl - C from the keyboard and then send the SIGINT to the foreground process group (which bash is in when there is no active foreground childprocess) meaning that bash receives a SIGINT? You can see that bash doesn't receive this from the trap...nothing is outputted to my logging file after Ctrl - V then Ctrl - C. I thought perhaps it turns off the intr value in terminal driver from Ctrl - C but running stty -a TERMINAL on the terminal (from a second terminal) after Ctrl - V shows no change.

Thanks for any and all help!

https://redd.it/15zcpdq
@r_bash
slack noscript

hello not sure if this is the right place for this

i have 0 noscripting experience and my boss asked me to create a noscript that will produce all of our users who are on slack and show them what build version they are on

example user 1 slack build intel
example user 2 slack build silicon

https://redd.it/15zi0is
@r_bash
Can someone tell me why my code works fine outputting to a terminal but gets "stuck" outputting to a pipe?

Usually I try and parse down the code to a easy-to-understand example, but Im really not sure what is causing this behavior. So....the code is here. It is a prototype for a new way of distributing inputs to several forked workers that is much faster than the standard "pipe --> while read; do..." loop. On my system, distributing 1 million lines (printf '%%s\n' {1..1000000}) to 28 different workers only takes ~0.3 seconds longer than the printf call itself. But that isnt the point of this post, so back on topic...

To see this behavior im trying to fix, run

# source function
source <(curl https://github.com/jkool702/forkrun/blob/main/mySplit.bash)

# this works as expected
printf '%s\n' {1..10000} | mySplit

# this gets stuck
printf '%s\n' {1..100000} | mySplit | wc -l

Ive tried a lot of different ways to fix this without success. best I can tell, mySplit runs fully and cleans up. There are no forked processes left running nor any file denoscriptors left open. mySplit passes all the data it is supposed to pass to the pipe, runs every line of code it is supposed to, and calls its exit trap. And then...it just sits there and does nothing instead of closing and sending an EOF down the pipe.

If whatever you are piping its output to expects an EOF it will wait for it forever. As such, something like wc -l will never give any output. Piping to cat instead will print everything to the screen but then just sit there not closing and giving you back the terminal until you press <crtl> + c.

Any ideas what would cause this?

Thanks in advance.

https://redd.it/15zlyld
@r_bash
Why doesn't echo 1 1 1 | uniq, do what I think it does?

I read uniq could take the stdout and filter out the unique entries.

echo 1<tab>1<tab>1 | uniq

echo 1 1 1 | uniq

both do nothing but print out 1 1 1. What do you suggest I do to put just one 1 using the uniq command so I can understand this command?

I guess I could do this echo -e "1\n1\n1\n" | uniq but I don't understand why the three ones separated by spaces and tabs don't work like I thought.

https://redd.it/15zogw4
@r_bash
How can I output a file into a csv table but merging columns if it has the same value

I have the following example :


1)
--+----------------------------------+-------------+-------------------+
| Node | Pods count | Containers count |
--+----------------------------------+-------------+-------------------+
| www-wwwwwww-wwwwwwww-wwwwwwwww0 | 42 | 53 |
| www-wwwwwww-wwwwwwww-wwwwwwwww1 | 42 | 41 |
| www-wwwwwww-wwwwwwww-wwwwwwwww2 | 40 | 51 |
| www-wwwwwww-wwwwwwww-wwwwwwwww3 | 25 | 41 |
| www-wwwwwww-wwwwwwww-wwwwwwwww4 | 53 | 70 |
--+----------------------------------+-------------+-------------------+

2)
NAMESPACE IMAGE
ns1 image-ns1:v1
ns1 image-ns1:v1
ns2 image-ns2:v1
ns2 image-ns2:v2
ns3 image-ns3:v1
ns4 image-ns4:v1
ns4 image-ns4:v2

I want 2) to look like this :

--+----------------------------+-------------------+
| NAMESPACE | IMAGE |
--+----------------------------+-------------------+
| ns1 | image-ns1:v1 |
| | image-ns1:v1 |
--+----------------------------+-------------------+
| ns2 | image-ns2:v1 |
| | image-ns2:v2 |
--+----------------------------+-------------------+
| ns3 | image-ns3:v1 |
--+----------------------------+-------------------+
| ns4 | image-ns4:v1 |
| | image-ns4:v2 |
--+----------------------------+-------------------+

This is the function I used for the table

function csvtableheader () {
table=$(echo "$1"|sed -e 's/^/,/' -e 's/$/,/' -e 's/,/,| /g' |column -t -s,)
line=$(echo "$table" |head -n1 | sed -e 's/^|/-/g' -e 's/.$//' -e 's/|/+/g')
echo ${line}
echo "$table" | head -n1
echo ${line}
echo "${table}" | tail -n +2
echo ${line}
}

I used it from here @ jabend

How can I achieve this? Thank you

https://redd.it/16045nj
@r_bash
Pipelight - Automation pipelines but easier. (v0.6.14)

Hi guys!

I needed something to glue commands together but with
- more simplicity and verbosity than a bash noscript,
- and much lighter than most cicd software that doesn't fit on my servers.

So I made a tool that has matured over the years and I share it today with you.

https://pipelight.dev/

It heavily goes against some well established standards in the automation/cicd field that I and some others don't approve to a point It may disconcert some of you! 😈

But I am truly convinced this is the way to do things
especially when you have the power of a linux laying in your hands and thus
I am working my ass off through pain and pleasure to bring
a good cicd software to our beloved foss community.

https://redd.it/1604zsl
@r_bash
Issue with GitHub Script

I would like to preface that I am by no means fluent in noscripting on Linux.. I am trying to make a github noscript work to create timelapse from unifi protect camera of a building project. Link to the project is below:

https://github.com/sfeakes/UniFi-Timelapse/blob/master/unifi-timelapse.sh

The savesnap piece works like a charm and I have a cron job running to capture the screenshots. The issue arises when I try to run the createvideo function. It would seem that the noscript creates the $snapTemp directory and creates the files.list inside of that directory, then cd to the $snapTemp and tries to find the files.list in whcih it states it cannot find it.. I am at a loss and grasping at straws so far. I am sorry if this is not the usual or appropriate post to this sub. TIA

ant@antlinux1:~$ ./unifi-timelapse.sh createvideo "1050Build1" today
Creating video of 1050Build1 from today's images
./unifi-timelapse.sh: line 55: ./Timelapse/1050Build1/temp-2023-08-24 21:30/files.list: No such file or directory
ERROR no files found

The only things on the noscript I have changed are the name and IP to the single camera and SNAP_BASE to "./Timelapse". Also I think it is worth mentioning the noscript lives in the Home directory of the logged on user. This is also running on a VM of Ubuntu Desktop 20.04.6 LTS. If additional info is needed, please advise.

https://redd.it/160ml2g
@r_bash