Tool.Yun
أدوات مفيدة للمطورين
CSV إلى JSON
JSON Linter
JSON إلى .env
JSON إلى C#
JSON إلى CSV
JSON إلى Go
JSON إلى MessagePack
JSON إلى TOML
JSON إلى TS
JSON إلى XML
JSON إلى object
JSON إلى البيانات
JSON إلى كيان Java
Json Escaper/Unescaper
Json إلى PHP-Array
Json إلى Python
Json إلى SQL DDL
Json إلى مخطط
PHP-Array إلى JSON
tools.json-patch.name
أداة التحويل الى نص بتنسيق JSON
أداة ترتيب JSON
استعلام Json
تجميل وتنسيق JSON
تحويل Json إلى كود PHP
تحويل ObjGen إلى JSON
حزمة الرسائل إلى JSON
دمج JSON
محرر JSON
محلل حجم JSON
محول JS إلى JSON
محول JSON إلى JS
محول JSON إلى YAML
مصغر JSON
مقارنة JSON
مُختبر Jq/JSONPath
مُسطّح/غير مُسطّح JSON
TOML إلى JSON
تحويل TOML إلى YAML
تومل لينتر
دليل أوامر Tmux
دليل أوامر Zellij
دليل أوامر الشاشة
دليل مختصر لـ PowerShell
ملخص أوامر Git
ورقة الغش Jq
ورقة الغش Markdown
ورقة الغش Nginx
ورقة الغش Sed
ورقة الغش VIM
ورقة الغش الخاصة بـ Docker
ورقة الغش الخاصة بـ Docker SWARM
ورقة الغش الخاصة بـ Dockerfile
ورقة الغش الخاصة بـ Regex
ورقة الغش باش
ورقة الغش لـ Docker Compose
ورقة الغش لقواعد بناء جملة JSONPath
ورقة الغش نانو
ورقة غش Git Semantic Commit
ورقة غش K8s
ورقة غش تعبيرات عادية شائعة
ورقة غش لأمر chmod
ورقة غش لقواعد XPath
ورقة غش لمحددات CSS
XML Linter
XML إلى JSON
تحويل ObjGen إلى HTML
منسق XML
مُختبر XPath
مُختبر XSLT
أداة اختيار البطاقات
رمي النرد
عجلة الحظ
قاذفة العملة
tools.epc-qrcode-generator.name
فك رمز الاستجابة السريعة
قارئ الباركود
مولد الباركود
مولد رمز الاستجابة السريعة (QR Code)
مولد رمز الاستجابة السريعة (QR Code) للشبكة اللاسلكية
مولد رمز الاستجابة السريعة (QR Code) لمعلومات الاتصال
مُتحقق GTIN
أداة البحث عن رموز البلدان وفقًا لمعيار ISO 3166
إرشادات الإضاءة من IES
باحث ISO 639
بحث يونيكود
توافق ترخيص البرنامج
حاسبة اتفاقية مستوى الخدمة
حاسبة سرعة الجري
حاسبة مؤشر كتلة الجسم
شرح أوامر shell
قاموس إلكتروني
محقق أرقام ضريبة القيمة المضافة
محقق لوهن
محلل ومدقق رقم الحساب المصرفي الدولي (IBAN)
محلل ومنسق رقم الهاتف
محول الأحرف الكبيرة من RMB
محول التقويم
محول العملات
مدقق بطاقات الائتمان
مُحقق ومحلل ISBN
أي يوم؟
إنذار الوقت
إنذار كرون/أيام الأسبوع
العد التنازلي
حاسبة TTL
حاسبة الأيام
حاسبة التاريخ والمدة
حاسبة المدة
حاسبة وقت الوصول المتوقع (ETA)
دمج iCal
محلل ملفات ICAL
محول أرقام الأسبوع
محول المنطقة الزمنية
محول الوقت والتاريخ
مقياس الزمن
مولد ICAL
باسيتو/باسرك المحلية
باسيتو/باسرك عام/خاص
بايتات Niceware إلى عبارة مرور
بيكريبت
تجزئة النص
تشفير / فك تشفير النص
تشفير AGE
تشفير PGP
تشفير RSA
تشفير الملفات باستخدام PGP
تشفير سلسلة Jasypt
حاسبة CRC
فك تشفير Ansible Vault Crypt
محلل JWT
محلل SAML
محلل الشهادة/المفتاح
محول شهادة SSL
مشاركة أسرار شامير
مشفر/مفكك شفرة Bech32
مولد HMAC
مولد JWT
مولد المسؤولية الاجتماعية للشركات
مولد زوج المفاتيح Ed25519
مولد زوج مفاتيح ECDSA
مولد زوج مفاتيح RSA
مولد شهادة X509
مولد مفاتيح PGP
مُوقِّع ومُتحقق RSA/DSA/ECDSA
هاشر Argon2
هاشر الملفات
Json إلى Protobuf
Json إلى SQL INSERT
Stacktrace أجمل
أداة إخفاء جافا سكريبت
أداة إنشاء قواعد البيانات
أداة فك تشفير/فك حزم JavaScript
اختبار واجهة المستخدم Swagger
اختبارات API
تجميل وتنسيق SQL
تحويل Json إلى TypeScript
تمييز الأكواد/البرامج النصية
تنسيق وتصغير ملفات CSS/JS
جهاز اختبار الهروب ANSI
جهاز اختبار بيكوماتش
مؤقت بومودورو
محرر أوامر سطر الأوامر
محول الاقتباس
محول التجعيد
محول ملفات HEX
مزور البيانات
مقسم الملفات
منشئ سلسلة اتصال قاعدة البيانات
مولد Mailto
مولد أسرار جانجو
مولد الرموز المفضلة
مولد تجاهل Git
مولد جداول قواعد البيانات
مولد سمات Gita
مولد علامات Open Graph
مولد معلمات SQL
مولد نصوص اختبار التحميل K6
مُحسِّن جافا سكريبت
مُصغّر SQL
هارب الخيط
IPv4-6/IPRange/CIDR في IPRange/CIDR/IPMask
tools.restic-command-generator.name
tools.url-redirection-checker.name
أداة اختبار الميكروفون
أداة اختبار منافذ TCP/UDP
أداة تنزيل الروابط المتعددة
أرقام المنافذ
اختبار Websocket
استعلامات Cloudflare DNS/RDAP
استعلامات DNS
الأعداد الصحيحة إلى IPv4/IPv6
التحقق من عنوان MAC
بينغ
تحديد الموقع الجغرافي عبر IP
تفويض SIP
جهاز فك تشفير ARPA
حاسبة RAID
حاسبة ZPOOL RAID
حاسبة أمر Chmod
حاسبة استبعاد شبكات IP الفرعية
حاسبة الشبكات الفرعية المرئية
حاسبة الشبكات الفرعية لـ IPv4
حاسبة الشبكة الفرعية IPv6
حاسبة القرص الصلب
حاسبة معدل نقل البيانات
حاسبة موثوقية RAID
حاسبة نطاق IP من CIDR إلى IP الإصدار 4/6
حاسبة نطاق IPv4/6 إلى CIDR(s)
عنوان IP الخاص بي
فك تشفير X-VR-SpamCause
قائمة الشبكات الفرعية IPv4
قوة كلمة المرور Zxcvbn
محلل قوة كلمة المرور
محول Punycode
محول عناوين IPv4
محول عنوان IPv6
محول عنوان MAC
مدقق DNSBL
مدقق Whois
موسع نطاقات IPv4
مولد Apache LogRotate
مولد Crontab
مولد DKIM DNS
مولد DNS BIMI
مولد DNS DMARC
مولد FStab
مولد HTAccess
مولد Htpasswd/htaccess
مولد Iptables
مولد Rsync
مولد SPF DNS
مولد WPA PSK
مولد أوامر Curl
مولد أوامر UFW
مولد أوامر الإيقاف
مولد أوامر جدار الحماية
مولد الخيار 43
مولد تكوين Wireguard
مولد عناوين IPv6 ULA
مولد عناوين MAC
مولد مصادقة أساسية
مولد منفذ عشوائي
مولد نظام أسماء النطاقات PTR
مُحَوِّل أوامر الصدفة
مُنسِّق أوامر الصدفة
مُنسّق Nginx
ورقة الغش ZPool
يحتوي على مطهر
أداة تغيير حجم الصورة
إزالة EXIF
إزالة خلفية الصورة
التعرف الضوئي على الحروف للصور وملفات PDF
تحويل GIF إلى MP4
تحويل الصورة إلى SVG (potrace)
عاكس ألوان الصورة
علامة مائية
قارئ جودة الصور EXIF/Metadata/GPS/JPEG
قص الصورة
محول HEIC
محول ICO/PNG
محول صيغ الصور
مسجل الكاميرا
معاينة ملفات SVG
مقارنة الصور
أداة إنشاء أوامر Nmap
أداة اختبار HTTPS
أداة اختبار انتشار نظام أسماء النطاقات (DNS)
أداة اختبار نظام أسماء النطاقات (DNS)
باحث خصائص LDAP في ActiveDirectory
حاسبة المقاومة
دليل مختصر لتوصيل كابلات RJ45 Cat6
فك تشفير EMV TLV
فك تشفير Outlook Safelink
فك تشفير عنوان URL لمشاركة Sharepoint
فك تشفير معاملات ETH
قارئ ملفات الباركيه
قناع البيانات الحساسة
كاشف نوع الملف
كاشف/فك تشفير مجموعة أحرف النص
محلل MSG في Outlook
محلل البريد الإلكتروني
محلل البريد الإلكتروني المرتد
محلل تقارير DMARC
محلل عنوان URL
محلل ملفات تعريف الارتباط
محول GZip/Deflate
محول SMART Raw
محول أرقام الفاصلة العائمة (float number)
محول الطرف الأوسط
محول ترميز MIME
محول معرف كائن MongoDB
مختبر البكسلات الميتة
مستخرج هوية ندفة الثلج
مشفر/فك تشفير سداسي عشري
معلومات رموز المفاتيح
منشئ عناوين URL
مولد TCPDump
مُوسِّع عناوين URL القصيرة
وحدة التحكم بالمنفذ التسلسلي
键盘测试器
كمبيوتر اللياقة البدنية
محول الإضاءة
محول التردد
محول التسارع
محول السرعة
محول الطاقة
محول بادئات النظام الدولي للوحدات
محول درجات الحرارة
محول طاقة الطعام
محول معدل التدفق الحجمي
محول وحدات الحجم
محول وحدات الزاوية
محول وحدات الضغط
محول وحدات الطاقة
محول وحدات الطول
محول وحدات القوة
محول وحدات الكتلة
محول وحدات المساحة
حاسبة المسافة الجغرافية
حاسبة النسب المئوية
حاسبة نسبة العرض إلى الارتفاع
صانع مقاييس الأداء
Excel إلى البيانات
استهلاك الطاقة ونفقاتها في الكمبيوتر
تحويل CSV إلى بيانات
تحويل الملفات إلى Base64
تحويل نص إلى تمثيله الثنائي في UTF-8
تورنت إلى مغناطيس
محول أحرف Unicode إلى كيانات جافا
محول الأرقام الرومانية
محول الأنظمة العددية
محول الإحداثيات الجغرافية
محول الخصائص
محول الوحدات المتعددة
محول تنسيق متغيرات البيئة
محول ديسيبل ميلي واط
محول وحدة تخزين البيانات
مرمز Base64 للنصوص
مولد ULID
مُشفِّر/فك تشفير مصفوفة سداسية عشرية Base64
مُعَيِّر البريد الإلكتروني
نص إلى الترميز الموحد (Unicode)
محول UUID
مولد الأرقام العشوائية
مولد الاختصارات الرقمية (Numeronym)
مولد الرمز البريدي
مولد الرموز
مولد رمز كلمة مرور لمرة واحدة (OTP)
مولد عبارات مرور BIP39
مولد عبارة المرور
مولد كلمة المرور Diceware
مولد معرفات NanoIDs
مولد معرفات UUIDs
JSON إلى TOON
Unicode إلى GSM-7
أداة البحث عن الخطوط المكررة
أنا و ل تشيكر
إحصائيات النص
اختبار التعابير العادية
استخراج النص من HTML
الصورة إلى فن ASCII
انتقل إلى المسافات باستخدام زر Tab
تحويل TOON إلى JSON
تحويل النص إلى أسماء Unicode
تعتيم سلسلة نصية
حاسبة ليفينشتاين
حزم الملفات للذكاء الاصطناعي
قارئ تأكيد الحضور
كلمات مميزة
مترجم النصوص
محدد سطور عشوائية
محول الرونية
محول القوائم
محول تخطيط لوحة المفاتيح
محول حالة الأحرف
محول شفرة مورس
مخطط هيكل المجلد
مشاركة الروابط الاجتماعية
مصدر حورية البحر
مقارنة الخطوط
مقارنة القوائم
مقارنة النصوص
مقدر رمز GPT
مقسم مطالبات الذكاء الاصطناعي
منتقي الرموز التعبيرية
مولد أوامر Sed
مولد الاستشهادات
مولد نص فني ASCII
مولد نصوص Lorem ipsum
مولد/بانر زالغو
مُستبدل النص الذكي وقاطع الأسطر
مُشفِّر/فك تشفير رمز GPT
مُنسّق Unicode
نص إلى أبجدية الناتو
أنواع الوسائط (MIME types)
الصورة إلى CSS
تحويل HTML إلى XHTML
تحويل HTML إلى بيانات
ترميز/فك ترميز السلاسل النصية بصيغة ترميز عنوان URL
تهريب كيانات HTML (HTML Entities)
تهيئة سلسلة نصية كـ Slug
رموز حالة HTTP
صائد عناوين URL
صانع شظايا بحث نص URL
عجلة الألوان
محرر HTML مرئي
محلل وكيل المستخدم
محول CSS XPath
محول الألوان
محول بكسل REM
محول وحدات CSS
مدقق تباين الألوان
معلومات الجهاز
منظف HTML
منظف عناوين URL
مولد تدرج CSS
مولد صور SVG مؤقتة
مولد عنوان URL لـ UTM
مُجمِّل CSS
مُحسِّن HTML
مُصغّر HTML
HTML إلى Markdown
Markdown Lorem Ipsum
Markdown إلى DOCX
Markdown إلى HTML
Markdown إلى بيانات
tools.markdown-format-converter.name
تحويل Markdown إلى نص
تحويل ملفات epub إلى Markdown
لصق كعلامة Markdown
محرر Markdown
معاينة Markdown
مقارنة ماركداون
مولد جداول Markdown
مولد جدول المحتويات Markdown
مُحسِّن جدول Markdown
منشئ تعبيرات Cron
حاسبة الاستهلاك
التعرف الضوئي على الحروف في الرياضيات
حاسبة الإكراميات
حاسبة ثنائية
محلل رياضي
محول صيغ الرياضيات
مُصوِّر المنحنيات المثلثية/المعادلات
Docker Compose إلى Quadlets
Docker Compose إلى ملف .env
Docker compose إلى kubernetes
برنامج Traefik Docker Compose Maker
برنامج تنزيل صور Docker
تشغيل Docker إلى Kubernetes
تشغيل Docker إلى Quadlets
فحص Docker لتشغيل Docker
محول Docker Compose إلى Docker run
محول أوامر Docker run إلى Docker compose
محول تنسيق Docker Compose
ملصقات دوكر بانغولين
مولد التحكم في الوصول المستند إلى الأدوار (RBAC) في Kubernetes
مولد تسميات Dockerfile
مُحقق Docker Compose
تحويل HTML إلى PDF
تشفير PDF
تنسيق PDF Linearize/FastWeb
ضاغط PDF
فك تشفير وفتح ملفات PDF
مدقق تواقيع PDF
مستخرج صفحات PDF
مستخرج نصوص PDF
مُجمّع ملفات PDF
YAML إلى TOML
اندماج YAML
تجميل وتنسيق YAML
محول YAML إلى JSON
مُسطّح/غير مُسطّح YAML

ورقة الغش باش

أوامر 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