Tool.Yun
Herramientas practicas para desarrolladores
CSV a datos
Codificador/decodificador de cadenas Base64
Codificador/decodificador de matriz hexadecimal Base64
Consumo y gasto de energía en la computadora
Conversor de caracteres Unicode a entidades Java
Conversor de coordenadas geográficas
Conversor de formato de variables de entorno
Conversor de propiedades
Convertidor dBm mW
Convertidor de archivos Base64
Convertidor de base entera
Convertidor de muchas unidades
Convertidor de números romanos
Convertidor de unidades de almacenamiento de datos
Excel a datos
Generador de ULID
Normalizador de correo electrónico
Texto a Unicode
Texto a binario UTF-8
Torrente a Magnet
Analizador JWT
Analizador SAML
Analizador de certificados/claves
Bcrypt
Bytes de Niceware a frase de contraseña
Calculadora de CRC
Cifrado PGP
Cifrado RSA
Cifrado de archivos PGP
Cifrado de cadenas Jasypt
Cifrar/descifrar texto
Codificador/decodificador Bech32
Conversor de certificados SSL
Criptografía AGE
Descifrado de Ansible Vault Crypt
El secreto compartido de Shamir
Firmante y verificador RSA/DSA/ECDSA
Generador JWT
Generador de HMAC
Generador de RSE
Generador de certificados X509
Generador de claves PGP
Generador de pares de claves ECDSA
Generador de pares de claves Ed25519
Generador de pares de claves RSA
Hasher Argon2
Hasher de archivos
Paseto/PASERK Local
Paseto/PASERK Público/Privado
Texto hash
Decodificador de código QR
Generador de códigos QR
Generador de códigos QR de WiFi
Generador de códigos de barras
Generador de información de contacto QR
Lector de código de barras
Validador de GTIN
tools.epc-qrcode-generator.name
Analizador y formateador de teléfonos
Buscador ISO 639
Buscador de códigos de país ISO 3166
Búsqueda Unicode
Calculadora de IMC
Calculadora de SLA
Calculadora de ritmo de carrera
Compatibilidad de licencias de software
Comprobador de tarjetas de crédito
Conversor de RMB a mayúsculas
Conversor de divisas
Convertidor de calendario
Diccionario en línea
Directrices de iluminación del IES
Explicar el comando Shell
Validador de Luhn
Validador de números de IVA
Validador y analizador IBAN
Validador y analizador ISBN
Conversor de cotizaciones
Convertidor de archivos HEX
Convertidor de rizos
Descompresor/desempaquetador de Javascript
Divisor de archivos
Embellecedor de Javascript
Embellecer y formatear SQL
Embellecimiento y minimización de CSS/JS
Escaper de cuerdas
Falsificador de datos
Generador de GitIgnore
Generador de atributos de Gita
Generador de cadenas de conexión a bases de datos
Generador de correo electrónico
Generador de creación de bases de datos
Generador de faviconos
Generador de metagráficos abiertos
Generador de parámetros SQL
Generador de scripts para pruebas de carga K6
Generador de secretos de Django
Generador de tablas de bases de datos
INSERTAR JSON a SQL
Json a Protobuf
Json a Typescript
Minificador de SQL
Ofuscador de Javascript
Probador de Picomatch
Probador de escape ANSI
Probador de interfaz de usuario Swagger
Pruebas de API
Resaltador de código/scripts
Stacktrace más bonito
Temporizador Pomodoro
editor de comandos CLI
Conversor de Docker Compose a Docker Run
Conversor de Docker Run a Docker Compose
Conversor de formato de Docker Compose
Creador de Traefik Docker Compose
Descargador de imágenes de Docker
Docker Compose a Quadlets
Docker Compose a archivo .env
Docker Compose para Kubernetes
Ejecución de Docker en Kubernetes
Ejecución de Docker en Quadlets
Etiquetas de Docker Pangolin
Generador de RBAC para Kubernetes
Generador de etiquetas de Dockerfile
Inspeccionar Docker para ejecutar Docker
Validador de Docker Compose
Alarma de crono/día laborable
Alarma de tiempo
Analizador de archivos ICAL
Calculadora TTL
Calculadora de ETA
Calculadora de duración
Calculadora de días
Calculadora de fechas y duraciones
Conversor de fecha y hora
Conversor de números de semana
Conversor de zona horaria
Cronómetro
Cuenta atrás
Fusión de iCal
Generador ICAL
¿Que día?
Calculadora de amortización
Analizador de URL
Analizador de cookies
Analizador de correo electrónico
Analizador de correo electrónico rebotado
Analizador de informes DMARC
Analizador de mensajes de Outlook
Buscador de propiedades LDAP de ActiveDirectory
Calculadora de resistencias
Codificador/decodificador hexadecimal
Consola de puerto serie
Convertidor GZip/Deflate
Convertidor SMART Raw
Convertidor de ObjectId de MongoDB
Convertidor de codificación MIME
Convertidor de números de punto flotante
Convertidor de orden medio-endian
Decodificador EMV TLV
Decodificador de URL compartidas de SharePoint
Decodificador de transacciones ETH
Descodificador de Outlook Safelink
Detector de tipo de archivo
Detector/decodificador de juegos de caracteres de texto
Enmascarador de datos sensibles
Expansor de URL cortas
Extractor de ID de copos de nieve
Generador de TCPDump
Generador de URL
Generador de comandos de Nmap
Hoja de trucos para el cableado RJ45 Cat6
Información del código clave
Lector de archivos de Parquet
Probador HTTPS
Probador de DNS
Probador de propagación DNS
Probador de píxeles muertos
键盘测试器
Conversor de unidades de volumen
Convertidor de aceleración
Convertidor de caudal volumétrico
Convertidor de energía alimentaria
Convertidor de frecuencia
Convertidor de iluminancia
Convertidor de potencia
Convertidor de prefijos del SI
Convertidor de temperatura
Convertidor de unidades angulares
Convertidor de unidades de energía
Convertidor de unidades de fuerza
Convertidor de unidades de longitud
Convertidor de unidades de masa
Convertidor de unidades de presión
Convertidor de unidades de área
Convertidor de velocidad
Ordenador de fitness
Convertidor UUID
Generador de UUID
Generador de contraseñas
Generador de contraseñas BIP39
Generador de contraseñas de Diceware
Generador de código PIN
Generador de códigos OTP
Generador de nanoIDs
Generador de numerónimos
Generador de tokens
generador de números aleatorios
Hoja de referencia de Docker
Hoja de referencia de Docker Compose
Hoja de referencia de Dockerfile
Hoja de referencia de confirmación semántica de Git
Hoja de referencia de expresiones regulares comunes
Hoja de referencia de selectores CSS
Hoja de referencia de sintaxis XPath
Hoja de referencia de sintaxis de JSONPath
Hoja de trucos de Bash
Hoja de trucos de Docker SWARM
Hoja de trucos de Git
Hoja de trucos de Jq
Hoja de trucos de Markdown
Hoja de trucos de Nano
Hoja de trucos de Nginx
Hoja de trucos de PowerShell
Hoja de trucos de Sed
Hoja de trucos de VIM
Hoja de trucos de comandos de pantalla
Hoja de trucos de expresiones regulares
Hoja de trucos del comando TMUX
Hoja de trucos del comando Zellij
Hoja de trucos del comando chmod
Hoja de trucos para K8
Comparación de imágenes
Conversor de formatos de imagen
Convertidor HEIC
Convertidor ICO/PNG
Eliminar EXIF
Eliminar el fondo de la imagen
GIF a MP4
Grabadora de cámara
Imagen a SVG (potrace)
Inversor de color de imagen
Lector de calidad de imágenes EXIF/Metadatos/GPS/JPEG
Marcador de agua
OCRizar imágenes y PDF
Recortar imagen
Redimensionador de imágenes
Vista previa de SVG
Analizador de tamaño JSON
Aplanador/desplanificador de JSON
CSV a JSON
Consulta JSON
Convertidor de JS a JSON
Convertidor de JSON a JS
Convertidor de JSON a YAML
Convertidor de cadenas JSON
Código JSON a PHP
DDL de JSON a SQL
Diferencia JSON
Editor JSON
Embellecer y formatear JSON
Entidad JSON a Java
Escaper/Unescaper de JSON
Fusión JSON
JSON Linter
JSON a .env
JSON a C#
JSON a CSV
JSON a MessagePack
JSON a TOML
JSON a TS
JSON a XML
JSON a datos
JSON a objeto
JSON para llevar
Json a PHP-Array
Json a Python
Json a esquema
Maestro de clasificación JSON
Minificar JSON
ObjGen a JSON
PHP-Array a JSON
Paquete de mensajes a JSON
Probador de rutas Jq/JSON
tools.json-patch.name
Lanzador de monedas
Rueda de la fortuna
Selector de tarjetas
Tirador de dados
Calculadora binaria
Calculadora de propinas
Conversor de formatos matemáticos
Evaluador de matemáticas
OCR matemático
Visualizador de curvas trigonométricas/de ecuaciones
Calculadora de distancia geográfica
Calculadora de porcentajes
Calculadora de relación de aspecto
Constructor de puntos de referencia
Cifrado de PDF
Compresor de PDF
Comprobador de firmas PDF
Concatenador de PDF
Descifrar y desbloquear PDF
Extractor de páginas PDF
Extractor de texto PDF
HTML a PDF
Linealización de PDF/FastWeb
Generador de expresiones Cron
Analizador de la fortaleza de las contraseñas
Autorización SIP
Búsqueda de dirección MAC
Calculadora Chmod
Calculadora RAID
Calculadora RAID ZPOOL
Calculadora de HDD
Calculadora de confiabilidad RAID
Calculadora de exclusión de subredes IP
Calculadora de rango de CIDR a IPv4/6
Calculadora de rango de IPv4/6 a CIDR(s)
Calculadora de subredes IPv4
Calculadora de subredes IPv6
Calculadora de velocidad de transferencia de datos
Calculadora visual de subredes
Comprobador DNSBL
Comprobador de Whois
Comprobador de puertos TCP/UDP
Consultas DNS
Consultas DNS/RDAP de Cloudflare
Convertidor de Punycode
Convertidor de direcciones IPv4
Convertidor de direcciones IPv6
Convertidor de direcciones MAC
Decodificador ARPA
Decodificador de causa de spam X-VR
Descargador de enlaces múltiples
Desinfectante HAS
Enteros a IPv4/IPv6
Expansor de rango IPv4
Formateador de Nginx
Formateador de comandos de shell
Fuerza de la contraseña de Zxcvbn
Generador Apache LogRotate
Generador FStab
Generador Option43
Generador Rsync
Generador WPA PSK
Generador de DNS BIMI
Generador de DNS DKIM
Generador de DNS DMARC
Generador de DNS PTR
Generador de DNS SPF
Generador de HTAccess
Generador de ULA de IPv6
Generador de autenticación básica
Generador de comandos Curl
Generador de comandos UFW
Generador de comandos de apagado
Generador de configuraciones de Wireguard
Generador de crontab
Generador de htpasswd/htaccess
Generador de iptables
Generador de puertos aleatorios
Hoja de trucos de ZPool
IPv4-6/IPRange/CIDR en IPRange/CIDR/IPMask
Linealizador de comandos de shell
Listador de subredes IPv4
Mi dirección IP
Números de puerto
Probador de micrófonos
Pruebas de WebSocket
Silbido
Ubicación geográfica de IP
generador de direcciones MAC
generador de línea de comandos de firewalld
tools.restic-command-generator.name
tools.url-redirection-checker.name
De Epub a Markdown
Diferencia de Markdown
Editor de Markdown
Embellecedor de tablas de Markdown
Generador de tablas Markdown
Generador de índice de Markdown
HTML a Markdown
Lorem Ipsum de rebajas
Markdown a DOCX
Markdown a HTML
Markdown a datos
Markdown a texto
Pegar como Markdown
Vista previa de Markdown
tools.markdown-format-converter.name
Linter TOML
TOML a JSON
TOML a YAML
Buscador de líneas duplicadas
Calculadora de Levenshtein
Codificador/decodificador de tokens GPT
Comparación de fuentes
Compartidor de enlaces sociales
Comprobador de I y L
Conversor de distribución de teclado
Conversor de mayúsculas y minúsculas
Convertidor de código Morse
Convertidor de listas
Convertidor de runas
Diagrama de estructura de carpetas
Diferencia de texto
Divisor de indicaciones de IA
Estadísticas de texto
Estimador de tokens GPT
Exportador de sirenas
Extraer texto de HTML
Formateador Unicode
Generador de citas
Generador de comandos Sed
Generador de texto artístico ASCII
Generador/Banner de Zalgo
Hola, generador.
Imagen a arte ASCII
JSON a TOON
Lector de RSVP
Listas Comparar
Ofuscador de cadenas
Palabras distintas
Paquete de archivos para IA
Probador de expresiones regulares
Reemplazador de texto inteligente y separador de línea
Selector de emojis
Selector de líneas aleatorias
TOON a JSON
Tabulador a espacios
Texto a nombres Unicode
Texto al alfabeto de la OTAN
Traductor de texto
Unicode a GSM-7
Analizador de agente de usuario
Cadena Slugify
Capturador de URL
Codificar/decodificar cadenas con formato URL
Comprobador de contraste de color
Conversor de colores
Convertidor CSS XPath
Convertidor de píxeles REM
Convertidor de unidades CSS
Creador de fragmentos de búsqueda de texto de URL
Códigos de estado HTTP
Editor HTML WYSIWYG
Embellecedor de CSS
Embellecedor de HTML
Escapar entidades HTML
Generador de URL UTM
Generador de degradados CSS
Generador de marcadores de posición SVG
HTML a XHTML
HTML a datos
Imagen a CSS
Información del dispositivo
Limpiador de HTML
Limpiador de URL
Minificador de HTML
Rueda de colores
Tipos MIME
Formateador XML
Linter XML
ObjGen a HTML
Probador XPath
Probador XSLT
XML a JSON
Aplanador/desaplanador de YAML
Convertidor de YAML a JSON
Embellecer y formatear YAML
Fusión de YAML
YAML a TOML

