تخطَّ إلى المحتوى

ثورة Rust: أدوات سطر الأوامر الحديثة التي تحل محل أدوات Unix الكلاسيكية

· 13 min read · default
rustclilinuxdeveloper-toolsdevopscommand-line

ثورة هادئة تُعيد تشكيل سطر أوامر Unix. واحدة تلو الأخرى، يتم استبدال الأدوات الكلاسيكية المبنية على C والتي خدمتنا لعقود ببدائل Rust أسرع وأكثر أماناً وأكثر سهولة بشكل كبير. الأمر لا يتعلق بالتخلي عن فلسفة Unix. بل يتعلق بتنفيذها بشكل أفضل باستخدام أدوات حديثة ولغة تقضي على فئات كاملة من الأخطاء.

بدأ الاتجاه مع مشاريع فردية مثل ripgrep التي أثبتت أن بديل grep المكتوب بـ Rust يمكن أن يكون أسرع بشكل ملحوظ من GNU grep مع توفير إعدادات افتراضية أفضل أيضاً. ألهم هذا النجاح موجة من التطوير. اليوم، يمكنك استبدال كل أداة أساسية تقريباً في سير عملك اليومي ببديل Rust، والنتيجة هي تجربة طرفية أكثر إنتاجية وأكثر ثراءً بصرياً وأكثر متعة في الاستخدام.

يغطي هذا الدليل أدوات CLI الأساسية لـ Rust، ومزاياها على الأدوات الأصلية، والتكوين العملي لكل منها، وكيفية تجميعها في إعداد طرفي حديث ومتماسك.

لماذا يفوز Rust في مجال أدوات CLI

هيمنة Rust في أدوات CLI الحديثة ليست صدفة. عدة خصائص للغة تجعلها مناسبة بشكل فريد لهذا المجال.

الأداء بدون جمع القمامة. ينتج Rust ثنائيات تُضاهي أو تتفوق على أداء C. لا يوجد وقت تشغيل، لا جامع قمامة، لا تسخين JIT. أدوات CLI تحتاج للبدء فوراً ومعالجة البيانات بالسرعة التي يمكن للقرص تقديمها. Rust يحقق ذلك.

أمان الذاكرة افتراضياً. كانت أدوات C الكلاسيكية مصدراً ثابتاً لثغرات CVE. أدت تجاوزات المخزن المؤقت في أدوات أساسية مثل strings و file و tar إلى استغلالات حقيقية. يُزيل نموذج الملكية في Rust هذه الأخطاء في وقت التجميع. للأدوات التي تعالج مدخلات غير موثوقة (وهي تقريباً جميعها)، هذا مهم.

التزامن بلا خوف. الأجهزة الحديثة لديها أنوية كثيرة، لكن معظم أدوات Unix الكلاسيكية أحادية الخيط. نظام أنواع Rust يجعل التوازي آمناً ومباشراً. أدوات مثل ripgrep و fd تستخدم التنقل المتوازي للمجلدات والبحث افتراضياً، منتجة تسريعات هائلة على قواعد الكود الكبيرة.

مكتبات CLI ممتازة. يوفر كريت clap تحليل الوسائط مع مساعدة مُولّدة تلقائياً وإكمال الصدفة والتحقق. crossterm و ratatui يوفران واجهة مستخدم طرفية عابرة للمنصات. indicatif يوفر أشرطة التقدم. النظام البيئي ناضج وجيد الصيانة.

توزيع سهل. cargo install اسم_الأداة يعمل في كل مكان. لا autoconf، لا تبعيات مكتبات النظام، لا تعارضات الإصدارات. ثنائي ثابت واحد يعمل على أي جهاز Linux أو macOS أو Windows.

عرض الملفات: bat (بديل cat)

bat هو نسخة من cat مع تمييز بناء الجملة وتكامل Git والترقيم التلقائي للصفحات. بمجرد استخدامه، يبدو cat العادي وكأنك تقرأ كوداً على شاشة أحادية اللون.

# Install
cargo install bat
# Or via package manager
brew install bat          # macOS
sudo apt install bat      # Debian/Ubuntu (binary name: batcat)

# Basic usage - syntax highlighting is automatic
bat src/main.rs

# Show specific lines
bat --line-range 10:20 config.yaml

# Show non-printable characters
bat --show-all data.bin

# Plain output (for piping, disables paging and decorations)
bat --plain --pager=never data.csv | head -20

# Use as a man page colorizer
export MANPAGER="sh -c 'col -bx | bat -l man -p'"

