r_bash – Telegram
Inline man page as help.

A little noscript of mine showcasing inline man page for help. If call with -h sed is used to extract the man page and display it with man -l

I hope someone finds it helpful.

#!/bin/bash
#> .TH PDF2OCR-5
#> .SH NAME
#> pdf2ocr \- convert PDF to PNG, OCR and extract text.
#> .SH SYNOPSIS
#> .B pdf2ocr
#> \fB\-h\fR
#> \fB\-l\fR \fIlang\fP
#> .IR files ...
#> .SH DESCRIPTION
#> .B pdf2ocr
#> This is a Bash noscript that converts PDF files to PNG, applies OCR using
#> \fITesseract\fP with a German language option, and extracts text to a text
#> file. It takes options -h for help and -l for the language code. It uses the
#> 'convert' command to convert PDFs to PNGs and then loops through each PNG
#> file to apply OCR and extract the text using the Tesseract command. Finally,
#> the noscript deletes the PNG files. It has a manpage for more information and
#> references the Tesseract documentation.
#> .SS OPTIONS

# Default to German for OCR
lang=deu

# Get Options
while getopts ":hl:" options
do case "${options}" in
#> .TP
#> .BR \-h
#> Get help in form of a manpage
#>
h)
sed -n 's/^#>\s//p' $0 | man -l -
exit 1;;
#> .TP
#> .BR \-l
#> The language code use by \fITesseract\fP to do character recognition.
#> defaults to "deu" for German.
l)
lang=${OPTARG}
shift;;
esac
shift
done