Hoja de trucos de Bash

Comandos comunes de Bash

Bash is the default shell on most Linux systems and the language of most glue scripts. This sheet covers the interactive shortcuts, the syntax you forget between scripts, and the safety flags worth putting at the top of every file.

#!/usr/bin/env bash
set -euo pipefail

⌨️ Keyboard Shortcuts

KeysDoes
Ctrl+A / Ctrl+EJump to the start / end of the line
Ctrl+B / Ctrl+FBack / forward one character
Alt+B / Alt+FBack / forward one word
Ctrl+U / Ctrl+KCut to the start / end of the line
Ctrl+WCut the word before the cursor
Alt+DCut the word after the cursor
Ctrl+YPaste back what you last cut
Ctrl+T / Alt+TSwap the last two characters / words
Alt+.Insert the last argument of the previous command
Ctrl+LClear the screen
Ctrl+RSearch the history backwards
Ctrl+GAbort the history search
Ctrl+CInterrupt the running command
Ctrl+DEnd of input — logs out of an empty prompt
Ctrl+ZSuspend the running command
Ctrl+S / Ctrl+QFreeze / resume terminal output
Alt+U / Alt+LUpper-case / lower-case to the end of the word

🕰 History

# the last few hundred commands
history

# run command number 42
!42

# run the last command again, or the last one starting with 'ssh'
!!
!ssh