# Diff integration
bat --diff old_file.py new_file.py

التكوين موجود في ~/.config/bat/config:

# ~/.config/bat/config
--theme="Catppuccin Mocha"
--style="numbers,changes,header,grid"
--italic-text=always
--map-syntax "*.conf:INI"
--map-syntax ".env*:Dotenv"
--map-syntax "*.dockerfile:Dockerfile"

يتكامل bat مع Git لإظهار علامات التعديل في الهامش. الأسطر التي أُضيفت أو عُدّلت أو حُذفت بالنسبة لفهرس Git تحصل على علامات ملونة. هذا يحوّل عرض الملفات البسيط إلى أداة فورية لمراجعة الكود.

اضبط alias cat='bat --paging=never' في تكوين الصدفة الخاصة بك لاستبدال سلس يحافظ على التوافق مع الأنابيب.

قائمة الملفات: eza (بديل ls)

eza (سابقاً exa) هو بديل حديث لـ ls مع حالة Git والأيقونات وعرض الشجرة وألوان افتراضية معقولة. يُصان بنشاط وأصبح التوصية القياسية بعد أرشفة exa.

# Install
cargo install eza

# Basic listing with icons and Git status
eza --icons --git

# Long format with headers
eza -lh --icons --git --header

# Tree view with depth limit
eza --tree --level=3 --icons

# Sort by modification time, newest first
eza -l --sort=modified --reverse

# Show only directories
eza -D --icons

# Grid view for wide terminals
eza --grid --icons

# Comprehensive alias
alias ll='eza -lah --icons --git --header --group-directories-first'
alias lt='eza --tree --level=3 --icons --git'
alias la='eza -a --icons --git'

يعرض تكامل Git في eza حالة كل ملف مباشرة في القائمة:

Permissions  Size User   Date Modified Git  Name
drwxr-xr-x     - nick   21 May 10:30  -I   src/
.rw-r--r--  4.2k nick   21 May 09:15  M    README.md
.rw-r--r--   890 nick   20 May 14:22  --   Cargo.toml
.rw-r--r--   2.1k nick   21 May 10:30  N    new_module.rs

M تشير إلى ملف معدّل، N تشير إلى ملف جديد غير متتبع، و -- تشير إلى ملف نظيف. هذه الرؤية لحالة Git على مستوى نظام الملفات تلغي التنقل المستمر بين ls و git status.

البحث عن الملفات: fd (بديل find)

fd هو بديل سريع وسهل الاستخدام لـ find. إعداداته الافتراضية تتطابق مع ما تريده فعلاً 95% من الوقت: أنماط regex، وعي .gitignore، حساسية ذكية لحالة الأحرف، وتنفيذ متوازٍ.

# Install
cargo install fd-find

# Find files by name (regex by default)
fd "\.rs$"

# Case-insensitive search
fd -i readme

# Find by extension
fd -e py

# Find and execute a command
fd -e log --exec gzip {}

# Parallel execution with all results
fd -e test.js --exec-batch prettier --write

# Exclude directories
fd -E node_modules -E target "config"

# Find only directories
fd --type d "test"

# Find files modified in the last 24 hours
fd --changed-within 1d

# Show results with full details
fd -e rs --exec-batch eza -l

# Find files larger than 10MB
fd --size +10m

# Find empty files
fd --type f --type empty

مقارنة الأداء على مستودع أحادي كبير (100,000 ملف):

# GNU find
time find . -name "*.rs" -type f
# real    0m0.520s

# fd
time fd -e rs
# real    0m0.087s

# fd is ~6x faster due to parallel directory traversal
# and automatic .gitignore filtering (skips target/, node_modules/, etc.)

وعي fd بـ .gitignore هو ميزته القاتلة لعمل التطوير. في مشروع نموذجي، يُعيد find آلاف النتائج من node_modules و target و .git ومخرجات البناء. يتخطى fd كل هذه افتراضياً، عارضاً فقط الملفات التي تهمك.

البحث في المحتوى: ripgrep (بديل grep)

ripgrep (rg) هي الأداة التي بدأت ثورة CLI في Rust. إنها باستمرار أسرع أداة بحث في الكود متاحة، مع إعدادات افتراضية ذكية تجعلها منتجة فوراً.

# Install
cargo install ripgrep

# Basic search (recursive by default, respects .gitignore)
rg "fn main"

# Search specific file types
rg -t rust "async fn"
rg -t py "import torch"

