r_bash – Telegram
Some useful bash projects for linux servers as a helpdesk tier 2?

What I've made

- log vomitter (thing that vomits logs so that I can use logrotate and verify-I know that's stupid).

- glassfish/payara domain restart command.

That's all that I've needed and I've made them. Is there anything else that I can make? That will be useful to me a helpdesk tier 2?

https://redd.it/18mvtld
@r_bash
Sed help needed!

I asked ChatGPT to help me create a function to help me parse YT URL's. FYI a YT URL consists of a string where it can have the video id alone, or the video id plus extra metadata. The video id is 11 characters long. Anything after it, after a "&" or "?" character is just extra metadata These 3 sample YT URL's are the exact same video: youtu.be/watch?=12345678901 and `youtu.be/watch?=12345678901&pp=abcdefghij%3D%3D` and `youtu.be/watch?=1234678901?si=abcd1234`

The code that ChatGPT gave me was:

youtube_url=$1

video_id=$(echo "$youtube_url" | sed -n -e 's/^.*[?&]v=\([^&]*\).*$/\1/p; s/^.*`youtu.be`\/\([^?]*\).*$/\1/p')

if [ -n "$video_id" ]; then

echo "$video_id"

else

echo "Video ID not found in the given URL."

This works, basically. But my problem is that it only really works correctly with URLs of the first type. This will echo the correct video id,12345678901 and end. Which is the correct response I want with all 3 URLs. With the second or third type of URLs it will echo a Job id# then12345678901 and waits for me to hit ENTER before echoing a job id# with +Done and the function name. This is an unwanted result as I just want the result and no job id#s or having to press ENTER or an echo of the function name. What do I have to add for this to happen???

https://redd.it/18n7utu
@r_bash
Was planning to use the output of a command in a bash noscript, but I don't know how to deal with the command behavior

I'm fiddling with motd, to be able to display some information at login.

I created this noscript:

#!/bin/bash
echo "OS: $(lsbrelease -s -d)"
echo "sendmail: $(sendmail -V)"

Fantasizing about this result:

OS: Ubuntu 22.04.3 LTS
sendmail: sSMTP 2.64 (Not sendmail at all)

But got this instead:

OS: Ubuntu 22.04.3 LTS
sSMTP 2.64 (Not sendmail at all)
sendmail:

Then I tried to assign the result of "sendmail -V" to a variable and get it printed:

#!/bin/bash
echo "OS: $(lsb
release -s -d)"
sendm=$(sendmail -V)
echo "sendmail: ${sendm}"

But it didn't work:

OS: Ubuntu 22.04.3 LTS
sSMTP 2.64 (Not sendmail at all)
sendmail:

Apparently "sendmail -V" is related only to sSMTP.

My actual point here is to learn what is going on, and if it's possible to achieve what I want with this specific kind of output. I kind of see what is going on, I mean, that the output is different than what I see in other commands I've dealt with before, but have no idea how to begin to understand it or to talk about it. I don't really care about displaying the version of sSMTP, it's just overall curiosity now.

UPDATE: $(sendmail -V 2>&1) did the trick, it was going to stderr and I just wouldn't find out by myself. Thank you!

https://redd.it/18n7343
@r_bash
Bash noscript as a service - but able to display STDOUT on request?

Hi guys

I have written a series of Bash noscripts that run as services on my home server.

But is there a way, I can get the running service to come to the foreground and display STDOUT (and maybe evend STDERR) as if it was running as a standard noscript.

Like when I run a noscript in Screen, I can always just type screen -r (pid) and it pops to the front again, then CTRL+A D and it goes back to the background. I want to do something like this but as a service?


Edit: Reading the man page for screen. I see there is an option -S that allows me to name a screen. If I t was to put under exec in my service file: screen -S nameofservice ./nameofnoscript.sh would that run the service in a screen session then I can use screen -r nameofservice to bring it to the foreground.

https://redd.it/18ni4n6
@r_bash
Special characters in password

Hi there,

I have a situation where I an running bash noscript in data pipeline orchestrator. Script retrieves password from orchestrator's env variable and passes it to docker run command. I am not setting the original password, it comes from external source and I do not have any influence on that. The problem is the password can contain any of special characters ' " $ or any other, for ex. #U{7TK('\\'')}4WQ@5@$8_\^uvdrt$%\^(.