# the last argument of the previous command — also Alt+.
!$

# every argument of the previous command
!*

# re-run the last command with a substitution
^old^new

# forget a command you would rather not keep
history -d 42

# do not record commands that start with a space, and drop duplicates
export HISTCONTROL=ignoreboth
export HISTSIZE=10000 HISTFILESIZE=20000

📁 Files & Directories

# list: long, human sizes, hidden files, newest last
ls -lhAtr

# tree view of a directory
tree -L 2

# copy, move, delete
cp -r src/ dest/
mv old new
rm -rf directory

# create nested directories in one go
mkdir -p project/{src,test,docs}

# symbolic and hard links
ln -s /path/to/target linkname
ln target hardlink

# where is a file, and what is it?
find . -name '*.log' -mtime -7
find . -type f -size +100M
locate nginx.conf
which python3
type -a ls
file archive.bin
stat report.pdf

# disk usage: this directory, and the filesystem
du -sh *
du -h --max-depth=1 | sort -h
df -h

# archives
tar czf backup.tar.gz directory/
tar xzf backup.tar.gz
zip -r archive.zip directory/
unzip archive.zip

🔎 Text & Search

# grep: recursive, line numbers, case-insensitive
grep -rni "pattern" .

# only the matching part, or only the file names
grep -o 'v[0-9.]*' file
grep -rl "TODO" src/

