Skip to content

Instantly share code, notes, and snippets.

View RichardBronosky's full-sized avatar

Bruno Bronosky RichardBronosky

View GitHub Profile
@RichardBronosky
RichardBronosky / README.md
Last active August 17, 2023 15:34
A bash plugin to make files executable

bash-plusx

A bash plugin to make files executable

Installation

Set up bash_plugins folder

(Skip this step if you already have a bash_plugins folder.)

{
# simply copy-pasta this whole block, or customize these vars and copy-pasta the rest
@RichardBronosky
RichardBronosky / DEMO1-handlebar_templates_via_argument.sh
Last active March 26, 2020 12:03
All other examples of rendering handlebars.js (double braces) templates in bash are way too complicated to put into a script
#!/bin/bash
# This function works with both GNU/Linux and macOS/BSD version of sed and grep
# Inspired by https://github.com/relaxdiego/renderest
render(){
local template="$*"
for varname in $(<<<"$template" grep -oE '\{\{([A-Za-z0-9_]+)\}\}' | sed -En 's/.*\{\{([A-Za-z0-9_]+)\}\}.*/\1/p' | sort | uniq); do
template="$(<<<"$template" sed -E "s/\{\{$varname\}\}/$(sed 's_\\_\\\\\\\\_g;s_/_\\/_g' <<<"${!varname}")/g")"
done
@RichardBronosky
RichardBronosky / README.md
Created February 11, 2020 17:42
Pattern for using `main` and `exports` in Node.js

Pattern for using main and exports in Node.js

Demo

~/src/node-playground(master#%)[0]
$ cat example-main_and_exports.js
#!/usr/bin/env node

const lib = require('./lib.js')
#!/bin/bash
# curl -sL https://gist.github.com/RichardBronosky/04f3b830532ba8ba60f35b22752d88f2/raw/curl-bash-env | bash
cat <<EOF | less
# stdin_is_a_pipe
[[ -p /dev/stdin ]]; echo \$?
$([[ -p /dev/stdin ]]; echo $?)
# stdin_is_a_tty
#!/bin/bash
tput init
end=$(( $(tput colors)-1 ))
w=8
for c in $(seq 0 $end); do
tput setaf $c
[[ $c -ge $(( w*2 )) ]] && offset=2 || offset=0
[[ $(((c+offset) % (w-offset))) -eq $(((w-offset)-1)) ]] && s=$'\n'|| s=' '

Shell Script Design Goals

  • Don't avoid bashisms unless you know bash will be unavailable
    • Use #!/bin/bash rather than #!/bin/sh
    • If you are going to try to avoid bash, you must test on a system that does not have bash
  • Always include a shebang #!
  • Handle errors
    • Use set -eu (errexit & nounset)
  • Sould be idemponent if read via source
  • Use subshells to avoid leaking unintended variables into the parent scope
#!/bin/bash -eu
[[ -z ${1:-} ]] && \
echo -e "\n""Usage: $0 executable_path [destination_path] ""\n" || \
executable_path="${1:-}"
: $executable_path
destination_path="${2:-/usr/local/bin}"
exec="$( basename $executable_path )"
dir="$( dirname $executable_path )"
Thu Nov 14 12:11:48 EST 2019
Thu Nov 14 12:10:38 EST 2019
@RichardBronosky
RichardBronosky / Fork your own Gist.md
Last active November 14, 2019 17:12 — forked from antichris/about.md
Fork your own Gist

Fork your own Gist

It used to be possible to fork your own gists via the browser using a little JS magic. This is no longer the case. As an alternative, you can use Chris Wanstrath's https://github.com/defunkt/gist cli tool to do the next best thing.

Usage

gist-fork git@gist.github.com:fcc543f7f1cfba404caf5ce276cc0951.git