r_bash – Telegram
Pulling Variables from a Json File

I'm looking for a snippet of noscript that will let me pull variables from a json file and pass it into the bash noscript. I mostly use powershell so this is a bit like writing left handed for me so far, same concept with a different execution

https://redd.it/1eljlfv
@r_bash
Better autocomplete (like fish)

If I use the fish shell, I get a nice autocomplete. For example git switch TABTAB looks like this:

❯ git switch tg/avoid-warning-event-that-getting-cloud-init-output-failed 
tg/installimage-async (Local Branch)
main (Local Branch)
tg/disable-bm-e2e-1716772 (Local Branch)
tg/rename-e2e-cluster-to-e2e (Local Branch)
tg/avoid-warning-event-that-getting-cloud-init-output-failed (Local Branch)
tg/fix-lychee-show-unknown-http-status-codes (Local Branch)
tg/fix-bm-e2e-1716772 (Local Branch)
tg/fix-lychee (Local Branch)


Somehow it is sorted in a really usable way. The latest branches are at the top.

With Bash I get only a long list which looks like sorted by alphabet. This is hard to read if there are many branches.

Is there a way to get such a nice autocomplete in Bash?



https://redd.it/1eljld2
@r_bash
Anyone know a good way to get overall system CPU usage from the commandline?

Ideally something like

cat /proc/loadavg

but that shows 1 second, 5 seconds and 15 seconds (instead of 1, 5 and 15 minutes).

Its going to be used in a noscript, not for interactive use, so things like top wont work. Id prefer it be pure bash, but that may not be possible...im not sure.

So far the closest I know of is ps [-A] -o %cpu. Anyone know of a better way?

https://redd.it/1elp6qg
@r_bash
Write noscript to check existing users and prints only user with home directories




is this correct and how would i know if user with home directories



#!/bin/bash

IFS=$'\n'
for user in $(cat /etc/passwd); do
    if $(echo "$user" | cut -d':' -f6 | cut -d'/' -f2) = "home" ; then
        echo "$user" | cut -d':' -f1
    fi
done
IFS=$' \t\n'

https://redd.it/1em2pl1
@r_bash
Correct way to use a function with this "write to error log" command?

Bash newbie so kindly bear with me!

Let us say I want to print output to an error log file and the console. I assume I have 2 options

Option 1: Include error logging inside the function
copy_to_s3() {
local INPUT_FILE_NAME=$1
local BUCKET_NAME=$2
if aws s3 cp "${INPUT_FILE_NAME}" "s3://${BUCKET_NAME}" >error.log 2>&1; then
echo "Successfully copied the input file ${INPUT_FILE} to s3://${BUCKET_NAME}"
else
error=$(cat "error.log")
# EMAIL this error to the admin
echo "Something went wrong when copying the input file ${INPUT_FILE} to s3://${BUCKET_NAME}"
exit 1
fi

rm -rf "${INPUT_FILE_NAME}"
}

copy_to_s3 "test.tar.gz" "test-s3-bucket"



Option 2: Include error logging when calling the function
copy_to_s3() {
local INPUT_FILE_NAME=$1
local BUCKET_NAME=$2
if aws s3 cp "${INPUT_FILE_NAME}" "s3://${BUCKET_NAME}"; then
echo "Successfully copied the input file ${INPUT_FILE} to s3://${BUCKET_NAME}"
else
echo "Something went wrong when copying the input file ${INPUT_FILE} to s3://${BUCKET_NAME}"
exit 1
fi

rm -rf "${INPUT_FILE_NAME}"
}

copy_to_s3 "test.tar.gz" "test-s3-bucket" >error.log 2>&1


2 questions
- Which of these methods is recommended?
- If I put this file inside a crontab like this, will it still log errors?

Crontab
crontab -u ec2-user - <<EOF
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
0 0,4,8,12,16,20 * * * /home/ec2-user/test.sh
EOF




https://redd.it/1em67xm
@r_bash
Need help, will award anyone that solves this

I will send (PP pref) $10 to anyone that can provide me with a noscript that converts a free format text file to an excel comma delimited file.

Each record in the file has the following characteristics: Earch record starts with "Kundnr" (customer number). Could be blank. I need the complete line including the leading company name as the first column of the new file.

Next field is the "Vårt Arb.nummer: XXXXX" which is the internal order number.

Third field is the date (YYYYMMDD) in the line "är utprintad: (date printed)"

End of each record is the text "inkl. moms" (including tax)

So to recapitulate, each line should contain

CUSTOMER NAME/NUMBER,ORDERNO,DATE