# invert, count, context
grep -v "debug" app.log
grep -c "error" app.log
grep -B2 -A2 "exception" app.log

# head, tail, follow
head -20 file
tail -f /var/log/syslog

# columns, sorting, counting
cut -d',' -f1,3 data.csv
sort -u names.txt
sort -k2 -n scores.txt
uniq -c sorted.txt
wc -l file

# the classic: what are the top ten IPs in this log?
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

# replace across many files
sed -i 's/old/new/g' *.conf

# translate or delete characters
tr 'a-z' 'A-Z' < file
tr -d '\r' < dos.txt > unix.txt

# split a stream: to a file and onward down the pipe
command | tee output.log | grep error

# build command lines from input
find . -name '*.py' | xargs wc -l
find . -name '*.tmp' -print0 | xargs -0 rm

🖧 System & Network

# who and where am I
whoami; hostname; uname -a; uptime

# processes
ps aux | grep nginx
pgrep -a node
top
htop

# memory and load
free -h
vmstat 1 5

# what is listening, and what has this file open
ss -tulpn
lsof -i :8080
lsof /var/log/app.log

# connectivity
ping -c 4 example.com
traceroute example.com
dig example.com +short
ip addr show
curl -I https://example.com

# transfer files
scp file user@host:/path/
rsync -avz --progress src/ user@host:/dest/

