r_bash – Telegram
Newbie in bash noscript

How to send a picture with notification with a button working I tried notify-send but can't make a button using that.

https://redd.it/ziewvs
@r_bash
How to send a picture with notification with a button working I tried notify-send but can't make a button using that.



https://redd.it/zig8a8
@r_bash
Shell toolkit alternative without overlapping functionality

Is there similar to sed, awk, grep, cut and other similar tools without overlapping functionality? I need some set of atomic commands each doing one task, not several, just one. I prefer readability over short syntax also. It means that I prefer awk instead of sed. When I use cat, grep I feel that it's pointless in some way as they do what awk can. By all means, it's faster to use grep or cat to search smth or print file contents respectively. But it leads to the problem where you memorize more commands and know less about each of them, you spread all your energy on several commands instead of learning few deeply.

https://redd.it/zik3el
@r_bash
Why use the test command?

Over the last few days I've seen comments suggesting that the OP use test. I see some examples like:

if test -f "$1"; then

But what advantages does that have over using:

if [ -f $1 ]; then

When would you need "if test" instead of "if"?

https://redd.it/zimjju
@r_bash
How to make yq to produce nothing for missing keys instead of null?

I wanna load my yaml based config in my bash noscript via yq like this:

corefunctionloadmessagecolordefaults() {
INFO
COLOR="${INFOCOLOR:-green}"
WARN
COLOR="${WARNCOLOR:-yellow}"
ERROR
COLOR="${ERRORCOLOR:-red}"
}

declare config
name="$HOME/bash-settings.yml"

if ! which yq > /dev/null; then
warn "no 'yq' command found to load info, warn, error colors; defaults have been loaded"
corefunctionloadmessagecolordefaults
elif [[ ! -e "$config
name" ]]; then
warn "no '$configname' file found to load info, warn, error colors; defaults have been loaded"
core
functionloadmessagecolordefaults
else
INFOCOLOR="$(yq ".messages.info.foreground" "$configname")"
WARNCOLOR="$(yq ".messages.warn.foreground" "$configname")"
ERRORCOLOR="$(yq ".messages.error.foreground" "$configname")"
corefunctionloadmessagecolordefaults # Some value can be missing in config in which case default value must be used.
fi

unset config
name


But the problem is when I yq encounters missing keys in $config_file it prints null. By all means I can change my code to check whether variable's value is "null" string and then set it to default if it's true but I don't like this decision and unsure whether there is smth better.

https://redd.it/ziymto
@r_bash
Xargs does not accept input piped from cut

Hi there, I'm trying to understand why xargs does not echo some input, when piped from the cut command.


I have this bash noscript:
\#!/bin/bash

inotifywait -qme create,moved_to /path/to/directory | xargs -I{} echo '{}'


\# end noscript

When I run this noscript, and copy (or move) a file to the said directory, I get ouptput like this: "/path/to/directory CREATE filename" (as expected)

​

​

​

However, when I edit this so cut removes the two first words (to leave only the filename), it seems xargs does not recognize the piped input.
This:

inotifywait -qme create,moved_to /path/to/directory | cut -d' ' -f3- | xargs -I{} echo '{}'

outputs nothing when a file is copied or moved into said directory - my expectation is that it would echo the filename.

Why is this?


​

​

I realize I could easily remove xargs from this command entirely, and it would output the filename. The final goal however is to remove the file from the folder in question, e.g inotifywait -qme create,moved_to /path/to/directory | cut -d' ' -f3- | xargs -I{} rm /path/to/directory{}.


Thusly, I'll need to understand how to pipe the filename from cut to xargs.


​

​

I have the same issue with other commands, for example, I tried

awk '{for(i=6;i<=NF;i++){printf $i" "}print ""}'

instead of cut - this also failed to get xargs to echo anything. instead of cut, i'd be fine with using sed, grep, awk, etc to remove the first two words from the output of inotifywait - as long as it can be successfully piped into xargs

https://redd.it/zj1kfi
@r_bash
Bash Scripting vs Shell Scripting

If I learn Bash noscripting, is it pretty straight forward to learn how to write shell noscripts? How difficult is it to convert those bash noscripts to other *unix like shells (zsh, awk, fish)? What are some of the major differences to be aware of?

https://redd.it/zjf220
@r_bash
Help me understand the unclear language of the "locate" man, please

The command in question is "locate" in bash 3.2 on macOS. The fragments I have an issue with are the following:

> Shell globbing and quoting characters ('', ``?'', ``\'', ``['' and ``]'') may be used in pattern, although they will have to be escaped from the shell. Preceding any character with a backslash (``\'') eliminates any special meaning which it may have. The matching differs in that no characters must be matched explicitly, including slashes (``/'').

1. Since I haven't read man pages for a long time I forgot the symbolic meaning of the notation used. Why does the man page put double single quotes around these special characters? Are those the actual
, ? ... or *'. ?' ...?
2. Does the part saying that "they will have to be escaped from the shell" imply the double single quotes or the backlash character it brings in the next sentence?
3. "The matching differs in that no characters must be matched explicitly…": differs from what? "no chars must be matched explicitly" by whom or by what or in what context? Why "must" and not "have to"? What does "matched explicitly" mean? I can't have literal matches?

Another foggy excerpt is this:

> The 8-bit character support does not waste extra space for plain ASCII file names.

How is it "doesn't waste" and what would be it like if it did?

https://redd.it/zjk0un
@r_bash
Having fun with bind shells and named pipes!

#!//usr/bin/bash

#BIND SHELL WITH NAMED PIPES
#CREATED BY: Zerodark875

fail() { ecode=${1};shift; 2>&1 echo "${*}";exit ${ecode};}
usage() { echo -e "Create bind shells using netcat and named pipes.\n\nUsage: $(basename ${0}) [port]\n\t[port]\t\tTCP Port number to listen on\n\t-h, --help\tThis Help Menu";fail 1;}
cleanup() { if [[ -e ${1} ]]; then echo "Cleaning up. Deleting ${1}"; rm -f ${1};fi;}

if [[ -z ${1} ]] || [[ ${1,,} == "-h" ]] || [[ ${1,,} == "--help" ]]; then
usage
fi

NP="/tmp/net_shell"
PORT=${1}

echo -n "Are you sure you want to start a bind shell on port ${PORT} (N/y):"
read choice
if [[ ${choice,,} == "n" ]]; then
fail 0 "Done."
fi

cleanup ${NP}

mkfifo ${NP} #make out named pipe!

echo "Starting bind shell on port ${PORT}"
cat ${NP} | $(which bash) -i 2>&1 | nc -nlp ${PORT} > ${NP}

cleanup ${NP}
echo "Done."

https://redd.it/zjql2p
@r_bash
Add Header to csv file if no header is present

Hello!

What would be the best approach for trying to add header to a csv file, only if that file doesn’t contain the header?

What I was thinking was to get the first row, check wether it is the header, and if not add the header, but I am curious if there are other approaches.

Thanks in advance!

https://redd.it/zjqzj5
@r_bash
How to proper escape characters to to output string with color codes (non interpreted yet)?

Hi! I have the following code:

awk "{ print gensub(/\"(^ +)\"/, \"\\$(rawforeground magenta)\\\\1\\$(rawforeground none)\", \"g\") }" <<< ' "some" '

raw_foreground returns smth like \e[{{some-number}}m:

rawforeground() {
[[ -n "$2" ]] && {
core
functionfailurewithinvalidargumenterror
return $FAILURE
WITHINVALIDARGUMENT
}

declare colorname="$1"
declare -A color
nameassociations=(
[none]=0
[black]=30
[red]=31
[green]=32
[yellow]=33
[blue]=34
[magenta]=35
[cyan]=36
[light-gray]=37
[gray]=90
[light-red]=91
[light-green]=92
[light-yellow]=93
[light-blue]=94
[light-magenta]=95
[light-cyan]=96
[white]=97
)

[[ ! -v color
nameassociations[$colorname] ]] && {
corefunctionfailurewithinvalidargumentoutofrangeerror "${!colornameassociations[@]}"
return $FAILURE
WITHINVALIDARGUMENTOUTOFRANGE
}
echo -n "\e[${color
nameassociations[$colorname]}m"
}

I wanna replace "some" with "\e[45msome\e[0m" but I don't understand what I am missing now in the context of escaping characters.

https://redd.it/zjxctf
@r_bash
Testing if array elements are inside a string, not working when using *

Hi there

I'm stuck, tried a bunch of stuff & just can't work it out, would really appreciate some help!

I have an array, containing key words/phrases that can be contained in denoscription fields, if the denoscription field I'm handling contains one of these then I want to react in a certain way.

An example of my problem. I'm maybe misunderstanding how the [*\] bit works on arrays, don't know, but I'm expecting this to give the same results - as you can see, it doesn't! It looks like it should be so simple, & I really don't want to have to cycle through each element of the array 1 by 1:

# ignore_denoscription=("CHECK_NRPE" "Return code of 255" "Service check timed out after" "Plugin timed out" "(No output on stdout) stder" "(No output on stdout) stder")

# denoscription="This is an example containing CHECK_NRPE just to test"

# if [[ ${denoscription} =~ ${ignore_denoscription[0]} ]] ; then echo "it's there"; fi

it's there

# if [[ ${denoscription} =~ ${ignore_denoscription[*]} ]] ; then echo "it's there"; fi

#

Really appreciate any help!

https://redd.it/zk5yzk
@r_bash
Optimal par2 Switches for Mixed Data

I have compressed many files using bash find-exec tar.xz. I'd like to protect it for storage with ECCs. Data is mixed -- images, text, docs, html & associated folder .. & assorted media and zip files. I plan to create directories -- say, 1 to 10mb -- & compress. Then put each file in its own directory along with its ECCs.
find . -type f -name "*.tar.xz" -exec par2 create -s 1k -n 3 -r 10 "{}" ;
That's my noscript so far, guessing at appropriate block size, number of ECC files, & percent redundancy. I can't find good examples on how to set parameters with variant data. Suggestions much appreciated !!

https://redd.it/zk9zwe
@r_bash
Help troubleshooting unexpected results from arrays in for loop.

I have a noscript that is triggered every hour by cron which runs through an array of functions and then outputs the code of the functions run, and the results to email. This is run on multiple hosts in multiple environments. My issue is that **randomly** when creating the results email, it changes the function(test\_str). So for instance, when I expect to see "CONDA\_FOLDER variable found \*\[ ! -z ${CONDA\_FOLDER} \]; return $?\*true", I will see something like "CONDA\_FOLDER variable found \*\[ ! -z ${ENV\_AUX} \]; return $?;\*true", or even "CONDA\_FOLDER variable found\*a() {\[ ! -z ${ENV} \]}\*true". What's really throwing my off is that it only happens sometimes. I think it has to do with variable expansion(s). But, I am apparently stuck spinning my wheels, so any help is really appreciated.

\#host\_diagnostic.sh

#!/bin/bash

run_folder=${HOME}/host_diagnostic

# Import array of functions
. ${run_folder}/tests.sh

echo "---------------------------------"
echo " Start Testing "
echo "---------------------------------"
for i in "${!funcs[@]}"
do
echo ${descs[$i]}
${funcs[$i]}
results+=($?)
done

echo "---------------------------------"
echo " Output Test Results "
echo "---------------------------------"
for i in "${!funcs[@]}"
do
test_name=${descs[$i]}
if [ ${results[$i]} != 0 ]
then
bool="false"
else
bool="true"
fi
#Get rid of the first and last two lines of the function, its extraneous data
declare -f "${funcs[$i]}" > func
num_lines=$(wc -l < func)
end="$((${num_lines}-2))"
beg="$((${end}-2))"
test_str="$(head -n ${end} func | tail -n ${beg} | xargs)"
echo -e "${test_name}*${test_str}*${bool}\n" >> "${out_file_name}"
echo -e "${test_name}*${test_str}*${bool}\n"
rm func
done
cat "${out_file_name}" | mail -s "${HOST} Capability Report" ${email}
rm "${out_file_name}"

echo "---------------------------------"
echo " Finished "
echo "---------------------------------"

tests.sh

funcs=()
descs=()
#Variables
db="app_db"
srv="server1"
timeout=2
user=$(${WHOAMI})
email="nunya@bidness.com"
out_file_name=${run_folder}/${HOST}.out
> ${out_file_name}
results=()

if [ -z "${ENV_AUX}" ]
then
env="${ENV}"
else
env="${ENV}-${ENV_AUX}"
fi

if [ "${env}" == "int" ]
then
sr_api_url="https://api.int.com"
else
sr_api_url="https://api-${env}.com"
fi

ip=$(ifconfig | grep -m 1 "inet" | awk '{print $2}')

####################################################################################
# Tests
####################################################################################
descs+=("ENV variable found")
funcs+=("a")
a()
{
[ ! -z ${ENV} ]
return $?
}

descs+=("ENV_AUX variable found")
funcs+=("b")
b()
{
[ ! -z ${ENV_AUX} ]
return $?
}

descs+=("COMMON_FOLDER variable found")
funcs+=("c")
c()
{
[ ! -z ${COMMON_FOLDER} ]
return $?
}

descs+=("Common folder found")
funcs+=("d")
d()
{
[ -d ${COMMON_FOLDER} ]
return $?
}

descs+=("CONDA_FOLDER variable found")
funcs+=("e")
e()
{
[ ! -z ${CONDA_FOLDER} ]
return $?
}

descs+=("Conda folder found")
funcs+=("f")
f()
{
[ -d ${CONDA_FOLDER} ]
return $?
}

descs+=("Kerberos initialized for user")
funcs+=("g")
g()
{
klist | grep -q "${user}"
return $?
}

descs+=("Crontab has correct entries")
funcs+=("h")
h()
{
while IFS= read -r line
do
if ! crontab -l | fgrep -q "${line}" > /dev/null 2>&1
then
return 1
fi
done < "${HOME}/app/${HOST}.com/crontabs.file"
return 0
}

descs+=("Crontab has correct host_diagnostic entries")
funcs+=("i")
i()
{
while IFS= read -r line
do
if ! crontab -l | fgrep -q "${line}" > /dev/null 2>&1
then
return 1
fi
done < "${HOME}/host_diagnostic/crontab_host_diagnostic.file"
return 0
}

descs+=("SQL server connectivity")
funcs+=("j")
j()
{
echo "SELECT @@SERVERNAME, @@VERSION GO" > temp_sql_func
sqlcmd -S "${srv}" -d "${db}" -i temp_sql_func -W -E | grep -q "(1 rows affected)"
result=$?
rm temp_sql_func
return ${result}
}

descs+=("App VIP connectivity")
funcs+=("k")
k()
{
curl --max-time ${timeout} "${sr_api_url}"
return $?
}

descs+=('ScriptRunner running at host address')
funcs+=("l")
l()
{
curl --max-time ${timeout} "${ip}" | grep -q "Network Error"
[ $? == 1 ]
return $?
}

https://redd.it/zkfufw
@r_bash
Automatically downloading links from RSS feed with Yotube-DL?

I need to do this but I don't know how. I can imagine this would be pretty easy to do with something like newsboat but I dont know the noscripting aspect. looking to do the same thing with gallery-dl as well but i can imagine if someone tells me how to do one i can figure out the other.

https://redd.it/zkho7x
@r_bash
If you can't write awesome long noscripts, write a bunch of little ones. If you can't remember them all, you might like this one.
http://ix.io/4ixO

https://redd.it/zlb7ao
@r_bash
noobish type having trouble creating an executable file from a bash noscript. most answers are people trying to make a file executable after its written. id like to know how to make one while its written.

I'm 100% I'm just being dumb and missing the obvious, as I often do, so any help would be greatly and humbly received. I know how to create a file with permissions, I understand perfectly chmod +x and all the numbers you can use e.g. 700, all permissions to me and no users or groups. I know that 111 101 100 would be rwx/r-x/r-- or 754 etc. but what I'm having trouble with is writing a bash noscript that creates another executable bash noscript. This would be super handy for making test blank noscripts without going through the rigmarole of changing the permissions every time, be it through terminal or properties. I'm sure there's a way, but everything I've tried has failed. ive tried-

chmod +x; touch /filepath/noscript.sh

touch /filepath/noscript.sh; chmod +x

touch /filepath/noscript.sh && chmod +x

touch /filepath/noscript.sh chmod +x

touch /filepath/noscript.sh | chmod +x

i can't think of another way to try.

&#x200B;

&#x200B;

(these are just the basic ideas I've tried with numbers too in all the other variations)

I'd also love someone to point out why these aren't working i know why the bottom two dont work

https://redd.it/zlfqr4
@r_bash