# Search with context lines
rg -C 3 "TODO|FIXME|HACK"

# Count matches per file
rg -c "unwrap()"

# Replace text (preview)
rg "old_function" --replace "new_function"

# Search compressed files
rg -z "error" logs.gz

# Fixed strings (no regex interpretation)
rg -F "user.name?.first"

# Multiline search
rg -U "struct.*\{[^}]*name.*\}"

# Search hidden files and ignored files
rg --hidden --no-ignore "SECRET_KEY"

# Output as JSON for programmatic use
rg --json "pattern" | python3 process_results.py

# Files that do NOT match
rg --files-without-match "Copyright" --type rust

يستخدم ripgrep أوتوماتا محدودة لمطابقة التعبيرات النمطية، مما يعني أن له أداء متوقع O(n) على جميع المدخلات. أنماط regex المرضية التي تسبب تراجعاً كارثياً في الأدوات المبنية على PCRE تعمل في وقت خطي مع ripgrep.

التكوين عبر ~/.config/ripgrep/config:

--smart-case
--hidden
--glob=!.git
--glob=!node_modules
--glob=!target
--colors=match:fg:magenta
--colors=match:style:bold

استخدام القرص: dust (بديل du)

dust يوفر نظرة عامة بصرية فورية لاستخدام القرص مع واجهة رسم بياني شريطي تجعل المجلدات الكبيرة واضحة فوراً.

# Install
cargo install du-dust

# Basic usage (shows visual bars)
dust

# Limit depth
dust -d 2

# Show apparent size (not disk usage)
dust -s

# Reverse sort (smallest first)
dust -r

# Ignore specific directories
dust -X node_modules -X .git

# Show only N items
dust -n 15

# Show full file paths
dust -p

# Analyze a specific directory
dust -d 3 /var/log

مخرجات نموذجية:

  4.2G ┌── node_modules                │████████████████████████████ │  52%
  1.8G ├── target                      │████████████               │  22%
  890M ├── dist                        │██████                     │  11%
  420M ├── .git                        │███                        │   5%
  380M ├── data                        │██                         │   5%
  180M ├── assets                      │█                          │   2%
   92M ├── src                         │                           │   1%
   45M ├── docs                        │                           │   1%
  8.0G   ┌── .                         │████████████████████████████████│ 100%

تجيب هذه المخرجات البصرية على سؤال "أين يذهب مساحة القرص؟" بنظرة واحدة، مستبدلة سلسلة du -sh * | sort -h النموذجية.

عرض العمليات: procs (بديل ps)

procs يستبدل ps بمعاين عمليات ملون وغني بالميزات يتضمن التعرف على حاويات Docker وعرض الشجرة.

# Install
cargo install procs

# Basic process list
procs

# Search by process name
procs firefox

# Tree view
procs --tree

# Watch mode (refresh every 2 seconds)
procs --watch

# Show specific columns
procs --insert TcpPort,Docker

# Sort by memory usage
procs --sortd mem

# Show only processes by current user
procs --or "user=$(whoami)"

يكتشف procs تلقائياً حاويات Docker ويُظهر لأي حاوية تنتمي العملية. كما يربط منافذ TCP/UDP بالعمليات دون الحاجة لامتيازات root، مستبدلاً أنماط lsof -i أو ss -tlnp الشائعة.

مراقبة النظام: bottom (بديل top)

bottom (btm) هو مراقب نظام عابر للمنصات مع واجهة TUI غنية تتضمن أدوات CPU والذاكرة والشبكة والقرص والحرارة والعمليات.

# Install
cargo install bottom

# Launch with default layout
btm

# Launch with specific refresh rate
btm --rate 500

# Basic mode (simpler, top-like interface)
btm --basic

# Battery widget
btm --battery

# Configuration file
btm --config ~/.config/bottom/bottom.toml

التكوين في ~/.config/bottom/bottom.toml:

[flags]
rate = 1000
dot_marker = false
temperature_type = "c"
color = "gruvbox"

[colors]
table_header_color = "LightBlue"
widget_title_color = "Gray"

[[row]]
  [[row.child]]
    type = "cpu"
[[row]]
  ratio = 2
  [[row.child]]
    type = "mem"
  [[row.child]]
    type = "net"
[[row]]
  [[row.child]]
    type = "proc"
    default = true

اختصارات لوحة المفاتيح في bottom: dd لإنهاء عملية، / للبحث، t لتبديل وضع الشجرة، Tab لتغيير تركيز الأداة. يبدو وكأنه IDE حديث لمراقبة النظام.