# remote shell, with a tunnel
ssh user@host
ssh -L 8080:localhost:80 user@host

# services and logs (systemd)
systemctl status nginx
journalctl -u nginx -f --since "1 hour ago"

📦 Variables

# assignment: no spaces around the =
name="value"

# only for this one command
DEBUG=1 ./script.sh

# export to child processes
export PATH="$HOME/bin:$PATH"

# read input from the user
read -p "Name: " name
read -rs -p "Password: " pass

# command substitution
today=$(date +%F)

# arithmetic
count=$(( count + 1 ))
let "n = 5 * 3"

# read-only and integer variables
declare -r VERSION=1.0
declare -i counter=0
VariableHolds
$0The name of the script
$1 … $9Positional arguments
$#How many arguments were passed
$@All arguments, each one quoted separately
$*All arguments as a single word
$?Exit status of the last command
$$PID of the current shell
$!PID of the last background job
$_Last argument of the previous command
$HOME $USER $PWD $OLDPWDThe usual environment
$RANDOMA random integer
$LINENOThe current line number — handy in traps

🔤 Parameter Expansion

ExpansionResult
${var:-default}default when var is unset or empty
${var:=default}The same, and assigns it
${var:?message}Abort with message when unset — great for required arguments
${var:+value}value only when var is set
${#var}The length of the value
${var:offset:length}A substring
${var#pattern}Strip the shortest match from the start
${var##pattern}Strip the longest match from the start — ${path##*/} is basename
${var%pattern}Strip the shortest match from the end — ${file%.txt} drops the extension
${var%%pattern}Strip the longest match from the end
${var/old/new}Replace the first match
${var//old/new}Replace every match
${var^^} / ${var,,}Upper-case / lower-case the whole value
path="/var/log/app.log"
echo "${path##*/}"    # app.log
echo "${path%/*}"     # /var/log
echo "${path%.log}"   # /var/log/app

📚 Arrays

# indexed arrays
fruits=(apple banana cherry)
fruits[3]="date"

echo "${fruits[1]}"       # banana
echo "${fruits[@]}"       # every element
echo "${#fruits[@]}"      # how many elements
echo "${!fruits[@]}"      # the indexes
echo "${fruits[@]:1:2}"   # a slice

for fruit in "${fruits[@]}"; do
  echo "$fruit"
done

# associative arrays (bash 4+)
declare -A color
color[apple]="red"
color[banana]="yellow"

echo "${color[apple]}"
for key in "${!color[@]}"; do
  echo "$key is ${color[$key]}"
done

🧪 Tests & Conditions

Use [[ ... ]] in bash — it handles empty variables and patterns far better than the old [ ... ].

FilesTrue when
-e fileIt exists
-f fileIt exists and is a regular file
-d fileIt exists and is a directory
-L fileIt is a symbolic link
-s fileIt exists and is not empty
-r -w -xYou can read / write / execute it
-O fileYou own it
f1 -nt f2f1 is newer than f2 (-ot for older)
StringsTrue when
-z "$s"The string is empty
-n "$s"The string is not empty
"$a" == "$b"They are equal (= also works)
"$a" != "$b"They differ
"$a" < "$b"Sorts before, in the current locale
"$s" == pre*Glob match — unquoted right-hand side
"$s" =~ ^re$Regex match, captures land in $BASH_REMATCH
NumbersMeaning
-eqEqual
-neNot equal
-ltLess than
-leLess than or equal
-gtGreater than
-geGreater than or equal
if [[ -f "$config" && -r "$config" ]]; then
  echo "readable"
elif [[ -d "$config" ]]; then
  echo "that is a directory"
else
  echo "missing"
fi

# arithmetic comparison reads more naturally in (( ))
if (( count > 10 )); then echo "plenty"; fi

🔀 Flow Control

# for over a list, a glob, or a range
for name in alice bob; do echo "$name"; done
for f in *.log; do gzip "$f"; done
for i in {1..10}; do echo "$i"; done
for (( i = 0; i < 10; i++ )); do echo "$i"; done

# while and until
while read -r line; do echo "$line"; done < input.txt
until ping -c1 host &>/dev/null; do sleep 5; done

# case
case "$1" in
  start)   echo "starting" ;;
  stop)    echo "stopping" ;;
  restart) echo "restarting" ;;
  *)       echo "usage: $0 {start|stop|restart}"; exit 1 ;;
