Tool.Yun
Narzędzia dla programistów
Kalkulator BMI
Kalkulator SLA
Kalkulator tempa biegu
Kontroler kart kredytowych
Konwerter kalendarza
Konwerter walut
Konwerter wielkich liter RMB
Parser i formater telefonu
Słownik internetowy
Walidator Luhn
Walidator i parser IBAN
Walidator i parser ISBN
Walidator numerów VAT
Wyjaśnij polecenie powłoki
Wyszukiwanie Unicode
Wyszukiwarka ISO 639
Wyszukiwarka kodów krajów ISO 3166
Wytyczne dotyczące oświetlenia IES
Zgodność licencji oprogramowania
Alarm Cron/dni powszednich
Alarm czasowy
Chronometr
Fuzja iCal
Generator ICAL
Kalkulator ETA
Kalkulator TTL
Kalkulator czasu trwania
Kalkulator daty i czasu trwania
Kalkulator dni
Konwerter daty i godziny
Konwerter numerów tygodni
Konwerter strefy czasowej
Który dzień?
Odliczanie
Parser plików ICAL
Docker Compose do Quadlets
Docker Compose do pliku .env
Docker Image Downloader
Docker Inspect do uruchomienia Dockera
Docker compose do Kubernetes
Docker uruchamiany w Quadlets
Etykiety Docker Pangolin
Generator RBAC Kubernetes
Generator etykiet Dockerfile
Konwerter Docker Compose na Docker Run
Konwerter Docker Run na Docker Compose
Konwerter formatów Docker Compose
Traefik Docker Compose Maker
Uruchomienie Dockera na Kubernetesie
Walidator Docker Compose
Konstruktor wyrażeń cron
Kalkulator amortyzacji
Komputer fitness
Konwerter częstotliwości
Konwerter energii żywności
Konwerter jednostek ciśnienia
Konwerter jednostek długości
Konwerter jednostek energii
Konwerter jednostek kątowych
Konwerter jednostek masy
Konwerter jednostek objętości
Konwerter jednostek powierzchni
Konwerter jednostek siły
Konwerter mocy
Konwerter natężenia oświetlenia
Konwerter prefiksów SI
Konwerter przyspieszenia
Konwerter prędkości
Konwerter temperatury
Przetwornik natężenia przepływu objętościowego
Generator NanoID
Generator UUID
Generator haseł
Generator haseł BIP39
Generator haseł Diceware
Generator kodu OTP
Generator kodu PIN
Generator liczb losowych
Generator numeronimów
Generator tokenów
Konwerter UUID
Koło fortuny
Rzucacz monet
Rzucanie kostką
Wybieracz kart
Analizator rozmiaru JSON
CSV do JSON
Edytor JSON
Fuzja JSON
Główny sortownik JSON
JSON do .env
JSON do C#
JSON do CSV
JSON do MessagePack
JSON do TOML
JSON do TS
JSON do XML
JSON do danych
JSON do encji Java
JSON do obiektu
JSON na Go
Json Escaper/Unescaper
Json do Pythona
Json do SQL DDL
Json do schematu
Json do tablicy PHP
Kod Json do PHP
Konwerter JS na JSON
Konwerter JSON na JS
Konwerter JSON na YAML
Konwerter ciągów JSON
Linter JSON
Minifikacja JSON
ObjGen do JSON
Pakiet wiadomości do JSON
Różnica JSON
Spłaszczacz/odspłaszczacz JSON
Tablica PHP do JSON
Tester Jq/JSONPath
Upiększanie i formatowanie JSON
Zapytanie JSON
tools.json-patch.name
Czytnik kodów kreskowych
Dekoder kodów QR
Generator danych kontaktowych QR
Generator kodów QR
Generator kodów QR WiFi
Generator kodów kreskowych
Walidator GTIN
tools.epc-qrcode-generator.name
CSV do danych
Excel do danych
Generator ULID
Koder/dekoder ciągu Base64
Koder/dekoder tablicy szesnastkowej Base64
Komputer do pomiaru zużycia i wydatków energii
Konwerter baz liczb całkowitych
Konwerter cyfr rzymskich
Konwerter dBm mW
Konwerter formatu zmiennych środowiskowych
Konwerter jednostek pamięci danych
Konwerter plików Base64
Konwerter wielu jednostek
Konwerter współrzędnych geograficznych
Konwerter właściwości
Konwerter znaków Unicode na encje Java
Normalizator poczty e-mail
Tekst do Unicode
Tekst do pliku binarnego UTF-8
Torrent do magnesu
Bcrypt
Generator CSR
Generator Hmac
Generator JWT
Generator certyfikatów X509
Generator kluczy PGP
Generator par kluczy ECDSA
Generator par kluczy Ed25519
Generator par kluczy RSA
Hasher Argon2
Hasher plików
Kalkulator CRC
Koder/dekoder Bech32
Konwerter certyfikatów SSL
Kryptografia AGE
Niceware Bytes to Passphrase
Odszyfrowywanie krypty skarbca Ansible
Parser JWT
Parser SAML
Parser certyfikatu/klucza
Paseto/PASERK Lokalny
Paseto/PASERK Publiczno-Prywatny
Podpisujący i weryfikator RSA/DSA/ECDSA
Szyfrowanie PGP
Szyfrowanie RSA
Szyfrowanie ciągów Jasypt
Szyfrowanie plików PGP
Szyfruj/odszyfruj tekst
Tajemnica Shamira
Tekst haszowany
Ewaluator matematyki
Kalkulator binarny
Kalkulator napiwków
Konwerter formatów matematycznych
OCR matematyczny
Wizualizator krzywych trygonometrycznych/równań
Edytor Markdown
Epub do Markdown
Generator spisu treści Markdown
Generator tabel Markdown
HTML do Markdownu
Markdown Lorem Ipsum
Markdown do DOCX
Markdown do HTML
Markdown do danych
Markdown na tekst
Podgląd Markdown
Różnica w Markdown
Upiększanie tabeli Markdown
Wklej jako Markdown
tools.markdown-format-converter.name
Czytnik jakości obrazu EXIF/metadanych/GPS/JPEG
GIF do MP4
Inwerter kolorów obrazu
Konwerter HEIC
Konwerter ICO/PNG
Konwerter formatów obrazów
OCRize obrazu i pliku PDF
Obraz do SVG (potrace)
Podgląd SVG
Porównanie obrazów
Przytnij obraz
Rejestrator kamery
Usuń EXIF
Usuń tło obrazu
Zmiana rozmiaru obrazu
Znak wodny
Ekstraktor stron PDF
Ekstraktor tekstu PDF
HTML do PDF
Kompresor PDF
Konkater PDF
Odszyfruj i odblokuj PDF
Pdf Linearize/FastWeb
Sprawdzanie podpisów PDF
Szyfrowanie PDF
Kalkulator odległości geograficznej
Kalkulator procentowy
Kalkulator proporcji obrazu
Twórca benchmarków
CSS/JS Upiększ i pomniejsz
Edytor poleceń CLI
Fałszerz danych
Generator Favicon
Generator GitIgnore
Generator Mailto
Generator atrybutów Gita
Generator meta-grafów Open Graph
Generator parametrów SQL
Generator sekretów Django
Generator skryptów do testów obciążeniowych K6
Generator tabel bazy danych
Javascript Unobfuscator/Unpacker
Json do Protobuf
Json do SQL INSERT
Json do TypeScript
Konstruktor ciągów połączeń z bazą danych
Konwerter cytatów
Konwerter loków
Konwerter plików HEX
Kreator tworzenia baz danych
Minifikator SQL
Podświetlacz kodu/skryptów
Rozdzielacz plików
Tester Picomatch
Tester interfejsu użytkownika Swagger
Tester ucieczki ANSI
Testy API
Timer Pomodoro
Ucieczka ze strun
Upiększacz JavaScript
Upiększanie i formatowanie SQL
Zaciemniacz JavaScript
Ładniejszy ślad stosu
Analizator siły hasła
Autoryzacja SIP
Czyszczenie adresów URL
Czyścik HTML
Dekoder ARPA
Dekoder X-VR-SpamCause
Edytor HTML WYSIWYG
Formater Nginx
Formatter poleceń powłoki
Generator Apache LogRotate
Generator Crontab
Generator DNS BIMI
Generator DNS DKIM
Generator DNS DMARC
Generator DNS PTR
Generator DNS SPF
Generator FStab
Generator HTAccess
Generator Iptables
Generator Option43
Generator Rsync
Generator ULA IPv6
Generator WPA PSK
Generator adresów MAC
Generator adresów URL UTM
Generator gradientów CSS
Generator htpasswd/htaccess
Generator konfiguracji Wireguard
Generator losowych portów
Generator poleceń Curl
Generator poleceń UFW
Generator poleceń wyłączania
Generator symboli zastępczych SVG
HTML do XHTML
HTML do danych
IPv4-6/Zakres IP/CIDR w zakresie IP/CIDR/Maska IP
Informacje o urządzeniu
Kalkulator HDD
Kalkulator RAID
Kalkulator RAID ZPOOL
Kalkulator chmod
Kalkulator niezawodności RAID
Kalkulator podsieci IPv4
Kalkulator podsieci IPv6
Kalkulator podsieci wizualnych
Kalkulator szybkości transferu danych
Kalkulator wykluczeń podsieci IP
Kalkulator zakresu IPv4/6 CIDR do IPv4
Kalkulator zakresu IPv4/6 do CIDR(s)
Kodowanie/dekodowanie ciągów znaków w formacie URL
Kody stanu HTTP
Kontroler DNSBL
Konwerter CSS XPath
Konwerter Punycode
Konwerter adresów IPv4
Konwerter adresów IPv6
Konwerter adresów MAC
Konwerter jednostek CSS
Konwerter kolorów
Konwerter pikseli REM
Koło kolorów
Kreator fragmentów wyszukiwania tekstu w adresie URL
Liczby całkowite dla IPv4/IPv6
Linearizer poleceń powłoki
Lister podsieci IPv4
Lokalizacja geograficzna IP
Minifikator HTML
Mój adres IP
Numery portów
Obraz do CSS
Parser agenta użytkownika
Podstawowy generator uwierzytelniania
Program do pobierania wielu łączy
Rozszerzacz zakresu IPv4
Siła hasła Zxcvbn
Slugify string
Sprawdzanie Whois
Sprawdzanie kontrastu kolorów
Tester mikrofonu
Tester portów TCP/UDP
Testowanie Websocket
Typy MIME
Ucieczka z encji HTML
Upiększacz CSS
Upiększacz HTML
Wyszukiwanie adresu MAC
ZPool Cheatsheet
Zapytania DNS
Zapytania DNS/RDAP Cloudflare
generator wiersza poleceń firewalld
tools.restic-command-generator.name
tools.url-redirection-checker.name
Łapacz adresów URL
Środek dezynfekujący HAS
Świst
Analizator raportów DMARC
Analizator wiadomości MSG programu Outlook
Arkusz informacyjny okablowania RJ45 Cat6
Czytnik plików parkietowych
Dekoder EMV TLV
Dekoder Outlook Safelink
Dekoder adresów URL udostępniania Sharepoint
Dekoder transakcji ETH
Detektor typów plików
Detektor/dekoder zestawu znaków tekstu
Ekstraktor identyfikatorów płatków śniegu
Generator zrzutów TCP
Informacje o kodzie klucza
Kalkulator rezystorów
Koder/dekoder szesnastkowy
Konsola portu szeregowego
Konstruktor adresów URL
Konwerter GZip/Deflate
Konwerter Middle-Endian
Konwerter SMART Raw
Konwerter kodowania MIME
Konwerter liczb zmiennoprzecinkowych
Konwerter obiektów MongoDB ObjectId
Kreator poleceń Nmap
Maskowanie poufnych danych
Parser URL
Parser e-maili
Parser plików cookie
Parser wiadomości zwrotnych
Rozszerzacz krótkich adresów URL
Tester DNS
Tester HTTPS
Tester martwych pikseli
Tester propagacji DNS
Wyszukiwarka właściwości LDAP usługi ActiveDirectory
键盘测试器
Linter TOML
TOML do JSON
TOML do YAML
Czytnik RSVP
Eksporter syren
Estymator tokenów GPT
Formater Unicode
Generator cytowań
Generator poleceń Sed
Generator tekstu ASCII Art
Generator/baner Zalgo
Inteligentna zamiana tekstu i łamanie wierszy
JSON do TOON
Kalkulator Levenshteina
Koder/dekoder tokenów GPT
Kontroler I i L
Konwerter kodu Morse'a
Konwerter listy
Konwerter przypadków
Konwerter run
Konwerter układu klawiatury
Listy Porównaj
Losowy wybór linii
Obraz do grafiki ASCII
Pliki pakietów dla AI
Porównanie czcionek
Rozdzielacz podpowiedzi AI
Różnica tekstu
Schemat struktury folderów
Selektor emoji
Statystyki tekstu
TOON do JSON
Tab do spacji
Tekst na nazwy Unicode
Tekst w alfabecie NATO
Tester wyrażeń regularnych
Tłumacz tekstu
Udostępniający linki społecznościowe
Unicode do GSM-7
Witaj, generatorze.
Wyodrębnij tekst z HTML
Wyraźne słowa
Wyszukiwarka duplikatów linii
Zaciemniacz ciągów
Formater XML
ObjGen do HTML
Tester XPath
Tester XSLT
XML Linter
XML do JSON
Fuzja YAML
Konwerter YAML na JSON
Narzędzie do spłaszczania/odspłaszczania YAML
Upiększanie i formatowanie YAML
YAML do TOML
Arkusz ściągawek Bash
Arkusz ściągawek Markdown
Arkusz ściągawek VIM
Arkusz ściągawek do poleceń ekranowych
Arkusz ściągawek dotyczący składni XPath
Arkusz ściągawek poleceń Tmux
Arkusz ściągawek programu PowerShell
Arkusz ściągawek selektorów CSS
Arkusz ściągawek z popularnymi wyrażeniami regularnymi
Arkusz ściągawek ze składnią JSONPath
Docker Cheatsheet
Docker SWARM ściągawka
Git Semantic Commit Cheatsheet
Jq Cheatsheet
Nano CheatSheet
Zellij Command Cheatsheet
ściągawka Docker Compose
ściągawka Dockerfile
ściągawka Git
ściągawka K8s
ściągawka Nginx
ściągawka Sed
ściągawka do polecenia chmod
ściągawka do wyrażeń regularnych

Arkusz ściągawek Bash

Typowe polecenia powłoki 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