So, I can not use '$password' since if password has ' in it it will be broken. I could use "$password" but then if I have $ in password it will be broken again as $ will be treated as beginning of variable.
I have tried escaping special chars with function, but nothing really worked.

The idea is to have:

function escape_chars () {

some function

}

docker run - p $(escape_chars "$password_comming_from_external_source") .....

Any ideas with this?

Thanks a lot!

https://redd.it/18o84nm
@r_bash
Different behaviour in running noscript through bash and sh

This might be very naive.
I was testing something when I noticed this behaviour.
My noscript test.sh contains the following line-
source .bashrc

When I run it like bash test.sh it works but when I run it like sh test.sh, it gives the error -
sample.sh: line 1: source: .bashrc: file not found
I wanted to know the reason for it.

https://redd.it/18o95v0
@r_bash
interrupt running bash noscript while keys are pressed

hi, bash noscripting noob here looking for help finding a graceful way to interrupt a running noscript which uses ydotool to simulate keypresses.

I've written a noscript that looks something like this:

#!/bin/bash
while true; do
YDOTOOLSOCKET="$HOME/.ydotoolsocket" ydotool key 30:1
sleep 30
YDOTOOLSOCKET="$HOME/.ydotoolsocket" ydotool key 30:0
sleep 1
done

the idea being that ydotool holds a key down, releases, then loops back to keep doing that indefinitely

while I can ctrl-c to stop the noscript, doing that does not seem to release the keypress, so even after the noscript stops running that key isn't usable unless I sudo pkill ydotoold.

does anyone know of a way to include a keybind in the bash noscript to interrupt the loop and release all pressed keys or pkill ydotoold directly?

sorry I'm definitely overlooking something, I bet there's a really simple way to do this that I'm missing!!

as an aside, the YDOTOOL_SOCKET bit is a result of the ydotoold daemon being started with the command sudo -b ydotoold --socket-path="$HOME/.ydotool_socket" --socket-own="$(id -u):$(id -g)" to allow the user to run the noscript without root permissions. does anyone happen to know how this actually works? does the socket path need to be set before every ydotool command or can I just put it once in the noscript and then ydotool will figure it out?

thanks!

https://redd.it/18oe2gd
@r_bash
awk matching pattern and print until the next double empty blank line?

how can i print match string until the next double empty line?

# alfa
AAA

BBB
CCC


# bravo
DDD
EEE

FFF


# charlie
GGG
HHH
III



This command works but it only for the first matching empty line.

I need something that will match the next double empty line

awk '/bravo/' RS= foobar.txt

# bravo
DDD
EEE

Wanted final output

# bravo
DDD
EEE

FFF

https://redd.it/18om72p
@r_bash
Failing assert_success even though noscript runs successfully and produces correct output

This is probably a very trivial thing, but I just don't know what is happening. I am new to bash (but not completely new to programming), and I am trying to solve a bunch of exercises on [exercism.org](https://exercism.org).