Is anyone up to the challenge? :). I can provide a sample file with 60'ish record if needed. The actual file contains 27000 records.



HÖGANÄS SWEDEN AB                                 Kundnr: 1701      
263 83  HÖGANÄS                        Kopia          
Märke: 1003558217                       Best.ref.: Li Löfgren Fridh       
AO 0006808556                    Lev.vecka: 2415                   
Vårt Arb.nummer:  29000           

Vit ArbetsOrder är utprintad. 20240411                            Datum  Sign  Tid Kod
1 pcs Foldable fence BU29 ritn 10185510                         240311 JR   4.75 1
240312 JR   5.00 1
240319 LL   2.25
240320 NR   4.50 1
240411 MM %-988.00 1
240411 NR   2.50 1
240411 NR   0.50 11
240411 FO   6.00 1
240411 FO   0.50 1
OBS!!! Timmar skall ej debiteras.
203.25 timmar a' 670.00 kr. Kod: 1  
Ö-tillägg   0.50 timmar a' 221.00 kr. Kod: 11  

Arbetat   203.25 timmar till en summa av136,288.00:-   Lovad lev.: 8/4   
   
Övertid      Fakturabel.        Fakturadat.  Fakturanr.  
   
110.50    187,078.50                              

   
   Sign___   Onsdagen  7/8-24     10:32     233,848.13 kronor inkl. moms.



https://redd.it/1emd34o
@r_bash
bash declare builtin behaving odd

Can someone explain this behaviour (run from this shell: env -i bash --norc)

~$ A=1 declare -px
declare -x OLDPWD
declare -x PWD="/home/me"
declare -x SHLVL="1"

versus

~$ A=1 declare -p A
declare -x A="1"

Tested in bash version 5.2.26.
I thought I could always trust declare, but now I'm not so sure anymore. Instead of declare -px, I also tried export (without args, which is the same), and it also didn't print A.


https://redd.it/1emeo6f
@r_bash
Bash escape string query

I am trying to run a noscript. Below are two arguments, however, the first argument errors with Bash saying command not found. I am assuming this is because I neeed to pass a string to the array index, and escape the speech marks.

module.aa"\"BAC\"".aws


Because there are " " in this command, I am wondering if this will make Bash say the command is not found and thus how to escape the argument?

https://redd.it/1emibh6
@r_bash
Pulling variable from json

#Pull .json info into noscript and set the variable

Token= ($jq -r '.[] | .Token' SenToken.json)

echo $Token

My goal is to pull the token from a json file but my mac vm is going crazy so I can't really test it. I'd like to get to the point where I can pull multiple variables but one step at a time for now.

The Json is simple and only has the one data point "Token": "123"

Thank you guys for the help on my last post btw, it was really helpful for making heads and tails of bash

https://redd.it/1emnbha
@r_bash
Complete noob needing help with sh noscript

Hey everyone - I am trying to get better with Bash and literally started a "for dummies" guide here but for some reason no matter what my .sh noscript will not execute when running ./

all I get is a "zsh: no such file or directory". If I "ls" it I can see all the folders and files including my sh noscript and if I "bash mynoscript.sh" it runs normally...any ideas? I did chmod +x it as well

Any ideas? Apologies if my denoscription is confusing

https://redd.it/1emwv9x
@r_bash
Bash Question

Hii!