مقارنة الفروقات: difftastic (بديل diff)

difftastic يفهم بنية الكود. بدلاً من مقارنة الأسطر، يحلل الملفات إلى أشجار بناء الجملة ويقارن الأشجار. النتيجة هي فروقات تُظهر ما تغيّر فعلاً دلالياً، وليس فقط أي أسطر عُدّلت.

# Install
cargo install difftastic

# Compare two files
difft old.py new.py

# Use as git diff tool
git config --global diff.tool difftastic
git config --global difftool.difftastic.cmd 'difft "$LOCAL" "$REMOTE"'
git config --global difftool.prompt false

# Use inline with git diff
export GIT_EXTERNAL_DIFF=difft
git diff HEAD~1

# Limit display width
difft --display inline old.rs new.rs

# Color output control
difft --color always file_a.go file_b.go

يدعم difftastic أكثر من 50 لغة برمجة. عندما تنقل دالة من مكان إلى آخر في ملف، يُظهرها difftastic كنقل بدلاً من حذف مع إضافة. عندما تُعيد تسمية متغير في دالة، يُبرز فقط إعادة التسمية، وليس كل سطر يظهر فيه المتغير.

هذا الفهم الهيكلي يجعل مراجعة الكود أكثر كفاءة بشكل كبير. نسبة الإشارة إلى الضوضاء في الفروقات تتحسن بمرتبة من الحجم لعمليات إعادة الهيكلة.

قياس الأداء: hyperfine

hyperfine هي أداة قياس أداء من سطر الأوامر توفر تحليلاً إحصائياً وعمليات تسخين ومسح المعلمات والتصدير إلى تنسيقات متعددة.

# Install
cargo install hyperfine

# Basic benchmark
hyperfine 'fd -e py'

# Compare two commands
hyperfine 'find . -name "*.py"' 'fd -e py'

# With warmup runs
hyperfine --warmup 5 'rg pattern large_file.txt'

# Parameter sweep
hyperfine --parameter-scan threads 1 8 'parallel -j {threads} process_file ::: *.dat'

# Export results
hyperfine --export-markdown results.md 'command1' 'command2'
hyperfine --export-json results.json 'command1' 'command2'

# Set minimum number of runs
hyperfine --min-runs 20 'my_program'

# Prepare and cleanup commands
hyperfine \
  --prepare 'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' \
  'grep -r pattern /usr/src/linux' \
  'rg pattern /usr/src/linux'

# Shell selection
hyperfine --shell=none './my_binary --flag'

مخرجات نموذجية:

Benchmark 1: find . -name "*.py" -type f
  Time (mean +/- sd):     512.3 ms +/-  24.1 ms    [User: 89.2 ms, System: 421.1 ms]
  Range (min ... max):    478.9 ms ... 556.7 ms    10 runs

Benchmark 2: fd -e py
  Time (mean +/- sd):      86.4 ms +/-   5.3 ms    [User: 152.8 ms, System: 298.4 ms]
  Range (min ... max):     79.1 ms ...  95.2 ms    34 runs

Summary
  fd -e py ran 5.93 +/- 0.46 times faster than find . -name "*.py" -type f

تحسينات الصدفة: starship و zoxide و atuin

ثلاث أدوات تحوّل الصدفة نفسها.

Starship هو موجّه عابر للصدفات، سريع وبسيط وقابل للتخصيص لا نهائياً:

# Install
curl -sS https://starship.rs/install.sh | sh

# Add to shell
echo 'eval "$(starship init bash)"' >> ~/.bashrc
echo 'eval "$(starship init zsh)"' >> ~/.zshrc

التكوين في ~/.config/starship.toml:

[character]
success_symbol = "[>](bold green)"
error_symbol = "[>](bold red)"

[directory]
truncation_length = 3
truncation_symbol = ".../"

[git_branch]
symbol = " "

[rust]
symbol = " "

[python]
symbol = " "

[nodejs]
symbol = " "

[docker_context]
symbol = " "

zoxide هو cd أذكى يتعلم عاداتك:

# Install
cargo install zoxide

# Initialize
eval "$(zoxide init bash)"

# Usage
z projects          # Jump to most-used directory matching "projects"
z src test          # Jump to directory matching both "src" and "test"
zi                  # Interactive selection with fzf

atuin يستبدل سجل الصدفة بقاعدة بيانات SQLite ومزامنة وبحث ضبابي:

# Install
cargo install atuin