I was solving [this](https://exercism.org/tracks/bash/exercises/two-fer) problem, and for some reason, my noscript fails the bats test. I am asked to output "One for you, one for me." when noscript is run with no args. And output the same thing except I'll replace "you" with whatever name I got as an arg. Below is the error message that I get.
```
1..5
not ok 1 no name given
# (from function `assert_success' in file bats-extra.bash, line 409,
# in test file two_fer.bats, line 24)
# `assert_success' failed
#
# -- command failed --
# status : 1
# output : One for you, one for me.
# --
#
ok 2 a name given # skip
ok 3 another name given # skip
ok 4 handle arg with spaces # skip
ok 5 handle arg with glob char # skip

```
And this is my noscript:
```
#! /bin/bash

[[ -z $1 ]] && echo "One for you, one for me."
[[ -n $1 ]] && echo "One for $1, one for me."

```

https://redd.it/18ooh6i
@r_bash
inserting a file into a another one after/before a matching pattern with and without new lines added

I'd like to update my CHANGELOG.md file by extracting automatically the changes from the repo, using the glab program.

I also would like to retain the format of my CHANGELOG.md so I'd like to insert the output of glab into the CHANGELOG.md after a certain string matching, but unfortunately I'm not able to insert it after a new line.

I've tried the following:

 1221  Dec/22 - 01:55:31 sed '/v\d+\d+\d+/i changes.md\n' CHANGELOG.md
1222 Dec/22 - 01:58:54 sed '/## v\d+\d+\d+.*$/i changes.md\n' CHANGELOG.md
1223 Dec/22 - 01:59:05 sed '/## v\d+\d+\d+.*$/i changes.md\n' CHANGELOG.md | less
1224 Dec/22 - 01:59:40 sed '/semver/a \nchanges.md\n' CHANGELOG.md | less
1225 Dec/22 - 02:00:00 sed '/semver/a \n changes.md\n' CHANGELOG.md | less
1226 Dec/22 - 02:00:17 sed '/semver/a \n/a changes.md\n' CHANGELOG.md | less
1227 Dec/22 - 02:01:15 sed '/semver/r changes.md' CHANGELOG.md | less
1228 Dec/22 - 02:01:31 sed '/semver/r \n changes.md' CHANGELOG.md | less
1229 Dec/22 - 02:02:03 sed '/semver\n/r changes.md' CHANGELOG.md | less
1230 Dec/22 - 02:02:20 sed '/semver.org\/\n/r changes.md' CHANGELOG.md | less
1231 Dec/22 - 02:02:30 sed '/semver/r changes.md' CHANGELOG.md | less
1233 Dec/22 - 02:05:00 sed '/semver/a\nchanges.md' CHANGELOG.md | less
1234 Dec/22 - 02:06:55 sed '/semver/a\\\\\nchanges.md' CHANGELOG.md | less
1235 Dec/22 - 02:07:08 sed '/semver/a\\\nchanges.md' CHANGELOG.md | less
1236 Dec/22 - 02:07:18 sed '/semver/a\\nchanges.md' CHANGELOG.md | less
1237 Dec/22 - 02:08:18 sed -e '/semver/a\\\\\nchanges.md' CHANGELOG.md | less
1238 Dec/22 - 02:08:34 sed -e '/semver/a\nchanges.md' CHANGELOG.md | less
1239 Dec/22 - 02:08:49 sed -e '/semver/a \nchanges.md' CHANGELOG.md | less
1240 Dec/22 - 02:09:04 sed -e '/semver/a \\nchanges.md' CHANGELOG.md | less
1241 Dec/22 - 02:09:23 sed -e '/semver/a \\nchanges.md' CHANGELOG.md | head -n 20
1242 Dec/22 - 02:09:33 sed -e '/semver/a \\n changes.md' CHANGELOG.md | head -n 20
1243 Dec/22 - 02:09:42 sed -e '/semver/a \\\\\n changes.md' CHANGELOG.md | head -n 20
1244 Dec/22 - 02:09:50 sed -e '/semver/a \\\n changes.md' CHANGELOG.md | head -n 20
1245 Dec/22 - 02:12:33 sed '/semver/{r changes.md a\}' CHANGELOG.md | head -n 20
1246 Dec/22 - 02:14:06 sed '/semver/{\n e cat changes.md}' CHANGELOG.md | head -n 20
1247 Dec/22 - 02:14:18 sed '/semver/{e cat changes.md}' CHANGELOG.md | head -n 20
1248 Dec/22 - 02:14:47 sed '/semver/e cat changes.md' CHANGELOG.md | head -n 20
1249 Dec/22 - 02:15:13 sed '/semver/r \n e cat changes.md' CHANGELOG.md | head -n 20
1250 Dec/22 - 02:15:28 sed '/semver/r \n /e cat changes.md' CHANGELOG.md | head -n 20
1270 Dec/22 - 15:28:05 sed '/semver\.org\/\n/r changes.md' CHANGELOG.md | head -n 20
1272 Dec/22 - 15:28:13 sed '/semver\.org\/\n/r changes.md' CHANGELOG.md | head -n 20


As you can see quite a few attempts... :(

I've first tried to append it before the last available version, then after the semver.org line, nothing seemed to work. Also tried with Bard and ChatGPT...

It does not require to be sed, I just thought it would have been the right tool for the job.

Any help is truly appreciated.

https://redd.it/18ooct1
@r_bash
Tree command include contents of a zip file

Is it possible to create a tree of all files in a folder including the contents of zips? Thanks in advance

https://redd.it/18pav4d
@r_bash
Writing my first bash noscript -- looking for hints

Hi everyone, I hope you are all doing great!

The idea: I want to create a noscript to move all my screenshots from my desktop to a folder I called Screenshots.

What I did:

I needed a way to grep/find the screenshots on my desktop so I had the following

#SCREENSHOT=$(grep -lR "Screenshot" --include="2023" $DESKTOP)
SCREENSHOT=$(find Screenshot
.png)

then I wanted to do a simple mv to my new folder

mv $SCREENSHOT Screenshots

The problem:
I realized a screenshot filename is written as follows: Screenshot 2023-XX-XX at XX.XX.XX

When I send it to mv it interprets this filename as 4 different strings. So it thought to use "tr" to remove the whitespaces like this example... it doesn't work at all.

NAME="Screenshot 2023-12-18 at 21.03.25"
VALUE=$(echo $NAME | tr ':space:' '-')
mv $VALUE Screenshots

This doesn't work because VALUE (Screenshot-2023-12-18-at-21.03.25) doesn't exists. so I need to rename my screenshot when it is on my desktop and then use the mv to its new destination. but how can I do so as mv sees my screenshot filename as 4 distinct elements?

btw-- i m on macos

https://redd.it/18pbz0t
@r_bash
Bash, printf formatting: accented characters ruin the formatting

Let's take the following code. The first command is echo, just to set the stantards, and the following commands use printf to format the text, as if there was a box around the text:

#!/bin/bash
text=Security
echo " ......................................................"
printf "%5s %-50s %-5s\n" "." "" "."
printf "%5s %-50s %-5s\n" "." "${text}" "."
printf "%5s %-50s %-5s\n" "." "" "."

This is the output:

......................................................
. .
. Security .
. .

Now let's change the text to Portuguese: "Segurança" instead of "Security", mind the "ç":

#!/bin/bash
text=Segurança
echo " ......................................................"
printf "%5s %-50s %-5s\n" "." "" "."
printf "%5s %-50s %-5s\n" "." "${text}" "."
printf "%5s %-50s %-5s\n" "." "" "."

This is the new output:

......................................................
. .
. Segurança .
. .

The dot at the end of the line of "Segurança" is out of place.

The same behavior can be seen with box drawing characters: take a look at what I had to do to achieve the same formatting (%7s instead of %5s), all the definitions in printf had to be changed:

#!/bin/bash
text=Security
echo " ┌────────────────────────────────────────────────────┐"
printf "%7s %-50s %-5s\n" "│" "" "│"
printf "%7s %-50s %-5s\n" "│" "${text}" "│"
printf "%7s %-50s %-5s\n" "│" "" "│"

To get:

┌────────────────────────────────────────────────────┐
│ │
│ Security │
│ │

I was OK with that, with weird trial and error values to draw the box, but when it comes to text, that can contain accented characters or not, in lots of lines, coming from variables, it is an issue.

Thank you in advance!

https://redd.it/18ph0a5
@r_bash
Help with find and exec function

I am trying to find some images and process them but i am not familiar with bash noscripting

https://preview.redd.it/i1dk1gacz88c1.png?width=1717&format=png&auto=webp&s=8a430baf7e70791adefc3c22cb3f1eed1a88a787

https://redd.it/18pvkw5
@r_bash
The order of the $PATHs matters! Depends on what? And how can I change it?

We are two Debian users, both with the same \~/.profile and \~/.bashrc files with defaults (no changes in them). The only additional line is this in the \~/.bashrc file:

​

export PATH=$PATH:$(xdg-user-dir USER)/.local/bin

By performing the command echo $PATH I get this:

​

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/ivan/.local/bin

and him have this:

​

/home/sz/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/sz/.local/bin:/home/sz/.local/bin

​

The result is that my binary symlinked in \~/.local/bin is working, not for him.

If him changes the line in its \~/.profile file from PATH="$HOME/.local/bin:$PATH" to PATH="$PATH:$HOME/.local/bin" the result is similar to the mine:

​

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/sz/.local/bin

​

and the symlink is working as expected.

​

Why all this happens? Why him have to edit the \~/.profile file to reach my results?

https://redd.it/18q8r4q
@r_bash
First noscript with bash

Hey everyone,

I am trying to write a program that calculates the distance between two amino acids in a peptide sequence. I am stuck on an if statement to check if a user's choice of amino acid is found among the amino acid sequence. I know python has a string index like str1[1:n+1\]. But how do I use bash to check if the user's input is among the characters of a string.

​

Code:

​

echo "Enter your peptide sequence: " #To know what sequence to work with from the user

read $peptide_sequence #To sequence as a variable

​

echo "Select atom #1" #to prompt the user to pick an atom among the sequence they selected

read $atom1_select

​

echo "Select atom #2" #same prompt for the next atom

read $atom2_select

\#below I am trying to calculate the distance between the two atoms in the sequence

for amino_acid in ${peptide_sequence:0}

do

if [ $atom1_select==${peptide_sequence:0}\];

then

echo "Atom#1 is $atom1_select"

elif[ $atom2_select==${peptide_sequence:0}\];

then

echo "Atom#2 is $atom2_select"

else

echo "Select an atom from your peptide sequence"

fi

done

https://redd.it/18rpdrx
@r_bash
Use MarkdownExec to interactively select and execute fenced code blocks in markdown files.

The ["Markdown
Exec (MDE)"](https://github.com/fareedst/markdownexec) application is a tool for executing `bash` code blocks extracted from Markdown (MD) documents. MDE operates in a Ruby and Ubuntu environment, employing Bash for noscript execution.

**Platform Specifications:**

- **Base Platform:** Ruby for Ubuntu systems.

- **Shell Integration:** Incorporates Bash for executing noscripts.

- **Configuration and Metadata Management:** Utilizes YAML for managing configuration and metadata.

- **User Interface:** Boasts a terminal interface with ANSI colors for enhanced readability and engagement.

**Core Functionalities:**

1. **LLM Output Integration:** MDE adeptly reads MD files from LLMs, focusing on identifying and processing `bash` fenced code blocks.

2. **Document Processing and Menu Interface:** Transforms MD text into an accessible format. It distinguishes fenced code blocks, converting them into interactive menu items akin to hyperlinks for straightforward navigation.

3. **Interactive User Experience:** Offers keyboard navigation within the menu, enabling users to execute desired blocks by selecting relevant menu items.

4. **Script Execution and Output Display:** Executes chosen noscripts and presents outputs, utilizing ANSI colors for distinction and emphasis. The menu dynamically updates to reflect changes post-execution.

5. **Application Use Cases:** Suited for executing automated noscripts from LLM recommendations, serving as an interactive educational platform, and assisting developers in rapid prototyping.

6. **Automated Execution via Command Line Arguments:**

- MDE supports automated operation by specifying the document and block names in command-line arguments.

- Designated blocks are executed in order, encompassing navigation and execution within new documents accessed via links or imports.

- When block names are specified, MDE automatically concludes operations post-execution, optimizing batch processes and automation.

**Extended Functionalities:**

1. **Block Naming and Dependencies:**

- Fenced code blocks are identified by type (`bash`) and unique names for effortless referencing.

- MDE accommodates dependencies among code blocks, facilitating execution of prerequisite noscripts before the target noscript.

2. **Code Block Reusability and Document Navigation:**

- **
@import Directive:** MDE features an "@import" directive to boost code reusability, allowing the insertion of blocks from other documents at the directive's location, fostering modular coding.

- **Link Block Type:** MDE integrates a "link" block type for seamless document navigation. Execution of this block shifts focus to the specified file, as shown below:

```link :go
tomenu

file:
menu.md

```


**Customization and Configuration:**

- MDE allows extensive customization, including numerous options for matching source document text, formatting, and coloring output, and personalizing the MDE interface.

- Users can configure MDE settings via configuration files, environment variables, program arguments, and within markdown documents.

**Configuration Sources:**

1. **Environment Variables:** MDE reads the current environment, including configuration in the current and child shells and the current command.

2. **Configuration Files:** MDE accommodates configurations in all shells and supports a dedicated `.mde.yml` file in the current folder, or a specified YAML file.

3. **Program Arguments:** Users can set options directly through command arguments.

4. **Opts Fenced Code Blocks:** MDE recognizes configuration in `opts` blocks, applying settings when the document is loaded or blocks are executed.

**Example Markdown Document:**

These blocks illustrate the use of named and dependent `bash` code blocks and the `link` block type.

```bash :initialize
environment
# Initial environment setup commands
echo "Initializing environment..."

bash :dataprocessing +initializeenvironment
Use Markdown_Exec to interactively select and execute fenced code blocks in markdown files.

The ["Markdown_Exec (MDE)"](https://github.com/fareedst/markdown_exec) application is a tool for executing `bash` code blocks extracted from Markdown (MD) documents. MDE operates in a Ruby and Ubuntu environment, employing Bash for noscript execution.

**Platform Specifications:**

- **Base Platform:** Ruby for Ubuntu systems.

- **Shell Integration:** Incorporates Bash for executing noscripts.

- **Configuration and Metadata Management:** Utilizes YAML for managing configuration and metadata.

- **User Interface:** Boasts a terminal interface with ANSI colors for enhanced readability and engagement.

**Core Functionalities:**

1. **LLM Output Integration:** MDE adeptly reads MD files from LLMs, focusing on identifying and processing `bash` fenced code blocks.

2. **Document Processing and Menu Interface:** Transforms MD text into an accessible format. It distinguishes fenced code blocks, converting them into interactive menu items akin to hyperlinks for straightforward navigation.

3. **Interactive User Experience:** Offers keyboard navigation within the menu, enabling users to execute desired blocks by selecting relevant menu items.

4. **Script Execution and Output Display:** Executes chosen noscripts and presents outputs, utilizing ANSI colors for distinction and emphasis. The menu dynamically updates to reflect changes post-execution.

5. **Application Use Cases:** Suited for executing automated noscripts from LLM recommendations, serving as an interactive educational platform, and assisting developers in rapid prototyping.

6. **Automated Execution via Command Line Arguments:**

- MDE supports automated operation by specifying the document and block names in command-line arguments.

- Designated blocks are executed in order, encompassing navigation and execution within new documents accessed via links or imports.

- When block names are specified, MDE automatically concludes operations post-execution, optimizing batch processes and automation.

**Extended Functionalities:**

1. **Block Naming and Dependencies:**

- Fenced code blocks are identified by type (`bash`) and unique names for effortless referencing.

- MDE accommodates dependencies among code blocks, facilitating execution of prerequisite noscripts before the target noscript.

2. **Code Block Reusability and Document Navigation:**

- **@import Directive:** MDE features an "@import" directive to boost code reusability, allowing the insertion of blocks from other documents at the directive's location, fostering modular coding.

- **Link Block Type:** MDE integrates a "link" block type for seamless document navigation. Execution of this block shifts focus to the specified file, as shown below:

```link :go_to_menu

file: menu.md

```


**Customization and Configuration:**

- MDE allows extensive customization, including numerous options for matching source document text, formatting, and coloring output, and personalizing the MDE interface.

- Users can configure MDE settings via configuration files, environment variables, program arguments, and within markdown documents.

**Configuration Sources:**

1. **Environment Variables:** MDE reads the current environment, including configuration in the current and child shells and the current command.

2. **Configuration Files:** MDE accommodates configurations in all shells and supports a dedicated `.mde.yml` file in the current folder, or a specified YAML file.

3. **Program Arguments:** Users can set options directly through command arguments.

4. **Opts Fenced Code Blocks:** MDE recognizes configuration in `opts` blocks, applying settings when the document is loaded or blocks are executed.

**Example Markdown Document:**

These blocks illustrate the use of named and dependent `bash` code blocks and the `link` block type.

```bash :initialize_environment
# Initial environment setup commands
echo "Initializing environment..."
```

```bash :data_processing +initialize_environment
# Data processing commands requiring initialized environment
echo "Processing data..."
```

```link :go_to_menu
file: menu.md
```

In this example, the `data_processing` block relies on `initialize_environment`. When selecting `data_processing`, MDE first executes `initialize_environment` to ensure proper setup before proceeding. The `link` block type enables navigation to `menu.md`, offering a structured and interconnected document system. These attributes make MDE an effective tool for managing complex noscript sequences and various applications. The automated execution feature via command-line arguments further enhances MDE's role in batch processing and workflow automation.

https://redd.it/18r1ygi
@r_bash