Tool.Yun
Удобные инструменты для разработчиков
CSV в JSON
JS в JSON
JSON в .env
JSON в C#
JSON в CSV
JSON в Go
JSON в JS
JSON в Java
JSON в MessagePack
JSON в PHP-массив
JSON в TOML
JSON в TS
JSON в XML
JSON в данные
JSON в схему
JSON для объекта
Json в PHP-код
Json в Python
Json в SQL DDL
Json-запрос
ObjGen в JSON
PHP-массив в JSON
tools.json-patch.name
Анализатор размера JSON
Конвертер JSON в YAML
Конвертер строк JSON
Линтер JSON
Мастер сортировки JSON
Минимизация JSON
Пакет сообщений в JSON
Редактор JSON
Сглаживатель/распрямитель JSON
Слияние JSON
Сравнение JSON
Тестер JQ/JSONPath
Форматирование JSON
Экранирование/разэкранирование JSON
HTML в PDF
PDF-компрессор
Извлекатель страниц PDF
Извлекатель текста из PDF-файлов
Конкатенатор PDF
Линеаризация PDF/FastWeb
Проверка подписи PDF
Расшифровка и разблокировка PDF
Шифрование PDF
ObjGen в HTML
XML ЛИНТЕР
XML в JSON
Тестер XPath
Тестер XSLT
Форматирование XML
HTML WYSIWYG редактор
HTML в XHTML
HTML в данные
HTML-минификатор
MIME типы
URL Fanger
Генератор SVG placeholder
Генератор UTM URL
Генератор градиентов CSS
Изображение в CSS
Информация о устройстве
Кодирование/декодирование URL-форматированных строк
Коды состояния HTTP
Конвертер CSS XPath
Конвертер REM в пиксели
Конвертер единиц CSS
Конвертер цветов
Очиститель URL
Очистка HTML
Парсер User-agent
Преобразование строки (slug)
Проверка контраста цветов
Создатель текстовых фрагментов URL
Форматирование CSS
Форматирование HTML
Цветовой круг
Экранирование HTML сущностей
Генератор BIP39 паролей
Генератор NanoID
Генератор OTP кодов
Генератор PIN-кодов
Генератор UUID
Генератор нумеронимов
Генератор паролей
Генератор паролей Diceware
Генератор случайных чисел
Генератор токенов
Конвертер UUID
Валидатор алгоритма Луна
Валидатор и парсер IBAN
Валидатор и парсер ISBN
Валидатор номеров НДС
Калькулятор SLA
Калькулятор ИМТ
Калькулятор темпа бега
Конвертер RMB в прописной формат
Конвертер валют
Конвертер календарей
Объяснение команды оболочки
Онлайн-словарь
Парсер и форматировщик телефонов
Поиск Unicode
Поиск кодов стран ISO 3166
Поисковик ISO 639
Проверка кредитной карты
Рекомендации по освещению IES
Совместимость лицензий ПО
Cron/Будильник по будням
Будильник времени
Генератор ICAL
Какой день?
Калькулятор ETA
Калькулятор TTL
Калькулятор дат и длительности
Калькулятор длительности
Калькулятор дней
Конвертер даты и времени
Конвертер номеров недель
Конвертер часовых поясов
Объединитель iCal
Парсер ICAL файлов
Таймер обратного отсчета
Хронометр
Docker Compose в Kubernetes
Docker Compose в Quadlets
Docker Compose в файл .env
Docker Inspect для Docker Run
Docker run в Kubernetes
Docker запускается в Quadlets
Traefik Docker Compose Maker
Валидатор Docker Compose
Генератор RBAC для Kubernetes
Генератор меток Dockerfile
Загрузчик образов Docker
Конвертер Docker Compose
Конвертер Docker Compose в Docker run
Конвертер Docker run в Docker compose
Метки Docker Pangolin
Бросок кубика
Выбор карт
Колесо фортуны
Монетка
Калькулятор географического расстояния
Калькулятор процентов
Калькулятор соотношения сторон
Конструктор бенчмарков
GIF в MP4
OCR изображений и PDF
Водяной маркер
Запись с камеры
Изменение размера изображения
Изображение в SVG (potrace)
Инвертор цветов изображения
Конвертер HEIC
Конвертер ICO/PNG
Конвертер форматов изображений
Обрезать изображение
Предварительный просмотр SVG
Сравнение изображений
Удаление EXIF
Удалить фоновое изображение
Чтение EXIF/метаданных изображений
CSV в данные
Excel в данные
Генератор ULID
Калькулятор потребления энергии
Конвертер Base64 Hex массива
Конвертер Torrent в Magnet
Конвертер географических координат
Конвертер единиц хранения данных
Конвертер различных единиц
Конвертер римских цифр
Конвертер свойств
Конвертер символов Unicode в Java-сущности
Конвертер строк base64
Конвертер файлов Base64
Конвертер форматов переменных Env
Конвертер числовых систем
Нормализатор email
Преобразователь дБм мВт
Текст в Unicode
Текст в двоичный ASCII
AGE Криптография
Argon2 Hasher
Bcrypt
Niceware Bytes в парольную фразу
Генератор CSR
Генератор Hmac
Генератор JWT
Генератор PGP-ключей
Генератор RSA ключей
Генератор ключей ECDSA
Генератор ключей Ed25519
Генератор сертификатов X509
Калькулятор CRC
Кодировщик/декодер Bech32
Конвертер SSL-сертификатов
Парсер JWT
Парсер SAML
Парсер сертификатов/ключей
Пасето/ПАСЕРК Локальный
Пасето/ПАСЕРК Публичный/Частный
Подпись и проверка RSA/DSA/ECDSA
Секретный обмен Шамира
Хеширование текста
Хеширование файлов
Шифрование / дешифрование текста
Шифрование PGP
Шифрование RSA
Шифрование строк Jasypt
Шифрование файлов PGP
Шифрование/дешифрование Ansible Vault
Визуализатор тригонометрических уравнений/кривых
Двоичный калькулятор
Конвертер математических форматов
Математический OCR
Оцениватель математических выражений
калькулятор чаевых
Конструктор выражений Cron
Json в Protobuf
Json в SQL INSERT
Json в TypeScript
SQL Minifier
Генератор GitIgnore
Генератор Mailto
Генератор атрибутов Gita
Генератор мета-тегов Open Graph
Генератор параметров SQL
Генератор секретов Джанго
Генератор скриптов для нагрузочного тестирования K6
Генератор таблиц базы данных
Генератор фавиконов
Деобфускатор JavaScript
Конвертер Curl
Конвертер Hex файлов
Конвертер цитат
Конструктор создания баз данных
Конструктор строк подключения к базе данных
Обфускатор JavaScript
Подделка данных
Подсветка кода/скриптов
Преобразователь трассировки стека
Разделитель файлов
Таймер Pomodoro
Тестер API
Тестер Picomatch
Тестер аварийного выхода ANSI
Тестировщик пользовательского интерфейса Swagger
Улучшение и минимизация CSS/JS
Форматирование JavaScript
Форматирование SQL
Экранирование строк
редактор команд CLI
BIMI DNS Generator
DKIM DNS Generator
DNS-запросы
DNS/RDAP-запросы Cloudflare
DNSBL-проверщик
IPv4-6/IPRange/CIDR в IPRange/CIDR/IPMask
IPv4/6 CIDR в диапазон IP
tools.restic-command-generator.name
tools.url-redirection-checker.name
Авторизация SIP
Анализатор надежности пароля
Визуальный калькулятор подсетей
Генератор Apache LogRotate
Генератор Crontab
Генератор DNS DMARC
Генератор DNS-запросов PTR
Генератор FStab
Генератор HTAccess
Генератор Htpasswd/Htaccess
Генератор IPv6 ULA
Генератор Iptables
Генератор MAC-адресов
Генератор Option43
Генератор Rsync
Генератор SPF DNS
Генератор WPA PSK
Генератор базовой аутентификации
Генератор команд Curl
Генератор команд UFW
Генератор команд завершения работы
Генератор конфигураций Wireguard
Генератор случайных портов
Геолокация IP
Декодер ARPA
Декодер X-VR-SpamCause
Диапазон IPv4/6 в CIDR
Исключение подсетей IP
Калькулятор HDD
Калькулятор RAID
Калькулятор ZPOOL RAID
Калькулятор chmod
Калькулятор надежности RAID
Калькулятор подсетей IPv4
Калькулятор подсетей IPv6
Калькулятор скорости передачи данных
Конвертер IPv4 адресов
Конвертер IPv6 адресов
Конвертер MAC-адресов
Конвертер Punycode
Линеаризатор команд оболочки
Множественный загрузчик ссылок
Мой IP-адрес
Надежность пароля Zxcvbn
Номера портов
Пинг
Поиск MAC-адреса
Проверка Whois
Расширитель диапазона IPv4
Санитайзер HAR
Список подсетей IPv4
Тестер WebSocket
Тестер микрофона
Тестер портов TCP/UDP
Форматирование Nginx
Форматировщик команд оболочки
Целые числа в IPv4/IPv6
Шпаргалка по ZPool
генератор командной строки firewalld
DNS-тестер
Nmap Command Builder
Анализатор отчетов DMARC
Анализатор файлов cookie
Генератор TCPDump
Декодер EMV TLV
Декодер Safelink
Декодер ссылок SharePoint
Декодер транзакций ETH
Детектор/декодер текстовых кодировок
Извлечение ID Snowflake
Информация о коде кнопки
Калькулятор резисторов
Конвертер GZip/Deflate
Конвертер Hex
Конвертер MIME-кодировки
Конвертер MongoDB ObjectId
Конвертер SMART Raw
Конвертер среднего порядка байтов
Конвертер чисел с плавающей точкой
Консоль последовательного порта
Конструктор URL-адресов
Маскирование конфиденциальных данных
Определение типа файла
Парсер Outlook MSG
Парсер URL
Парсер email
Парсер возвратов электронной почты
Поиск свойств ActiveDirectory LDAP
Расширитель коротких URL-адресов
Схема подключения кабеля RJ45 Cat6
Тестер HTTPS
Тестер битых пикселей
Тестер распространения DNS
Чтение файлов Parquet
键盘测试器
TOML Linter
TOML в JSON
TOML в YAML
JSON в TOON
RSVP Reader
TOON в JSON
Unicode в GSM-7
Выбор случайных строк
Выбор эмодзи
Генератор Lorem ipsum
Генератор команд Sed
Генератор цитирований
Генератор/баннер Zalgo
Диаграмма структуры папок
Извлечь текст из HTML
Изображение в ASCII-арт
Калькулятор Левенштейна
Кодер/декодер токенов GPT
Конвертер азбуки Морзе
Конвертер раскладок клавиатуры
Конвертер регистра
Конвертер рун
Конвертер списков
Обфускация строки
Отдельные слова
Оценщик токенов GPT
Перевод текста в имена Unicode
Переводчик текстов
Переход к пробелам с помощью клавиши Tab
Поделиться ссылкой в социальных сетях
Поиск дублированных строк
Проверка I и L
Разделитель подсказок ИИ
Рисователь ASCII текста
Сравнение списков
Сравнение текстов
Сравнение шрифтов
Статистика текста
Текст в алфавит НАТО
Тестер регулярных выражений
Умный заменитель текста
Файлы пакета для ИИ
Форматировщик Unicode
Экспортер Mermaid
HTML в Markdown
Markdown Diff
Markdown Lorem Ipsum
Markdown в HTML
Markdown для данных
tools.markdown-format-converter.name
Вставить как Markdown
Генератор оглавления Markdown
Генератор таблиц Markdown
Предварительный просмотр Markdown
Преобразование Epub в Markdown
Преобразование Markdown в текст
Разметка в DOCX
Редактор Markdown
Украшение таблиц Markdown
Конвертер давления
Конвертер единиц длины
Конвертер единиц массы
Конвертер единиц площади
Конвертер единиц силы
Конвертер единиц энергии
Конвертер мощности
Конвертер объема
Конвертер освещенности
Конвертер префиксов СИ
Конвертер температуры
Конвертер углов
Преобразователь объемного расхода
Преобразователь пищевой энергии
Преобразователь скорости
Ускорительный преобразователь
Фитнес-компьютер
Частотный преобразователь
Калькулятор амортизации
Шпаргалка Docker
Шпаргалка Git
Шпаргалка JQ
Шпаргалка Nano
Шпаргалка по Bash
Шпаргалка по CSS-селекторам
Шпаргалка по Docker Compose
Шпаргалка по Docker SWARM
Шпаргалка по Dockerfile
Шпаргалка по JSONPath
Шпаргалка по K8s
Шпаргалка по Markdown
Шпаргалка по Nginx
Шпаргалка по PowerShell
Шпаргалка по Sed
Шпаргалка по VIM
Шпаргалка по XPath
Шпаргалка по командам Tmux
Шпаргалка по командам Zellij
Шпаргалка по командам экрана
Шпаргалка по команде chmod
Шпаргалка по регулярным выражениям
Шпаргалка по регулярным выражениям
Шпаргалка по семантическим коммитам Git
tools.epc-qrcode-generator.name
Валидатор GTIN
Генератор QR-кодов
Генератор QR-кодов для WiFi
Генератор QR-кодов для контактов
Генератор штрих-кодов
Декодер QR-кода
Чтение штрих-кодов
YAML в TOML
Конвертер YAML в JSON
Сглаживатель/распрямитель YAML
Слияние YAML
Форматирование YAML

Шпаргалка по Bash

Общие команды 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