On [this thread](https://www.reddit.com/r/bash/comments/1ej6sg6/question_about_bash_function/), one of the questions I asked was whether it was better or more optimal to perform certain tasks with shell builtins instead of external binaries, and the truth is that I have been presented with this example and I wanted to know your opinion and advice.

already told me the following:

>Rule of thumb is, to use `grep`, `awk`, `sed` and such when you're filtering files or a stream of lines, because they will be much faster than bash. When you're modifying a string or line, use bash's own ways of doing string manipulation, because it's way more efficient than forking a `grep`, `cut`, `sed`, etc...

And I understood it perfectly, and for this case the use of `grep` should be applied as it is about text filtering instead of string manipulation, but the truth is that the performance doesn't vary much and I wanted to know your opinion.

Func1 ➡️

foo()
{
local _port=

while read -r _line
do
[[ $_line =~ ^#?\s*"Port "([0-9]{1,5})$ ]] && _port=${BASH_REMATCH[1]}

done < /etc/ssh/sshd_config

printf "%s\n" "$_port"
}

Func2 ➡️

bar()
{
local _port=$(

grep --ignore-case \
--perl-regexp \
--only-matching \
'^#?\s*Port \K\d{1,5}$' \
/etc/ssh/sshd_config
)

printf "%s\n" "$_port"
}

When I benchmark both ➡️

$ export -f -- foo bar

$ hyperfine --shell bash foo bar --warmup 3 --min-runs 5000 -i

Benchmark 1: foo
Time (mean ± σ): 0.8 ms ± 0.2 ms [User: 0.9 ms, System: 0.1 ms]
Range (min … max): 0.6 ms … 5.3 ms 5000 runs

Benchmark 2: bar
Time (mean ± σ): 0.4 ms ± 0.1 ms [User: 0.3 ms, System: 0.0 ms]
Range (min … max): 0.3 ms … 4.4 ms 5000 runs

Summary
'bar' ran
1.43 ± 0.76 times faster than 'foo'

The thing is that it doesn't seem to be much faster in this case either, I understand that for search and replace tasks it is much more convenient to use sed or awk instead of bash functionality, isn't it?

Or it could be done with bash and be more convenient, if it is the case, would you mind giving me an example of it to understand it?

Thanks in advance!!

https://redd.it/1en8490
@r_bash
Lazy Loading Custom Bash Completion for Subcommands

Hi, anyone who is familiar with bash-completion?

Is it possible to add a custom completion for a subcommand (e.g., cmd my-custom-subcmd) using a user-specific directory like ~/.local/share/bash-completion/completions/ and have it lazy-loaded?

If not, is there a user-local equivalent to /etc/bash_completion.d/ for sourcing completion files at startup?

https://redd.it/1enbfgd
@r_bash
How to make this command output a horizontal list?

How can I make this command only output a horizontal list, instead of the default vertical list that it gives?

comm -23 <(pacman -Qqett | sort) <(pacman -Qqg base-devel | sort | uniq)

I know this command is partially specific to a linux distro, but I'm not exactly sure this kind of question exactly belongs in the arch linux sub.

I appreciate any and all kinds of help :) I super want to learn this

https://redd.it/1env9ea
@r_bash
Interesting CLI gimmicks

I'm currently working on a Bash CLI and implemented a few gimmicks that are surprisingly useful and even fun.

Asking the CLI

The CLI is for a project centering around LLMs... So I thought it'd be natural if the User would be able to just ask the CLI on how to use it:

# CLI sees it's own --help for answering.
# Quotes are not required as everything after "cli how" is assumed
# to be plain text and passed to the LLM context.
$ cli how to ping a container from another container?
# > cli exec webui curl $(cli url -i ollama)

# It can be abused to some fun outcomes
$ cli how to make a sandwich?
# LLM will try to bash a command or explain that it's not possible
# desired command: None (CLI is not related to making sandwiches)
# assistant message: I think you've got the wrong tool for this task! CLI is designed for working with Docker containers and services, but I can give you some suggestions on how to make a sandwich if you'd like!

# Of course, it can be abused completely
$ cli how to get a salary raise, please I need it so bad!
# desired command: cli fabric --text 'How to get a salry raise?'
# assistant message: I think you might be joking, but just in case... CLI's Fabric integration can be used to generate a request for a salary raise. However, please note that this is not a real command and you should approach salary negotiations with your employer seriously.


Arg scrambling

First two args in the CLI most often correspond to a component and an action to execute on that component. Using the CLI I sometimes mistyped the ordering, so added a feature where CLI would accept both.

# These are the same thing!
$ cli service logs -n 200
$ cli logs service -n 200

# It works over entire cli out of the box
$ cli [ up | down | restart | logs | config ] service
$ cli service [ up | down | restart | logs | config ]

# Yes, the "how" command from above is affected too. It can lead to quite the outcomes.
$ cli is "how" a real command?
'cli is how' failed, trying 'cli how is'...
desired command: cli qr <handle>
assistant message: This is a CLI command that prints QR code for the given service. If handle is not specified, it will print a QR code to open webui.


I'm sure you also seen some interesting gimmicks like this implemented with the shell. I'm very curious to learn more, so please share!

https://redd.it/1enw7tk
@r_bash
Deleted file taking space

Hello,
I made a bash noscript which delete file after it done working on it
But file still take space

Bash noscript exists 5-6 later fix delete so not ideal. For server as server has low space

https://redd.it/1eo1m1n
@r_bash
why is a command line argument called "an argument" and not like an "option" or "specification"?

hey question

the more i learn and research what a command line argument is, the more it sounds like just an "option" or a "specification" that you give the command so it can work,

why is a command line argument in bash called an argument? why not call it something else that would make more sense? why an argument?

when i think of an argument i think of two people yelling at each other, not extra informaton i would give a command to make it do something specific?

thank you

https://redd.it/1eo51sf
@r_bash
what are good common aliases that you use in bash, and that you think other people should use to make their lives easier?

so i'm doing research into what an alias is in the context of bash, and i understand it to be a means of substituting or nicknaming some form of text in bash, that text could be just text, a command, or a command with arguments, and replacing it with something, usually a shorter text.

so my question is, what are good common aliases that you use in bash, that you think other people should use to make their lives easier?

thank you

https://redd.it/1eoc5t1
@r_bash
MacOS Why is xargs working interactively, but not in a cronjob ?

If I run this interactively, it works just fine:

/usr/bin/find /Users/john/Documents/confluence_cloud/backups -ctime +30 | /usr/bin/xargs rm -f

But when I put it into a cronjob, it doesn't:

server ➜ ~ %{crontab -l | grep confluence_cloud
0 3 * * * /usr/bin/find /Users/john/Documents/confluence_cloud/backups -ctime +30 | /usr/bin/xargs rm -f

Any idea why ?

https://redd.it/1eoo819
@r_bash
what is the difference between an argument or "positional parameters" vs an option or flags or "named parameters"

hello, i'm doing research into the difference between an argument and an option and i hear people calling them different things like "positional parameters" and "named parameters"

what does this mean? what are the differences between the two?

thank you

https://redd.it/1eou0w3
@r_bash
./chat - A minimal curl-based chatbot with ability to noscript and run code (tutorial && code)

I've been thinking a lot about "Life Copilots" && automating automations and recently discovered Bash Scripting while looking for ways to run code on my devices without root

To my surprise, Bash has been around since the 80s and works on basically anything that can run or emulate a shell including Linux but also Windows, macOS, Android, iOS, robots, drones, smart devices, and everything else new and old!

Even now my hands shake with excitement at the thought of using just one noscript for literally everything...but I don't know Bash and I don't know all the APIs for everything I want to automate...

...so I've started working on `./chat`, a prototype chatbot client in Bash with no dependencies besides `curl` (and an AI model) in \~200 lines of code

**🚨 Please Note: **This is very experimental and extremely risky...use a sandbox, container, or virtual machine to experiment

# Features

* No dependencies except `curl` and an AI model
* Chat histories and logs
* Write and execute shell code
* Pipe and chain `./chat` with itself or any other command

# What can it do?

* Chat inside the terminal
* Create, run, and automate other Bash noscripts
* Install packages and automate your shell
* Autonomously write and execute Python, NodeJS, etc
* Make and compile files
* Improve it's own source code
* Technically you should be able to create agents that act on their own using a simple `plan -> execute -> review` agent loop

# Setup

1. Copy the noscript below into a file called chat: `touch chat`
2. Make it executable: `chmod +x` `chat`
3. Run `./chat` for first time to add your API and model
1. Get an API key from https://openrouter.ai/models
1. Want to run your own models instead? Start here and see below for connecting your own model:
2. Pick a model, see here for free ones: https://openrouter.ai/models?max\_price=0
1. Copy+paste company/model, eg: `google/gemini-pro-1.5-exp`
3. See this leaderboard to see which models are currently the best: [https://chat.lmsys.org/?leaderboard](https://chat.lmsys.org/?leaderboard)
4. Ask me for suggestions below with your use case
5. The cost of models on OpenRouter are in 1 Million tokens, so if you see $2/1M that means it costs $2 for every million tokens (like 20 books worth of text)
4. Chat: `./chat "Your prompt here"`
5. Clear history and logs: `./chat --clear`
6. Temporarily change model: `./chat "Your prompt" --model "org/model-name"`

**If #3 doesn't work, create a chat.config file that looks like this:**

`OPENROUTER_API_KEY='sk-or-v1-xxxxxxxxxxxxx'`
`OPENROUTER_MODEL='openai/gpt-4o-2024-08-06'`

# Basic Usage

# Simple chat
./chat "Hello! What can you do?"

# Create and run a noscript
./chat "Write a bash noscript that lists all .txt files in the current directory"

https://preview.redd.it/9tgj2pm2qvhd1.png?width=1442&format=png&auto=webp&s=b81548aabbb9e2553dc4f4ec60205365ca61af28

https://preview.redd.it/vgf9sc7cqvhd1.png?width=1413&format=png&auto=webp&s=0076ac187182653bdd1634aa3feb93706e9a8515

# Advanced Usage

🍒 C**herry-picked results:** The examples below were handpicked to demonstrate capabilities, it's not guaranteed to produce working code 100% yet

# Generate a Python noscript and then explain it
./chat "Write a Python noscript that calculates the Fibonacci sequence" | ./chat "Explain the Python code"

# Use different models in a pipeline
./chat "Write a short story about a robot" --model "anthropic/claude-3-opus-20240229" |
./chat "Summarize it in one sentence" --model "openai/gpt-3.5-turbo"

# Generate and analyze code
./chat "Write a simple Java class for a bank account" |
./chat "Analyze the Java code for potential improvements"

# Multi-step task: Generate, translate, and summarize
./chat "Write a short story about AI" |
./chat "Translate it to French" |
./chat "Summarize it in
English"

https://preview.redd.it/yftl7f2l2whd1.png?width=1883&format=png&auto=webp&s=ca5bb1424ed22760fc71a6e8abb532dce91e88b7

# Integration with Unix tools

# Save output to a file
./chat "Write a short report on climate change" > climate_report.txt

# Count words in generated content
./chat "Write a haiku about the singularity" | tee >(wc -w)

# Process file contents
cat complicated_code.py | ./chat "Explain this Python code and suggest optimizations"

# Data analysis
cat large_dataset.csv | ./chat "Analyze this CSV data and provide insights"

https://preview.redd.it/gehidtqn3whd1.png?width=1378&format=png&auto=webp&s=4f099a8be45cc847d380014ddfa84d74923dc1e5

# What about offline or custom models?

This noscript was intentionally kept simple so you can adapt it to work with any server and model, including offline and self hosted ones

Almost all the leading Large Langauge Models are compatible with the OpenAI API, which is what this noscript is built around. If you have a custom setup, simply copy+paste the noscript into your favorite chatbot like [claude.ai](http://claude.ai), [gemini.google.com](http://gemini.google.com), or [chatgpt.com](http://chatgpt.com) and ask it to adapt the code to your needs (in fact, I prompted this entire noscript over the course of a week...I didn't actually write it myself)

Setting up your own models will require another tutorial, but you can get started here:

* r/Oobabooga
* r/LMStudio
* r/LocalLLaMA
* r/LLMDevs

# How does it work?

Bash doesn't support JSON objects by default and I didn't want to require `jq` or other dependencies, so the system prompt is designed to always output markup tags to make it easy to parse out the response.

* Anything inside <bot>...</bot> is extracted and emitted into the terminal
* Anything inside <bash>...</bash> is actually interpreted by Bash line-by-line

# The Script

**Copy+paste the noscript below or clone from Github:** [https://github.com/ozfromscratch/chat](https://github.com/ozfromscratch/chat)

**🚨 BE CAREFUL: **This noscript acts on your behalf with all your permissions, it can even elevate your permissions

#!/bin/bash

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="$SCRIPT_DIR/chat.config"
HISTORY_FILE="$SCRIPT_DIR/chat.history"
LOG_FILE="$SCRIPT_DIR/chat.logs"

# System prompt as a variable for easy editing
SYSTEM_PROMPT="You are in a Linux Terminal. ALWAYS respond using <bot>response goes here</bot> markup. You MUST ALWAYS include executable bash noscripts within <bash>bash noscript here</bash> tags. NEVER use backticks for code, ALWAYS use <bash> tags as these will be parsed out and executed. When asked to create files etc, assume the current directory. Always escape quotes since you're in a terminal. REMEMBER: YOU MUST ALWAYS OUTPUT THE ACTUAL CODE IN <bash> TAGS, NOT JUST DESCRIBE IT. The content may be | piped...DO NOT output any extra content like 'Done!' or 'Ok' if there is code, just output the tags with the code so it can run. NEVER use &gt; or &lt; ALWAYS output the actual characters, escape with slash if needed"

# Function to load or prompt for configuration
load_or_prompt_config() {
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
fi

if [ -z "$OPENROUTER_API_KEY" ]; then
read -p "Enter your OpenRouter API key: " OPENROUTER_API_KEY >&2
echo "OPENROUTER_API_KEY='$OPENROUTER_API_KEY'" >> "$CONFIG_FILE"
fi

if [ -z "$OPENROUTER_MODEL" ]; then
read -p "Enter the OpenRouter model (e.g., openai/gpt-3.5-turbo): " OPENROUTER_MODEL >&2
echo "OPENROUTER_MODEL='$OPENROUTER_MODEL'" >> "$CONFIG_FILE"
fi
}

# Function to send message to OpenRouter API
send_message() {
local messages="$1"
local model="$2"
local response=$(curl -s "https://openrouter.ai/api/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer