r_bash – Telegram
ANSI coloring function for bash noscripts, absurdly minified

I've been dabbling with this ANSI coloring function for injecting color into bash noscripts. All feedback is welcome!

Essentially, it works like this: https://i.imgur.com/BXEPxva.png

It supports the entire standard 4-bit ANSI palette with all foreground/background combinations, as well as bold and underline. This is a full table of its formatting and color codes: https://i.imgur.com/EKi9KIm.png


(Kudos to /u/o11c for critiquing the first draft and starting me on the path to shaving 200 bytes off my earlier attempt, even if maybe he's an exalted greybeard raised on monochrome monitors who wouldn't touch this function with a ten foot pole on his machines. I'm only guessing.)

-----

I often inherit noscripts from colleagues and folks on the web with coloring variables similar to these recent submissions:

-----

https://github.com/vaniacer/sshto/blob/master/sshto#L87



| Input | Output
---|---|----
This noscript | `printf "${BLD}${RED}${BBLU}"Hello!${DEF}"` | `\e[1m\e[31m\e[44mHello!\e[0m`
clr function | `printf "$(clr +rb)Hello!$(clr)"` | `\e[1;31;44mHello!\e[0m`

-----

https://github.com/Aj-Seven/Android-Sysinfo/blob/master/sysinfo.sh#L2

| Input | Output
---|---|----
This noscript | `echo "${yellow}${b_blue}foo` | `\e[0;93m\e[44mfoo`
clr function | `echo "$(clr Yb)foo"` | `\e[93;44mfoo`

-----

The function is highly minified, the secret sauce is using `colors="krgybmcw ="` with `i=${colors%%"${1,}"*}` and `${#i}` to find the offset of the color the character represents in the ANSI definitions.

| Black | Red | Green | Yellow | Blue | Magenta | Cyan | White | --- | Term Default
---|---|----|----|----|----|----|----|----|----|----|
My abbreviation | k | r | g | y | b | m | c | w | | =
ANSI fg | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | | 39
ANSI bg | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | | 49
ANSI bright fg | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | |
ANSI bright bg | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | |

I took liberal advantage of the fact that `bg=fg+10` and `bright=normal+60`.

I also wasted seven bytes on unnecessary capitulations toward `shellcheck`, but it passes now.

The ugly shortened variable names represent:

* in: input arguments
* b: basis for color numbering, 30 is the minimum, +60 for bright, +10 for background, +0 through +7 for hue
* bb: background bump, after setting a foreground color add 10 to the next color code to make it a background color instead of a foreground color
* c: single character read from `$in` on the while loop
* cs: control sequence, what goes between the `\e[` and the `m` in the ANSI formatting string

Note the function is defined as `clr() ( ... )` with parentheses instead of the standard `clr() { ... }` braces, this is to run it in a subshell so I can have a function (c2n, color to number) inside my function.

----

clr() (
local in="$*" colors="krgybmcw =" b bb c cs
[ "$in" ] || { printf "\e[0m"; return; }
c2n() { local i=${colors%%"${1,}"*}; printf "%d" "$((${#i}+b+bb))"; }
while c=${in::1}; [ "$c" ]; do in=${in:1}; b=30;
case $c in [A-Z]) ((b+=60));;&
[A-Za-z=]) cs+=";$(c2n "$c")"; (((bb+=10)>20)) && return 1 ;;
-) cs+=";22;24";; +) cs+=";1";; _) cs+=";4";; .) ((bb+=10));;
*) return 1;;
esac
done
printf "\e[%sm" "${cs#;}"
)

Did you know bash's `type` builtin will automatically reformat your functions with its standards for indentation and line breaks? Here's the same function as `type` outputs it for easier reading:

bash-5.1$ type clr
clr is a function
clr ()
{
( local in="$*" colors="krgybmcw =" b bb c cs;
[ "$in" ] || {
printf "\e[0m";
return
};
function c2n ()
{
local i=${colors%%"${1,}"*};
printf "%d" "$((${#i}+b+bb))"
};
while c=${in::1};
[ "$c" ]; do
in=${in:1};
b=30;
case $c in
[A-Z])
((b+=60))
;;&
[A-Za-z=])
cs+=";$(c2n "$c")";
(((bb+=10)>20)) && return 1
;;
-)
cs+=";22;24"
;;
+)
cs+=";1"
;;
_)
cs+=";4"
;;
.)
((bb+=10))
;;
*)
return 1
;;
esac;
done;
printf "\e[%sm" "${cs#;}" )
}

Again, all feedback is welcome! I'm not trying to encourage adoption of this thing, it's more of a puzzle of brevity and optimization. I learned a lot from /u/o11c the first time I showed it. (If you think you can use it, have at it.)

I especially don't like using `;22;24` to clear underline and bold formatting, but `\e[0m` clears the colors as well as the formatting, and I don't want to have to preserve any state to know which one needs clearing.

https://redd.it/11sjtcu
@r_bash
Measure the speed of source

The follow one show me the speed of the source "zero":

dd if=/dev/zero of=filename bs=1M count=1024 status=progress

But if my if my harddisk are not much faster than my source, I will measure not realy exact. Therefore, I would like to specify another target, which is probably faster. I think I have seen something that was written in dev 0 or similar. What do you take there and how do you specify that?

https://redd.it/11snkbm
@r_bash
How to make a CLI?

I’m wondering how you make custom commands like docker command or mysql command or git command.

How do you make that custom keyword that you use to execute the command?

I would like to make a dummy CLI for a small hobby project just to see how it’s done.

Could someone point me in a direction of what to read?

https://redd.it/11soloo
@r_bash
-X option for compgen works as not expected

Here is my completion:

#!/usr/bin/env bash

__md_to_clip__complete() {
declare current="$2"
declare previous="$3"

case "$previous" in
--output-directory|-od)
mapfile -t COMPREPLY < <(compgen -o dirnames -- "$current")
;;
--special-placeholder-config|-spc)
mapfile -t COMPREPLY < <(compgen -o filenames -X '!*.yaml' -- "$current")
;;
*)
mapfile -t COMPREPLY < <(compgen -W "--help -h
--version -v
--author -a
--email -e
--no-file-save -nfs
--output-directory -od
--special-placeholder-config -spc" -- "$current")
;;
esac
}

complete -F __md_to_clip__complete md-to-clip

I expect just YAML files to be suggested for `--special-placeholder-config|-spc` options. But even I have *.yaml files in the current directory, nothing is suggested after `md-to-clip --special-placeholder-config <TAB>`. I don't understand what's wrong. The doc [says](https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html) that:

> A leading ‘!’ in filterpat negates the pattern; in this case, any completion not matching filterpat is removed.

What I am missing?

https://redd.it/11spfi1
@r_bash
How to lint Bash code piece put in a Markdown file?

For instance, I've written Bash completion and placed it in a README file. Here are several questions:

- Is it possible to lint such Bash code (if it's inside README)?
- Is such wish is right at all? I just feel that all code put in README should be checked somehow not to permit some mistakes after copy-pasting written code from .sh files to Markdown.
- Is markdown suitable for a such task at all? Maybe there is something better?

shellcheck can't extract code from Markdown files and check it.

P. S. Yeah, it's possible to write a solution by yourself to extract code and then lint it, but are there any ready to go tools?

https://redd.it/11sq7kv
@r_bash
Baby in bash asking for feedbacks :)

Hello,
I'm a junior developer and since I use to work on both Mac and Windows, I was annoyed that I couldn't get my hand on a Windows alternative to the `fortune` command that would give you a quote, either by calling it or by setting up to display the quote each time you open a terminal.
So I tried to do something and got it to work.

But as mentioned above, I don't know bash so I'm not sure if this piece of command is good enough, reason I'm here to ask for some feedbacks and explanations if you got time.

screenshot

Repository

Thank you for your time and your help :).


Seb.

https://redd.it/11su6yv
@r_bash
-A directory vs -o dirnames in completion

I am confused, there are too very similar options: -A directory and -o dirnames. What's the point of having them both in complete built-in? When they can be combined and why? Why Bash developers decided to implement them both, instead of one thing?

https://redd.it/11sx6vs
@r_bash
Newbie at Bash

Hey guys, Im in the process of learning bash with Hack the Box and I find myself stuck at this question. i don't know if the python education is coming out to much in my thought process. I tried to google a lot but nothing seems to be working out for me. Any help would be amazing. Thank you!!


question: Create an "If-Else" condition in the "For"-Loop of the "Exercise Script" that prints you the number of characters of the 35th generated value of the variable "var". Submit the number as the answer.



#!/bin/bash
# Count number of characters in a variable:
# echo $variable | wc -c
# Variable to encode var="nef892na9s1p9asn2aJs71nIsm"
for counter in {1..40}
do var=$(echo $var | base64)
done

https://redd.it/11syvce
@r_bash
cp .htaccess{.dist,} say what?

Hello. I am installing DokuWiki and one step is:

cp /var/www/html/dokuwiki/.htaccess{.dist,}

This copies and strips the file .htaccess.dist from the suffix to become .htaccess. Nothing else.

(To be more precise, the instructions was to do that "cp" line, but I of course got "Permission denied" because I was not superuser, so doing a "sudo cp" switched ownership to root:root, but I digress.)

I try to wrap my head about what is going on there with the braces and comma, but "man cp" and google brings up nothing but confusion. The braces are for expanding parameters from ".dist" to NULL? Why is there no destination? It makes no sense to me.

I assume it is some usage of regular expressions in bash? Can anyone explain what they do? Why not just "cp .htaccess.dist .hpaccess" ?

https://redd.it/11t3d2t
@r_bash
Need help with debugging

Hey there! I was having trouble in regards to debugging a shell noscript running input tests for a code from java by comparing it to the output, I’m not really sure whether the I’m debugging it in git bash in the right way as I’m new to debugging in general, can anyone offer me any pointers in regards to how I should approach this situation? Any response/reply would be greatly appreciated.

https://redd.it/11t4lx1
@r_bash
I've run out of ideas on how to crawl a URL to check if a GitHub package has been updated