# Initialize
eval "$(atuin init bash)"

# Search history (Ctrl+R replacement)
# Shows full-text fuzzy search with timestamps,
# directory context, and exit codes

# Import existing history
atuin import auto

# Search with filters
atuin search --after "2026-05-01" --exit 0 "docker"

سير عمل Git: lazygit و delta

lazygit يوفر واجهة طرفية كاملة لعمليات Git:

# Install
go install github.com/jesseduffield/lazygit@latest
# Or
brew install lazygit

# Launch in current repo
lazygit

# Key bindings within lazygit:
# Space     - stage/unstage file
# c         - commit
# p         - push
# P         - pull
# b         - branch operations
# m         - merge
# r         - rebase interactively

delta هو مُرقّم صفحات مع تمييز بناء الجملة لمخرجات Git و diff و grep:

# Install
cargo install git-delta

# Configure in ~/.gitconfig
# [core]
#     pager = delta
# [interactive]
#     diffFilter = delta --color-only
# [delta]
#     navigate = true
#     side-by-side = true
#     line-numbers = true
#     syntax-theme = Catppuccin-mocha

بناء إعداد طرفي حديث

إليك تكوين صدفة كامل يدمج كل هذه الأدوات:

# ~/.bashrc or ~/.zshrc - Modern Rust CLI toolkit

# Core replacements
alias cat='bat --paging=never'
alias ls='eza --icons --group-directories-first'
alias ll='eza -lah --icons --git --header --group-directories-first'
alias lt='eza --tree --level=3 --icons --git'
alias la='eza -a --icons --git'
alias find='fd'
alias grep='rg'
alias du='dust'
alias ps='procs'
alias top='btm'
alias diff='difft'

# Git enhancements
alias lg='lazygit'
export GIT_EXTERNAL_DIFF=difft

# Shell enhancements
eval "$(starship init bash)"
eval "$(zoxide init bash)"
eval "$(atuin init bash)"

# bat as man pager
export MANPAGER="sh -c 'col -bx | bat -l man -p'"

# ripgrep config
export RIPGREP_CONFIG_PATH="$HOME/.config/ripgrep/config"

# fzf integration with fd
export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git'
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude .git'

تثبيت كل شيء بأمر واحد:

cargo install bat eza fd-find ripgrep du-dust procs bottom difftastic hyperfine zoxide atuin git-delta starship

مقارنة الأداء: تطبيقات Rust مقابل C

تأتي مزايا أداء أدوات CLI الخاصة بـ Rust من ثلاثة مصادر: إعدادات افتراضية أفضل (تجاهل الملفات غير ذات الصلة)، والتوازي، والخوارزميات الحديثة. إليك معايير تمثيلية على مستودع أحادي يضم 200,000 ملف:

المهمة الأداة الكلاسيكية أداة Rust التسريع
البحث عن ملفات بالامتداد find 520ms fd 87ms 6.0x
بحث نص تكراري grep -r 4.2s rg 0.31s 13.5x
تحليل استخدام القرص du -sh 1.8s dust 0.9s 2.0x
قائمة الملفات (مجلد كبير) ls -la 340ms eza -la 290ms 1.2x

أكبر التسريعات تأتي من أدوات البحث (ripgrep, fd) لأنها تجمع بين التوازي والتصفية الذكية للملفات. التسريعات الأصغر في الأدوات الأبسط (eza مقابل ls) تعكس أن الأدوات الأصلية كانت بالفعل محسنة جيداً لمهمتها الأبسط.

لاحظ أن بعض المعايير ليست مقارنات متكافئة. fd أسرع من find جزئياً لأنه يتخطى الملفات المطابقة لـ .gitignore افتراضياً. عندما تجبر fd على البحث في كل شيء (fd --no-ignore --hidden)، تتقلص الفجوة. النقطة هي أن السلوك الافتراضي لأدوات Rust يتطابق مع ما يريده المطورون فعلاً، مما يجعلها أسرع عملياً حتى عندما يكون معدل النقل الخام مماثلاً.

تمثل هذه الأدوات تحسيناً حقيقياً في تجربة المطور اليومية. إنها ليست تجريبية. إنها مستقرة وجيدة الصيانة ومستخدمة في الإنتاج من قبل مؤسسات تتراوح من الشركات الناشئة إلى شركات التكنولوجيا الكبرى. إذا كنت لا تزال تستخدم coreutils الكلاسيكية، جرّب بدائل Rust لمدة أسبوع. معظم الناس لا يعودون أبداً.