# Show short help, if no file is given.
if [ -z "$
" ]
then
cat << EOF
Syntax: %s: -h -l lang Dateien\n
EOF
exit 0
fi

# Do the actual work:
for f in "$"
do
base=$(basename $(tr ' ' '_' <<< $f) .pdf)
convert -density 300x300 $f -colorspace RGB -density 300x300 $base.png
for png in $base
png
do
tesseract $png - --dpi 300 -l ${lang} >> $base.txt
rm $png
done
done

#> .SH "SEE ALSO"
#> tesseract(5)

https://redd.it/13fhkgb
@r_bash
How to deal with valid constructions when set -e is in effect ?

Hi there !

I learned that is a good practice to use `set -eu` on my noscripts. Fine.

But how I should handle sittuations wher I expect a command return a non zero status and it is ok ?

For instance, smartctl may return a non zero status when there is some problem or when I want to test the return status of `grep -q`

echo $var | grep -q is_this_string_present;
if [[ "$?" == "0" //; ] then...

in both situations the noscript will exit silent, which is not desirable...in the code above, the `if` statement never gets executed.....you see ?

Talking about that, how to prevent the noscript exit silent when an legitm error occur ? (with `set -e`)

https://redd.it/13fk6uc
@r_bash
A Robust Bash Script for Partial Cloning of Git Repositories

Hello fellow Redditors,

I wanted to share a bash noscript I've been working on that makes it easy to perform a partial clone of a Git repository. This noscript is especially useful if you only want to clone a specific branch and directory, rather than the entire repository.

Here's how it works:

1. The noscript prompts you to input the Git repository URL. It validates the URL to ensure it's correct.
2. Next, it asks for the depth of the clone. This is a number that specifies how many recent commits you want to include in your clone. By default, the depth is 1, meaning only the most recent commit is included.
3. You're then asked to input the branch you want to checkout. The default branch is 'main'.
4. The noscript then performs a sparse clone of the repository. This type of clone doesn't download the entire repository content but only the history of specific files or directories, making the clone operation faster and the resulting local repository smaller.
5. After the clone is successful, the noscript enables sparse checkout, which allows you to limit which files and folders are checked out to your local working copy.
6. Finally, you're prompted to input the specific directory you want to checkout. By default, this is the root directory.

I hope you find this noscript useful! Feel free to modify it according to your needs and share your improvements. Looking forward to your feedback!

https://github.com/BalliAsghar/partial-clone

Happy coding!

https://redd.it/13flrua
@r_bash
Bash must not run in POSIX mode. Please unset POSIXLYCORRECT and try again.

I'm trying to run a ruby noscript that downloads the Homebrew [
install.sh](https://install.sh) noscript and executes it, but I'm getting **Bash must not run in POSIX mode. Please unset POSIXLY\CORRECT and try again.

Did some little research on it, but still not clear what it is.

Can you give a little explanation on what it is, is it safe to unset it? and... What kind of "unexpected or different behavior" may I experience if unset?

https://redd.it/13fmc3l
@r_bash
piu-piu

Massive piu-piu update!
Finally got some time to fix some bugs and merge starship branch into master. For those who unfamiliar with piu-piu it's a scroller game with text based graphics written on bash that runs in CLI terminals. It looks like this:

shoot them all

Enemies can drop some power-ups like health packs, you'll need them to stay alive a bit longer:

health pack

Ammo is depleting, grab some in the process to keep firing:

ammo pack

And gun upgrades x2, x3, x4 and x5:

gun x2

gun x3

gun x4

gun x5

Here is gun x5 in action)

x5 in action

But the small ones it's just the beginning, there is a big guy in the end, Boss)

boss fight

The game supports multiplayer modes co-op and duel. It uses netcat for this so it must be installed if you want to play with friend.

team play

duel

Spoiler, I'm planing to do the next chapter on Mars, here is the story:

here the story goes

See you on Mars!)

https://i.redd.it/utlgcdbxmgza1.gif

https://redd.it/13fw8ph
@r_bash
This media is not supported in your browser
VIEW IN TELEGRAM
AppImagen: A noscript that generates a custom AppImage from Debian or from a PPA of your choice for the previous (not the oldest) and still supported Ubuntu LTS

https://redd.it/13gljdc
@r_bash
Made a simple bash noscript to stream from Lofi Girl or fccCodeRadio
https://redd.it/13gk9d9
@r_bash
Proxmox check assigned PCIe device noscript isn't working.

I'm trying to check for unassigned and assigned SR-IOV Virtual Function PCIe devices in Proxmox, but the bash noscript isn't displaying the PCIe devices attached to the VMs, and is instead stating "No PCIe device assigned". Any thoughts?

&#x200B;

Basic idea:

* Get a list of the VM IDs, and other info with `qm list --full`
* Get a list of all PCIe devices, except the main controllers with `lspci | grep "Ethernet controller: | grep -v "Ethernet controller: Intel Corporation Ethernet Controller 10G X550T (rev 01)"`
* Find the PCIe devices attached to each VM by getting all VMIDs with the from the qm list --full command, then running `qm config <VMID> | grep -E 'hostpci'` to get the attached PCIe device ID.
* Output a list of the VMs, assigned PCIe devices to each VM, and then all of the unassigned PCIe devices.

&#x200B;

#!/bin/bash

# Get the list of VMs and their details
vm_list=$(qm list --full)

# Get a list of all Ethernet devices excluding specified ones
all_eth_devices=$(lspci | grep "Ethernet controller" | grep -v "Ethernet controller: Intel Corporation Ethernet Controller 10G X550T (rev 01)" | awk '{print $1}')

# Initialize an empty array to store assigned PCIe devices
assigned_pcie_devices=()

# Iterate through the VM list
while read -r line; do
# Skip the header line
if [[ "$line" =~ VMID ]]; then
continue
fi

# Get VMID, NAME, and STATUS
vmid=$(echo "$line" | awk '{print $1}')
name=$(echo "$line" | awk '{print $2}')
status=$(echo "$line" | awk '{print $3}')

# Get hostpci configuration
hostpci=$(qm config "$vmid" 2>/dev/null | grep -E 'hostpci\d+')

# Check if the hostpci configuration exists
if [ ! -z "$hostpci" ]; then
# Extract all PCIe devices
pcie_devices=$(echo "$hostpci" | perl -ne 'print "$1\n" while(/(?:^|\s)host=([^,]+)/g)')

# Concatenate the PCIe devices into a single string
pcie_device_str=$(echo "$pcie_devices" | tr '\n' ',' | sed 's/,$//')

# Add PCIe devices to the assigned devices array
assigned_pcie_devices+=($pcie_devices)

# Print VMID, NAME, STATUS, and PCIe devices
echo "VMID: $vmid, NAME: $name, STATUS: $status, PCIe Devices: $pcie_device_str"
else
# Print VMID, NAME, and STATUS with "No PCIe device assigned"
echo "VMID: $vmid, NAME: $name, STATUS: $status, No PCIe device assigned."
fi
done <<< "$(echo "$vm_list" | tail -n +3)"

# Print a list of unassigned PCIe devices
echo "Unassigned PCIe devices:"
for device in $all_eth_devices; do
if ! [[ "${assigned_pcie_devices[*]}" =~ $device ]]; then
echo "$device"
fi
done

Any help would be greatly apprciated!

https://redd.it/13gu78h
@r_bash
HTOP thr

Hi guys, I hope you’re all good!

I’m racking my brain about something.

Basically I want to get the number of threads from HTOP. Now I know this is near-impossible so I have found other solutions, however when I try and understand them they seem contradictory.

My original plan was to parse Top, which was simple enough but when I checked my work I found that Top displays more threads than HTOP, so it was back to the drawing board.

After playing around I stumbled across two commands, and when the output of one is subtracted by the output of the other, the number matches what’s displayed on HTOP, these commands are:

‘’’ ps -eLf | tail -n+2 | wc -l ‘’’

And

‘’’ ps -eo nlwp | tail -n+2 | wc -l ‘’’

From my understanding, the first command lists all the all the processes on the system, and the second one lists the number of threads being used by each active process, so if that’s correct then the result of my sum is the number of processes without threads allocated to them, which doesn’t make sense.

Please can somebody enlighten me so that I can go back to living a normal life and think about other things.

Thanks in advance, and I widh you all the best.

https://redd.it/13gtgsn
@r_bash
huge list of bash aliases

I have been compiling some aliases for debian based systems over a while and here is the list. please feel free to suggest or improvise as I have modified some to the extend of my knowledge

alias config="$(which git) -C $HOME --git-dir=$HOME/.dots/ --work-tree=$HOME"

# ------------------------------------------------------------------
# Common
# ------------------------------------------------------------------
alias python="$(which python3)"
alias pip=pip3

# Place above other sudo commands to enable aliases to be sudo-ed.
alias sudo="sudo "

# if [ $UID -ne 0 ]; then
# ## Effective UID is the user you changed to, UID is the original user.
# # echo "UID is $UID and EUID is $EUID"
# fi

# ------------------------------------------------------------------
# Navigation
# ------------------------------------------------------------------
alias cd..="cd .."
alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
alias .....="cd ../../../.."
alias ~="cd $HOME" # `cd` is probably faster to type though
alias -- -="cd -"

# ------------------------------------------------------------------
# Copy / Get / Remove
# ------------------------------------------------------------------
# mv, cp confirmation
alias mkdir="mkdir -pv"
alias cp="cp -iv"
alias ln='ln -i'
alias mv="mv -iv"

if hash rsync 2>/dev/null; then
# alias cpv="rsync -ah --info=progress2"
alias cpv="rsync -ah --info=progress2 --no-inc-recursive --stats" # progress bar
alias rcopy="rsync -av --progress -h"
alias rmove="rsync -av --progress -h --remove-source-files"
alias rupdate="rsync -avu --progress -h"
alias rsynchronize="rsync -avu --delete --progress -h"
fi

# ------------------------------------------------------------------
# Safetynets/Permission/Ownership
# ------------------------------------------------------------------

# do not delete / or prompt if deleting more than 3 files at a time #
alias rm='rm -vI --preserve-root' # 'rm -i' prompts for every file

# Safetynets [Parenting changing perms on / #]
alias chown='chown -v --preserve-root'
alias chmod='chmod -v --preserve-root'
alias chgrp='chgrp --preserve-root'
alias chmox="chmod +x --preserve-root"

if [ $UID -ne 0 ]; then
# Add sudo if forgotten. i.e.
# require sudo if user is not root
alias reboot='sudo reboot'
alias update='sudo apt-get upgrade'
alias susp='sudo /usr/sbin/pm-suspend'
alias dpkg='sudo dpkg'
fi

# ------------------------------------------------------------------
# File managements
# ------------------------------------------------------------------
alias df='df -h'
alias du='du -hs'
alias fs="stat -f \"%z bytes\"" # File size

## Alisase: new
# List all files colorized in long format
alias l="ls -lF ${colorflag}"
# List all files colorized in long format, excluding . and ..
alias la="ls -lAF ${colorflag}"
# List only directories
alias lsd="ls -lF ${colorflag} | grep '^d' --color=never"

alias ls="ls --classify --tabsize=0 --group-directories-first --literal --show-control-chars ${colorflag} --human-readable"
alias lh="ls -d .*" # show hidden files/directories only
# tree should be in most distributions (maybe as an optional install)
# alias tree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'"
alias lsblkid="lsblk -o name,label,fstype,size,uuid --noheadings" #: A more denoscriptive, yet concise lsblk.
alias blkid_="blkid -o list"

alias new="/usr/bin/ls -lth | head -15" # a quick glance at the newest files.
alias big="command du -a -BM | sort -n -r | head -n 10" # Find 10 largest files in pwd.

# ------------------------------------------------------------------
# Nginx
#
------------------------------------------------------------------
if hash nginx 2>/dev/null; then
function ngensite { sudo ln -s "/etc/nginx/sites-available/$1" /etc/nginx/sites-enabled; }
function ngdissite { sudo rm "/etc/nginx/sites-enabled/$1"; }
alias nginx='sudo nginx'

alias ngdir='cd /etc/nginx/'
alias nglog-access='tail -f /var/log/nginx/access.log'
alias nglog-error='tail -f /var/log/nginx/error.log'
alias ngsites='ls /etc/nginx/sites-available'
alias ngsitesen='ls /etc/nginx/sites-enabled'
alias ngreload='sudo service nginx reload'
alias ngrestart='sudo service nginx restart'
alias ngstart='sudo service nginx start'
alias ngstatus='sudo service nginx status'
alias ngstop='sudo service nginx stop'
alias ngtest='sudo nginx -t'
fi

# ------------------------------------------------------------------
# Networking and IP addresses
# ------------------------------------------------------------------
alias ping="ping -c 5"
alias ports='sudo netstat -vatnp'
alias ifconfig="ip -c a | sed -e 's/\// \//g'"
# Show active network interfaces
alias ifactive="ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'"
#alias ip="dig +short myip.opendns.com @resolver1.opendns.com"
alias localip="ipconfig getifaddr en1"
alias ips="ifconfig -a | grep -o 'inet6\? \(addr:\)\?\s\?\(\(\([0-9]\+\.\)\{3\}[0-9]\+\)\|[a-fA-F0-9:]\+\)' | awk '{ sub(/inet6? (addr:)? ?/, \"\"); print }'"

# Enhanced WHOIS lookups
alias whois="whois -h whois-servers.net"

# View HTTP traffic
alias sniff="sudo ngrep -d 'en1' -t '^(GET|POST) ' 'tcp and port 80'"
alias httpdump="sudo tcpdump -i en1 -n -s 0 -w - | grep -a -o -E \"Host\: .*|GET \/.*\""

alias ports='sudo lsof -nP 2>/dev/null | grep LISTEN | sed -re "s/ +/ /g" | cut -d " " -f 1,3,9 | sort -u | column -t'

# https://github.com/terminalforlife/BashConfig/
alias joke='command wget -U "curl/7.55.1" -o /dev/null -qO - https://icanhazdadjoke.com || printf "No jokes today"; echo'


# Always enable colored `grep` output
if [ -x /usr/bin/dircolors ]; then
test -r $HOME/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias grep="grep -sI --color=auto --exclude-dir=__pycache__"
alias grepi="grep -i --color=auto --exclude-dir=__pycache__"
alias fgrep="fgrep --color=auto --exclude-dir=__pycache__"
alias egrep="egrep --color=auto --exclude-dir=__pycache__"
fi


# One of @janmoesen’s ProTips
for method in GET HEAD POST PUT DELETE TRACE OPTIONS; do
alias "${method}"="lwp-request -m '${method}'"
done

# ------------------------------------------------------------------
# My Specific
# ------------------------------------------------------------------

# Mine Specific Shortcuts
alias dl="cd $HOME/Downloads"
alias dt="cd $HOME/Desktop"


if hash subl 2>/dev/null; then
if [ $UID -ne 0 ]; then
# If Sublime Text installed - use it istead of gedit
# only for non-root to prevent side effects
alias gedit=subl
fi
fi

if hash nnn 2>/dev/null; then
alias nnn="nnn -Rd"
fi

if [ -f ${HOME}/.local/bin/bat ]; then
alias aliases="bat $HOME/.bash_aliases" # for quick reference
if [ $UID -ne 0 ]; then
# apply bat style inline incase .config/bat/conf is not available
alias cat="bat -pp --paging=never --style='plain' --theme=TwoDark --color=always --decorations=always"
fi
fi

if hash wget 2>/dev/null; then
#alias wget="curl -O"
alias wget="wget -c - --hsts-file='$XDG_CACHE_HOME/wget-hsts'" # resume if failed by default
fi

# ------------------------------------------------------------------
# Misc
# ------------------------------------------------------------------

# Add an "alert" alias for long running commands.
# Usage example:
$ sleep 5; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Much nicer output for the apt-get command.
alias apt-get="apt-get -q -o Dpkg::Progress=true -o Dpkg::Progress-Fancy=true -o APT::Get::AutomaticRemove=true"
# Show which commands you use the most
alias freq='cut -f1 -d" " $HOME/.bash_history | sort | uniq -c | sort -nr | head -n 30'
alias fuck="killall -9"
# alias g="git"
alias h="history"
alias incognito='export HISTFILE=/dev/null'
# Potentially useful option for viewing the kernel log.
alias klog="dmesg -t -L=never -l emerg,alert,crit,err,warn --human --nopager"
alias vi="vim"
alias where=which # sometimes i forget

alias shh="pkill mpv; pkill mpv"
# Play online drum and bass radio station.
alias dnb="shh; mpv --really-quiet https://dnbradio.com/hi.pls &"

# make easier editing
alias vimrc="$EDITOR $HOME/.vimrc"
alias bashrc="$EDITOR $HOME/.bashrc"
alias alia="$EDITOR $HOME/.bash_aliases"
alias func="$EDITOR $HOME/.bash_functions"

# Print each PATH entry on a separate line
alias path="echo -e ${PATH//:/\\n}"

# Control Sequences / Reload the shell
alias cls='printf "\ec"'
alias reload="exec $SHELL -l" # invoke as a login shell
alias c="clear;exec bash"
# Shell exit alias
alias q="exit"
alias :q="exit"

initially borrowed from [these dots](https://github.com/mathiasbynens/dotfiles/) and then tailored to my needs.

https://redd.it/13h7fo8
@r_bash
Can't get temperature conversion noscript to pass floating point to the rest of the noscript

So, I've been working on expanding a temperature conversion noscript I found in a BASH book, and I got it to convert one scale to 7 others, including 3 pretty much useless, but historical scales (Rømer, Delisle and Réaumur), and the noscript will output the converted temperatures to two decimal places, but it won't accept input such as '98.6'. Unless the value of $1 is a whole number, it doesn't get passed to the rest of the noscript. It makes up to the point that it's time to convert, but when the scale equivalents are echoed, every single one, including the scale being converted from, prints as empty, with no value.

https://redd.it/13h9wnf
@r_bash
bash-boost 1.14: now with directory bookmarks

https://asciinema.org/a/584985

https://github.com/tomocafe/bash-boost

I added a new bookmark package to the bash-boost interactive module to quickly move around to directories. I use bind to map these functions to keyboard shortcuts: Ctrl+B to create and/or go to a bookmark and Ctrl+X Ctrl+B to delete bookmarks. There's also functions to load bookmarks from a file (probably most useful in .bashrc) and show/get bookmarks.

bash-boost has lots of other useful functions, if you haven't seen it, please check it out!

https://redd.it/13i7h2e
@r_bash
Alternatives to eval that don't create a subshell

Basically I want to run a noscript that respects the aliases of the environment in which it's executed. I could make a noscript to convert all the aliases into functions in the same noscript and most should work but I bet there's a more elegant solution. For those curious this is the part of the code that I'm trying to use:


eval "$(echo -e "...commands" | dmenu_instant -l 5 -p "These are the commands: " -fn "monospace:size=9" )"

https://redd.it/13ia9qj
@r_bash
Loco.sh: program your env

Loco.sh helps you program UNIX configurations, known as profiles.

Maintaining noscripts and dotfiles over many systems, manually bootstrapping VMs, new laptops, complex DSLs impossible to forget at night, this is over.

https://github.com/t0pd4wn/loco.sh

https://i.redd.it/r13b8cgt980b1.gif

https://redd.it/13jbp91
@r_bash
How to display the stdout data from background subfunctions, when calling bash noscripts using "sudo -u"?

I have a bash noscript that has an internal function, which in turn is started as a background process. The main noscript basically sets up the subfunction, starts it, and then exists (I need to do this since this noscript is supposed to be able to be used as a systemd oneshot service).

When I run the noscript, I see the stdout output from both the main noscript and the subfunction, no problem.

When I start the noscript using "sudo -u anotheruser mynoscript.sh", I only see the stdout output from the main noscript, but nothing from the subfunction (which is perhaps not surprising since the sudo command terminates just about then).

&#x200B;

One possible workaround I can think of is to redirect stdout to a file under /tmp, and read it as the original user with "tail -f" or similar, but is there a better way to see all outputs, even after the sudo command has terminated? I.e., some way to direct stdout from "anotheruser" to the normal user session?

https://redd.it/13k21n3
@r_bash