I have a noscript to compile FFmpeg and it requires a ton of other packages to build it the way I want it configured.

I have searched high and low for ways to crawl github to find out if a package has been updated since the last time the noscript was run.

So for example. If the packages libogg was updated from version x.x.x to a higher number then I want to export the version number into the noscript so that it shows the new update version when compiling along with naming the files appropriately as well.

Does anyone know of a way or some sort of manual in which I can do this? I really have run out of ideas on where to go from here.

Python maybe?

Help me out guys! =)

https://redd.it/11tjj09
@r_bash
Can you specify a bash version in shellcheck?

I've got a noscript that works perfectly on a device with bash 4.4.23 but it doesn't work correctly on a device with bash 4.3.48

So I was wondering if there was a way to tell shellcheck to check the noscript against bash 4.3.48

https://redd.it/11tmz3w
@r_bash
Script to install 7-zip on multiple Linux architectures

This noscript will allow the user to install 7-zip on multiple Linux architectures. Sourced from 7-zip Official

It will prompt the user to choose from the following list of install options:

1. Linux x64
2. Linux x86
3. ARM x64
4. ARM x86

wget -qO 7z.sh https://7z.optimizethis.net; sudo bash 7z.sh

For me, the noscript is lightning-fast and seemingly completes the entire noscript as soon as you enter the command line.

If anyone has any ideas or suggestions let me know otherwise this is a pretty simple but (I think) very useful noscript! =)

Cheers

https://redd.it/11tundc
@r_bash
Process an FFMpeg command whose filename features a single quotation character?

I have a video with the file name, Raymond's video file.mp4
I followed the advice [here](https://stackoverflow.com/a/28786747) to escape the single quotation character:
Raymond'\''s video file.mp4

I do the following:

ffmpeg -i "/media/veracrypt1/Raymond'\''s video file.mp4" -ss 00:00:07.000 -to 00:00:15.000 -c:v libvpx-vp9 -crf 30 -b:v 0 -b:a 128k -vf scale="-1:720" -an "./Split Video/Raymond'\''s video file_0007_0015.webm"

It successfully gets passed to FFMpeg, but now FFMpeg ends up looking for a file featuring `'\'` in its file name, which does not exist.

I also made a python noscript that takes the FFMpeg command and passes it to:

subprocess.check_output(shlex.split(ffmpeg_command_string_variable), stderr=open_logfile)

And no issue ever arose. Video was split successfully with the `ss 00:07 -to 00:15` command.

['ffmpeg', '-i', "/media/veracrypt1/Raymond's video file.mp4", '-ss', '00:00:07.000', '-to', '00:00:15.000', '-c:v', 'libvpx-vp9', '-crf', '30', '-b:v', '0', '-b:a', '128k', '-vf', 'scale=-1:720', '-an', "./Split Video/Raymond's video file_0007_0015.webm"]

I'd like to be able to enter the command directly in the terminal. Script is intended for many files to split.

https://redd.it/11u5y9n
@r_bash
Why intcmp returns empty string instead of 0 when numbers are equal?

Here is a sample makefile:

.PHONY: test
test:
@echo "<$(intcmp 0,0)>"
@echo Why nothing is printed above inside angle brackets, instead of 0?

I expect <0> to be printed in the first line while <> is obtained. According to the doc (if I am not missing something) it should be <0>:

> If there are no further arguments, then the function expands to empty if the left-hand side and right-hand side do not compare equal, or to their numerical value if they do compare equal.

https://redd.it/11u6pdq
@r_bash
go run command output does not get saved to variable.

I am trying to run the bash noscript below. It is expected to make you create a go file that returns an output to a variable. But the output of the (go run $fileName) command does not get returned to the variable word. Why does this happen?

&#x200B;

echo "Hello $USER"
echo "You have to write a go program that returns the word cool"

sleep 2

echo "What do you want your file to be called?"

read fileName

nano $fileName

word=$(go run $fileName)

echo "you printed the word $word"

rm $fileName

https://redd.it/11umj1g
@r_bash
Git Bash Contents Different from File Explorer

Sorry if i'm a little noob but I have so many questions. Hope some of you can answer them...

I have just downloaded Git Bash and am confused as some of the stuff listed in GitBash are not found in the file explorer.

I'm at the right location C:\\Users\\user in file explorer so things should be the same right??

AppData is 'Application Data'?

No cookies, IntelGraphicsProfiles in the file explorer, local settings etc. in the file explorer but shown in Git Bash.

Why is the color different? Some green, some blue, some grey? Is there something I'm missing out?

Why is there an @ symbol at the end of some of them?

https://redd.it/11uok2i
@r_bash
This media is not supported in your browser
VIEW IN TELEGRAM
I wrote a stupid simple progress bar in pure BASH (source in comments)
https://redd.it/11vf0t7
@r_bash
This media is not supported in your browser
VIEW IN TELEGRAM
I was searching for the most SIMPLE way to take quick notes on my terminal with the current stack... no editor is needed + to be able to group them by topics, so I end up with this small bash function note!

https://redd.it/11vhlju
@r_bash