Could someone help on below for automation ideas from linux perspective?
https://www.reddit.com/r/sre/comments/1ct0wu9/automation_ideas_from_ops_perspective/?utm_source=share&utm_medium=mweb3x&utm_name=post_embed&utm_term=1&utm_content=1
https://redd.it/1ct0zld
@r_bash
https://www.reddit.com/r/sre/comments/1ct0wu9/automation_ideas_from_ops_perspective/?utm_source=share&utm_medium=mweb3x&utm_name=post_embed&utm_term=1&utm_content=1
https://redd.it/1ct0zld
@r_bash
Reddit
From the sre community on Reddit
Explore this post and more from the sre community
find , ALTERNATIVE? while looping recursively
.
These work like a charm and seems to be the de-facto standard when user needs to execute operations recursively while looping through files.
But... I'm asking if, over the years, some alternatives were developed in order to "unificate", instead of involving calling
Something like this, for example:
To me, I found some sort of "unification" in GNU Parallel by setting nr. of jobs to
https://redd.it/1ct7ocf
@r_bash
$ while IFS= read -r -d '' V; do SOMETHING "$V"; done < <(find . -type f -print0)
.
$ find . -type f -exec bash -c 'SOMETHING "$1"' _ {} \;
These work like a charm and seems to be the de-facto standard when user needs to execute operations recursively while looping through files.
But... I'm asking if, over the years, some alternatives were developed in order to "unificate", instead of involving calling
while, read, print0 flag of find and Process Substitution.Something like this, for example:
floop /path SOMETHING
To me, I found some sort of "unification" in GNU Parallel by setting nr. of jobs to
1https://redd.it/1ct7ocf
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
cron and $(date +"%Y%m%d-%H%M%S")
Hi,
I am trying to get this to work in crontab to produce directories named date +"%Y%m%d-%H%M%S" e.g dump-20240515-123413
This command works perfectly well on the command line in bash.
/usr/bin/mongodump -o /data/mongodbdump/dump-"$(date +"%Y%m%d-%H%M%S")"
but cron misinteprets the date as :
May 16 10:38:01 srv1 CROND[355784]: (root) CMDEND ([ -d /data/mongodbdump ] && /usr/bin/mongodump -o /data/mongodbdump/dump-"$(date +")
Also, I tried without the extra set of "
/usr/bin/mongodump -o /data/mongodbdump/dump-$(date +"%Y%m%d-%H%M%S")
How can I get this to work properly and create a file name with a format of dump-20240516-103412
Any help appreciated.
EK
https://redd.it/1ct8dpg
@r_bash
Hi,
I am trying to get this to work in crontab to produce directories named date +"%Y%m%d-%H%M%S" e.g dump-20240515-123413
This command works perfectly well on the command line in bash.
/usr/bin/mongodump -o /data/mongodbdump/dump-"$(date +"%Y%m%d-%H%M%S")"
but cron misinteprets the date as :
May 16 10:38:01 srv1 CROND[355784]: (root) CMDEND ([ -d /data/mongodbdump ] && /usr/bin/mongodump -o /data/mongodbdump/dump-"$(date +")
Also, I tried without the extra set of "
/usr/bin/mongodump -o /data/mongodbdump/dump-$(date +"%Y%m%d-%H%M%S")
How can I get this to work properly and create a file name with a format of dump-20240516-103412
Any help appreciated.
EK
https://redd.it/1ct8dpg
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
what is "option+d" in the context of bash keyboard shortcuts?
hello, i'm trying to learn all the bash keyboard shortcuts and i came across this
https://kapeli.com/cheat\_sheets/Bash\_Shortcuts.docset/Contents/Resources/Documents/index
and one of the keyboard shortcuts is "option+d"
what does this mean? what key is the "option" key?
thank you
https://redd.it/1ctc0mx
@r_bash
hello, i'm trying to learn all the bash keyboard shortcuts and i came across this
https://kapeli.com/cheat\_sheets/Bash\_Shortcuts.docset/Contents/Resources/Documents/index
and one of the keyboard shortcuts is "option+d"
what does this mean? what key is the "option" key?
thank you
https://redd.it/1ctc0mx
@r_bash
what is the "ctrl+xx" keyboard shortcut?
hello, i'm trying to learn bashes keyboard shortcuts and one of the keyboard shortcuts i found was "ctrl+xx" and it says
"Move between start of command line and current cursor position (and back again)"
i tried this one out on my terminal and it's just highlighting and moving the cursor around randomly, does anyone have any experience with this shortcut and can tell me how it works?
thank you
https://redd.it/1cu3dvz
@r_bash
hello, i'm trying to learn bashes keyboard shortcuts and one of the keyboard shortcuts i found was "ctrl+xx" and it says
"Move between start of command line and current cursor position (and back again)"
i tried this one out on my terminal and it's just highlighting and moving the cursor around randomly, does anyone have any experience with this shortcut and can tell me how it works?
thank you
https://redd.it/1cu3dvz
@r_bash
how to give a noscript sudo acesses.
I want to write some noscript for my waybar related to create_ap for using hotspot wifi, but issue is that create_ap need sudo
and i want that this noscript should run by waybar so there is no prompt for password. How can i give this noscript some sudo permission.
kindly help
https://redd.it/1cu7kxs
@r_bash
I want to write some noscript for my waybar related to create_ap for using hotspot wifi, but issue is that create_ap need sudo
and i want that this noscript should run by waybar so there is no prompt for password. How can i give this noscript some sudo permission.
kindly help
https://redd.it/1cu7kxs
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Chinese characters not handled correctly?
hi—hoping for some help with a noscript i wrote that is unable to handle some chinese characters!
i'm putting paths to files in a .txt file, then using that .txt file to build something like a contact sheet with montage. a lot of my path and filenames include chinese characters. some are okay, and sometimes i'll see this (running the noscript with set -x enabled):
满天樱?\\212??\\210\\206破_?\\233\\236?\\212?\\216?\\234??\\206/2023.6.26_?\\233\\236?\\212?\\216?\\234??\\206'
which should have been: 满天樱花爆破_回廊美术馆/2023.6.26_回廊美术馆
some parts of the noscript seem to handle this fine—ffmpeg is able to create thumbnails of all of the video files that include these characters in their path—but montage specifically doesn't seem to be able to handle it.
i assume either the output of the filenames to the .txt file, or montage itself?, is having trouble with the chinese characters. (as far as i understand it, montage won't read from an array but will read from a text file.)
my locale is set to en_US.UTF-8.
any suggestions on how to fix would be greatly appreciated!
https://redd.it/1cu9uzm
@r_bash
hi—hoping for some help with a noscript i wrote that is unable to handle some chinese characters!
i'm putting paths to files in a .txt file, then using that .txt file to build something like a contact sheet with montage. a lot of my path and filenames include chinese characters. some are okay, and sometimes i'll see this (running the noscript with set -x enabled):
满天樱?\\212??\\210\\206破_?\\233\\236?\\212?\\216?\\234??\\206/2023.6.26_?\\233\\236?\\212?\\216?\\234??\\206'
which should have been: 满天樱花爆破_回廊美术馆/2023.6.26_回廊美术馆
some parts of the noscript seem to handle this fine—ffmpeg is able to create thumbnails of all of the video files that include these characters in their path—but montage specifically doesn't seem to be able to handle it.
i assume either the output of the filenames to the .txt file, or montage itself?, is having trouble with the chinese characters. (as far as i understand it, montage won't read from an array but will read from a text file.)
my locale is set to en_US.UTF-8.
any suggestions on how to fix would be greatly appreciated!
https://redd.it/1cu9uzm
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Script to get Top languages used on GitHub
I’m having trouble getting Top 3 languages used on my GitHub. Has anyone done something like this or willing to share resources I have the api working and retrieving my repos. Just need help on how to calculate the top 3 languages with their corresponding percentage.
https://redd.it/1cur46i
@r_bash
I’m having trouble getting Top 3 languages used on my GitHub. Has anyone done something like this or willing to share resources I have the api working and retrieving my repos. Just need help on how to calculate the top 3 languages with their corresponding percentage.
https://redd.it/1cur46i
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Deleting composed file
Hi everyone. Earlier I downloaded apache superset via git bash. But now I don't need it. Issue is i can't delete it. Because I don't know where it's located. If it's happened to anyone or there's someone know where to find please help about that.
https://redd.it/1cuzckb
@r_bash
Hi everyone. Earlier I downloaded apache superset via git bash. But now I don't need it. Issue is i can't delete it. Because I don't know where it's located. If it's happened to anyone or there's someone know where to find please help about that.
https://redd.it/1cuzckb
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Question about bash
Hi, I would like to know if this template I just made myself is a good base to start a noscript, the truth is that it is the first time I am going to use getopt to parse arguments instead of getopts and I don't know if I am handling all exceptions correctly, and if the functionality there is implemented is useful or overkill
If you find any bug or improvement that you think of or that you yourself usually implement in your noscripts, could you tell me? I just want to improve and learn as much as I can to be the best I can be.
Any syntactic error or mistake that you see that could be improved or utility that could be used instead of any of the implemented ones such as using (( )) instead of \[\[ \]\] let me know.
Thanks in advance 😊
#!/usr/bin/env bash
[[ -n "${COLDEBUG}" && ! "${-}" =~ .*x.* ]] && { \
:(){
local YELLOW=$(tput setaf 3)
[[ -z "${1}" || ! "${1}" =~ ::.* ]] && return 1
echo -e "\n${YELLOW}${*}${RESET}\n" >&2
}
}
cleanup(){
unset :
}
ctrl_c(){
echo -e "\n${RED}[!] SIGINT Sent to ${0##*/}. Exiting...${RESET}\n" >&2 ; exit 0
}
banner(){
cat << BANNER
${PURPLE}
██████╗ ██████╗ ███████╗██████╗ █████╗ ██████╗ ███████╗
██╔══██╗██╔══██╗██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔════╝
██████╔╝██████╔╝█████╗ ██████╔╝███████║██████╔╝█████╗
██╔═══╝ ██╔══██╗██╔══╝ ██╔═══╝ ██╔══██║██╔══██╗██╔══╝
██║ ██║ ██║███████╗██║ ██║ ██║██║ ██║███████╗
╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ${RESET}
BANNER
}
help(){
cat << HELP
${PURPLE}
DESCRIPTION: --
SYNTAX: ${0##*/} [-h|...] [--help|...]
USAGE: ${0##*/} {-h}{-...} {--help}{--...}${RESET}
${PINK}OPTIONS:
- ... ->
-h -> Displays this help and Exit ${RESET}
HELP
}
requiredArgs(){
local i error
for i in "${!required[@]}"; do
[[ -n "${required[$i]}" ]] && continue
echo -e "\n${RED}[!] Required argument not specified on ${i}${RESET}\n" >&2
error="1"
done
[[ -n "${error}" ]] && help ; return 1
return 0
}
main(){
declare -A required
local opts
required="(
)"
opts="$(getopt \
--options h,a \
--long help,all \
--name "${0##*/}" \
-- "${@} " \
2> /dev/null \
)"
eval set -- "${@}"
while :; do
case "${1}" in
-h | --help ) help ; return 0 ;;
-a | --all ) echo -e "\n${PINK}[+] a | --all Option enabled${RESET}\n" ;;
-* ) echo -e "\n${PINK}[!] Unknown Option -> ${1} . Try -h | --help to display Help${RESET}\n" ; return 1 ;;
-- ) shift ; break ;;
* ) break ;;
esac
shift
done
requiredArgs || return 1
}
RESET=$(tput sgr0)
RED=$(tput setaf 1)
PURPLE=$(tput setaf 200)
PINK=$(tput setaf 219)
trap ctrl_c SIGINT
trap cleanup EXIT
banner
main "${@}"
https://redd.it/1cv2l7y
@r_bash
Hi, I would like to know if this template I just made myself is a good base to start a noscript, the truth is that it is the first time I am going to use getopt to parse arguments instead of getopts and I don't know if I am handling all exceptions correctly, and if the functionality there is implemented is useful or overkill
If you find any bug or improvement that you think of or that you yourself usually implement in your noscripts, could you tell me? I just want to improve and learn as much as I can to be the best I can be.
Any syntactic error or mistake that you see that could be improved or utility that could be used instead of any of the implemented ones such as using (( )) instead of \[\[ \]\] let me know.
Thanks in advance 😊
#!/usr/bin/env bash
[[ -n "${COLDEBUG}" && ! "${-}" =~ .*x.* ]] && { \
:(){
local YELLOW=$(tput setaf 3)
[[ -z "${1}" || ! "${1}" =~ ::.* ]] && return 1
echo -e "\n${YELLOW}${*}${RESET}\n" >&2
}
}
cleanup(){
unset :
}
ctrl_c(){
echo -e "\n${RED}[!] SIGINT Sent to ${0##*/}. Exiting...${RESET}\n" >&2 ; exit 0
}
banner(){
cat << BANNER
${PURPLE}
██████╗ ██████╗ ███████╗██████╗ █████╗ ██████╗ ███████╗
██╔══██╗██╔══██╗██╔════╝██╔══██╗██╔══██╗██╔══██╗██╔════╝
██████╔╝██████╔╝█████╗ ██████╔╝███████║██████╔╝█████╗
██╔═══╝ ██╔══██╗██╔══╝ ██╔═══╝ ██╔══██║██╔══██╗██╔══╝
██║ ██║ ██║███████╗██║ ██║ ██║██║ ██║███████╗
╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝ ${RESET}
BANNER
}
help(){
cat << HELP
${PURPLE}
DESCRIPTION: --
SYNTAX: ${0##*/} [-h|...] [--help|...]
USAGE: ${0##*/} {-h}{-...} {--help}{--...}${RESET}
${PINK}OPTIONS:
- ... ->
-h -> Displays this help and Exit ${RESET}
HELP
}
requiredArgs(){
local i error
for i in "${!required[@]}"; do
[[ -n "${required[$i]}" ]] && continue
echo -e "\n${RED}[!] Required argument not specified on ${i}${RESET}\n" >&2
error="1"
done
[[ -n "${error}" ]] && help ; return 1
return 0
}
main(){
declare -A required
local opts
required="(
)"
opts="$(getopt \
--options h,a \
--long help,all \
--name "${0##*/}" \
-- "${@} " \
2> /dev/null \
)"
eval set -- "${@}"
while :; do
case "${1}" in
-h | --help ) help ; return 0 ;;
-a | --all ) echo -e "\n${PINK}[+] a | --all Option enabled${RESET}\n" ;;
-* ) echo -e "\n${PINK}[!] Unknown Option -> ${1} . Try -h | --help to display Help${RESET}\n" ; return 1 ;;
-- ) shift ; break ;;
* ) break ;;
esac
shift
done
requiredArgs || return 1
}
RESET=$(tput sgr0)
RED=$(tput setaf 1)
PURPLE=$(tput setaf 200)
PINK=$(tput setaf 219)
trap ctrl_c SIGINT
trap cleanup EXIT
banner
main "${@}"
https://redd.it/1cv2l7y
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Performance repport generator noscript in bash
I'd like to know if someone can help me writing a noscript that collect data (memory, cpu, network) then put them in table which will contain the data chosen by the user, and an ascii graph related to the data chosen by the user.
I'm a student and I'm facing a lot of difficulties, I'd like it if someone could help me write this noscript.
(I have the document where everything is written but it's in french in someone may need it)
Many thanks
https://redd.it/1cv7qsr
@r_bash
I'd like to know if someone can help me writing a noscript that collect data (memory, cpu, network) then put them in table which will contain the data chosen by the user, and an ascii graph related to the data chosen by the user.
I'm a student and I'm facing a lot of difficulties, I'd like it if someone could help me write this noscript.
(I have the document where everything is written but it's in french in someone may need it)
Many thanks
https://redd.it/1cv7qsr
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Chaining multiple grep commands to take in same input
How to chain two grep commands so that if the first grep fails, second grep attempts to find a match. To illustrate my problem, consider the following:
Ultimately I want to do a double grep on a piped stdin like so
I used echo just as an example. What I'm actually piping around is a multi-line output.
https://redd.it/1cvc1o4
@r_bash
How to chain two grep commands so that if the first grep fails, second grep attempts to find a match. To illustrate my problem, consider the following:
echo "360" | { grep 360 || echo "not found"; } Prints out the expected result "360"echo "360" | { grep 240 || echo "not found"; } Prints out the expected result "not found"echo "360" | { grep 360 || grep 240; } Prints out the expected result "360"echo "360" | { grep 240 || grep 360; } Prints an empty line instead of doing another grep and printing out "360"Ultimately I want to do a double grep on a piped stdin like so
echo "hurrdurr" | { grep 360 || grep 240 || echo "not found"; } But the two grep commands not ORing correctly is messing my commandI used echo just as an example. What I'm actually piping around is a multi-line output.
mycommand | { grep needle1 || grep needle2 || grep needle3 || echo "not found"; }https://redd.it/1cvc1o4
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
using qpdf: could I delete last (inblank) page?
Hi, I'd like to delete last sheet, last page of a pdf, Is there a command for it in qpdf?
Thank you?
https://redd.it/1cvxnx0
@r_bash
Hi, I'd like to delete last sheet, last page of a pdf, Is there a command for it in qpdf?
Thank you?
https://redd.it/1cvxnx0
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Could someone explain the logic behind a find command which renames files for me?
I have the following command which I use from time to time (via Google):
find /the/path -depth -name "*.abc" -exec sh -c 'mv "$1" "${1%.abc}.edefg"' _ {} \;
I know that it works, and I know that I need the underscore and the curly brackets at the end before the escaped ;. Without them, the command ends up only giving the extension.
*Why* are the underscore and the curly brackets needed? What exactly do they do in this context? The `bash -c` command takes the `{}` as the argument to give you `$1`, but where does the underscore fit in?
If you have a link to where this is explained, it would be great.
https://redd.it/1cw9iuo
@r_bash
I have the following command which I use from time to time (via Google):
find /the/path -depth -name "*.abc" -exec sh -c 'mv "$1" "${1%.abc}.edefg"' _ {} \;
I know that it works, and I know that I need the underscore and the curly brackets at the end before the escaped ;. Without them, the command ends up only giving the extension.
*Why* are the underscore and the curly brackets needed? What exactly do they do in this context? The `bash -c` command takes the `{}` as the argument to give you `$1`, but where does the underscore fit in?
If you have a link to where this is explained, it would be great.
https://redd.it/1cw9iuo
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Complete noob having issue with strange url in terminal
Hi my dudes,
I try to avoid the terminal as much as I can, but sometimes you're just forced to build or run some command line application. E.g., I would like to run the following command to convert an iso to chd:
This does, in fact, work as intended. However, when I look at the terminal output, I notice the following:
I honestly have no clue what this is supposed to signify. I suppose some odd custom ssl connection setting or something? Scantailor Advanced is a program I did install at some point, but how is it that anytime I use
Hope someone can advise on this, would be much appreciated!
https://redd.it/1cwg3vp
@r_bash
Hi my dudes,
I try to avoid the terminal as much as I can, but sometimes you're just forced to build or run some command line application. E.g., I would like to run the following command to convert an iso to chd:
#!/bin/bashfor file in *.iso; do chdman createcd -i "${file%.*}.iso" -o "${file%.*}.chd"; doneThis does, in fact, work as intended. However, when I look at the terminal output, I notice the following:
#/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/yb85/scantailor-advanced-osx/HEAD/install.sh)"I honestly have no clue what this is supposed to signify. I suppose some odd custom ssl connection setting or something? Scantailor Advanced is a program I did install at some point, but how is it that anytime I use
#!/bin/bash I am presented with this url of a program I am not even working with in that moment? It seems to me this is not how things should be setup. Thus, my question, how can I restore this for it to just work normally without this url being involved in anything?Hope someone can advise on this, would be much appreciated!
https://redd.it/1cwg3vp
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Can anybody help me to write this bash noscript?
I have found this command to compress PDF files and it works. But it is too long for me to memorize it.
I want to make a bash noscript like this:
So if it is a simple question, sorry. I've been using linux for about 5 months.
https://redd.it/1cx25bg
@r_bash
I have found this command to compress PDF files and it works. But it is too long for me to memorize it.
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed_PDF_file.pdf input_PDF_file.pdfI want to make a bash noscript like this:
compress input.pdf output.pdfSo if it is a simple question, sorry. I've been using linux for about 5 months.
https://redd.it/1cx25bg
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
Code review request for a recent noscript I made to simplify the progress of setup a SSH SOCKS service
Code: https://gitlab.com/brlin/ProxifierLinux/-/blob/main/enable-ssh-socks-service.sh
Refer the write up for the utilization of this noscript: How to force Steam access the internet via a proxy service in GNU/Linux? - HackMD
https://redd.it/1cx52rv
@r_bash
Code: https://gitlab.com/brlin/ProxifierLinux/-/blob/main/enable-ssh-socks-service.sh
Refer the write up for the utilization of this noscript: How to force Steam access the internet via a proxy service in GNU/Linux? - HackMD
https://redd.it/1cx52rv
@r_bash
GitLab
enable-ssh-socks-service.sh · main · 林博仁 Buo-ren, Lin / ProxifierLinux · GitLab
Proxifier alternative for linux using redsocks. Proxify all linux applications through SOCKS4/5, HTTP proxy
use variable in variable while looping
Hi,
In a larger noscript I need to loop through a list of predefined items. Underneath a simplified working part of the noscript:
#!/bin/bash
totalitems=4
# define integers
item[1]=40
item[2]=50
item[3]=45
item[4]=33
# start with first
counter=1
while [ "$counter" -le "$totalitems" ]
do
echo "${item$counter}"
let counter+=1
done
However I'm curious if the same is possible without using an array. Is it even possible to combine the variables 'item' and 'counter', e.g.:
#!/bin/bash
totalitems=4
# define integers
item1=40
item2=50
item3=45
item4=33
# start with first
counter=1
while [ "$counter" -le "$totalitems" ]
do
echo "$item$counter" <---
let counter+=1
done
https://redd.it/1cx6iqw
@r_bash
Hi,
In a larger noscript I need to loop through a list of predefined items. Underneath a simplified working part of the noscript:
#!/bin/bash
totalitems=4
# define integers
item[1]=40
item[2]=50
item[3]=45
item[4]=33
# start with first
counter=1
while [ "$counter" -le "$totalitems" ]
do
echo "${item$counter}"
let counter+=1
done
However I'm curious if the same is possible without using an array. Is it even possible to combine the variables 'item' and 'counter', e.g.:
#!/bin/bash
totalitems=4
# define integers
item1=40
item2=50
item3=45
item4=33
# start with first
counter=1
while [ "$counter" -le "$totalitems" ]
do
echo "$item$counter" <---
let counter+=1
done
https://redd.it/1cx6iqw
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community
why in the server where I upload dirs and files I can not do mkdir -p dir1 dir1/subdir1/ dir1/subdir2/ etc?
Hi. will there be bash in the server? the server mean place where I use sftp user@server.team
in local I can do mkdir flag -p ...
Thank you and regards!
https://redd.it/1cxdscs
@r_bash
Hi. will there be bash in the server? the server mean place where I use sftp user@server.team
in local I can do mkdir flag -p ...
Thank you and regards!
https://redd.it/1cxdscs
@r_bash
Reddit
From the bash community on Reddit
Explore this post and more from the bash community