esac

# select builds a numbered menu
select choice in build test deploy; do
  echo "you picked $choice"
  break
done

# loop control
continue   # skip to the next iteration
break      # leave the loop

🧰 Functions

greet() {
  local name="${1:?name required}"
  local greeting="${2:-Hello}"
  echo "$greeting, $name!"
  return 0
}

greet "World"
greet "World" "Good morning"

# capture the output, and check the status
message=$(greet "World")
if ! greet; then echo "greet failed"; fi

# make a function available to subshells
export -f greet

➡️ Redirection

SyntaxDoes
> fileSend stdout to a file, replacing it
>> fileAppend stdout to a file
2> fileSend stderr to a file
2>&1Send stderr wherever stdout is going
&> fileSend both to a file (bash)
> file 2>&1The portable form of the same
< fileRead stdin from a file
<<EOF … EOFHere-document
<<-EOF … EOFHere-document, leading tabs stripped
<<< "string"Here-string
|Pipe stdout into the next command
|&Pipe stdout and stderr
> /dev/null 2>&1Discard everything
<(command)Process substitution — a command as a file
tee fileWrite to a file and pass the stream on
# a heredoc, expanded
cat <<EOF > config.ini
host=$HOSTNAME
port=8080
EOF

# a heredoc, literal (quoted delimiter)
cat <<'EOF' > script.sh
echo "$HOME is not expanded here"
EOF

# compare the output of two commands without temporary files
diff <(sort a.txt) <(sort b.txt)

⚙️ Jobs & Processes

# run in the background, and list the jobs
long_task &
jobs

# bring back to the foreground, or resume in the background
fg %1
bg %1

# Ctrl+Z suspends the foreground job

# survive logout
nohup ./script.sh > out.log 2>&1 &
disown -h %1

# wait for background jobs
wait
wait $!

# signals
kill 1234
kill -9 1234
kill -TERM %1
pkill -f "node server.js"

# give a command a deadline
timeout 30s ./slow_task.sh

# clean up on exit, whatever happens
trap 'rm -f "$tmpfile"' EXIT
trap 'echo interrupted; exit 130' INT TERM

🛡 Safe Scripting

#!/usr/bin/env bash
# -e  exit on any failing command
# -u  treat unset variables as an error
# -o pipefail  a pipeline fails if any stage fails
set -euo pipefail

# make word splitting predictable
IFS=$'\n\t'

# always quote expansions
cp "$src" "$dest"

# check the syntax without running anything
bash -n script.sh

# trace every command as it runs
bash -x script.sh
set -x; risky_command; set +x

# a more informative trace prefix
export PS4='+ ${BASH_SOURCE}:${LINENO}: '

# report where a script died
trap 'echo "failed at line $LINENO with status $?" >&2' ERR

# and lint it before it reaches anyone else
shellcheck script.sh

⚠️ set -e has surprising corners: it does not fire inside if, &&, || or command substitutions used in assignments. It is a seatbelt, not autopilot — still check what matters explicitly.

🎨 Colours

Escape sequences take the form \033[<style>;<colour>m, and \033[0m resets. \e and \x1B are the same character as \033.

ColourForegroundBrightBackground
Black309040
Red319141
Green329242
Yellow339343
Blue349444
Magenta359545
Cyan369646
White379747
StyleCodeStyleCode
Reset0Underline4
Bold1Blink5
Dim2Reverse7
RED='\033[0;31m'
GREEN='\033[0;32m'
BOLD='\033[1m'
RESET='\033[0m'

echo -e "${GREEN}ok${RESET} — ${RED}${BOLD}failed${RESET}"

# only colourise when stdout is a terminal
if [[ -t 1 ]]; then RED='\033[0;31m'; RESET='\033[0m'; else RED=''; RESET=''; fi

💡 Tips

# aliases and functions belong in ~/.bashrc
alias ll='ls -lhA'
alias gs='git status -sb'
mkcd() { mkdir -p "$1" && cd "$1"; }

# reload the config after editing it
source ~/.bashrc

# brace expansion saves a lot of typing
cp config.yaml{,.bak}
mkdir -p src/{components,utils,tests}

# repeat the previous command as root
sudo !!

# go back to the previous directory
cd -

# run something regardless of the current directory
(cd /tmp && ./task.sh)

# time a command, and keep a transcript of a session
time ./build.sh
script session.log

📚 Resources

  • GNU Bash manual
  • ShellCheck — lints your scripts
  • Bash Pitfalls
  • Google Shell Style Guide
  • explainshell — break down any command line