شِل حديث يتعامل مع كل شيء كبيانات منظمة بدلاً من النص الخام. تعمل خطوط الأنابيب مع الجداول والسجلات والقوائم — وليس فقط السلاسل النصية. فكر فيه كشِل يفهم JSON وCSV وTOML وYAML بشكل أصلي.
| المنصة | الأمر |
|---|
| macOS (Homebrew) | brew install nushell |
| Windows (Winget) | winget install nushell |
| Windows (Chocolatey) | choco install nushell |
| Windows (Scoop) | scoop install nu |
| Ubuntu/Debian | sudo apt install nushell (أو التنزيل من إصدارات GitHub) |
| Arch Linux | sudo pacman -S nushell |
| Fedora/RHEL | sudo dnf install nushell |
| Cargo (All platforms) | cargo install nu |
| Nix | nix-env -iA nixpkgs.nushell |
التشغيل: شغل nu من أي شِل لبدء Nushell. التعيين كشِل افتراضي: chsh -s $(which nu)
تمرر خطوط أنابيب Nushell بيانات منظمة (جداول، سجلات، قوائم)، وليس نصًا:
# شِل تقليدي: نص → grep → awk → نص
# Nushell: جدول → where → select → جدول
ls | where size > 1mb | sort-by size --reverse | first 5
أنواع البيانات: سلاسل نصية، أعداد صحيحة، أعداد عشرية، قيم منطقية، تواريخ، مدد، أحجام الملفات، قوائم، سجلات، جداول
| الأمر | الوصف |
|---|
ls | قائمة الدليل كجدول منظم |
ls -la | قائمة جميع الملفات (بما في ذلك المخفية) بتنسيق طويل |
cd path/to/dir | تغيير الدليل |
cp source dest | نسخ الملفات أو الأدلة |
mv source dest | نقل أو إعادة تسمية الملفات |
rm file | إزالة الملفات |
mkdir dirname | إنشاء دليل |
open file.json | فتح الملف كبيانات منظمة (اكتشاف تلقائي للتنسيق) |
open file.csv | فتح CSV كجدول |
open file.toml | فتح TOML كسجل |
save output.json | حفظ إخراج خط الأنابيب إلى ملف |
cat file.txt | عرض محتويات الملف كنص |
ps | إظهار العمليات الجارية كجدول |
sys | إظهار معلومات النظام |
which command | العثور على موقع الأمر |
help commands | قائمة جميع الأوامر المتاحة |
help <command> | إظهار المساعدة لأمر محدد |
| الأمر | الوصف |
|---|
ls | where size > 10mb | تصفية الملفات الأكبر من 10 ميجابايت |
ls | where name =~ "\.rs$" | التصفية بـ regex على اسم الملف |
ls | where type == "dir" | إظهار الأدلة فقط |
ls | where modified > 2day | الملفات المعدلة في آخر يومين |
ls | select name size | إظهار أعمدة الاسم والحجم فقط |
ls | reject type | إزالة عمود النوع |
ls | get name | استخراج عمود الاسم فقط كقائمة |
ls | first 5 | إظهار أول 5 إدخالات |
ls | last 3 | إظهار آخر 3 إدخالات |
ls | skip 10 | تخطي أول 10 إدخالات |
ls | nth 0 2 4 | اختيار الإدخالات حسب الفهرس |
ls | length | عد عدد الإدخالات |
ls | uniq | إزالة الإدخالات المكررة |
| الأمر | الوصف |
|---|
ls | sort-by size | الترتيب حسب الحجم تصاعديًا |
ls | sort-by size --reverse | الترتيب حسب الحجم تنازليًا |
ls | sort-by name | الترتيب أبجديًا |
ls | group-by type | تجميع الإدخالات حسب النوع |
ls | group-by {get name | path parse | get extension} | التجميع حسب امتداد الملف |
| الأمر | الوصف |
|---|
"hello world" | str upcase | التحويل إلى أحرف كبيرة |
"HELLO" | str downcase | التحويل إلى أحرف صغيرة |
" hello " | str trim | إزالة المسافات البيضاء |
"hello" | str contains "ell" | التحقق مما إذا كانت السلسلة تحتوي على سلسلة فرعية |
"hello" | str replace "l" "L" | استبدال الأحرف |
"hello world" | split row " " | تقسيم السلسلة إلى قائمة |
["hello" "world"] | str join ", " | ضم القائمة في سلسلة |
"hello" | str length | الحصول على طول السلسلة |
"hello" | str starts-with "he" | التحقق من بادئة السلسلة |
| الأمر | الوصف |
|---|
open data.json | get field_name | الوصول إلى حقل في JSON |
open data.json | get nested.field | الوصول إلى الحقول المتداخلة |
{name: "Alice", age: 30} | إنشاء سجل |
[1 2 3 4 5] | إنشاء قائمة |
[[name age]; [Alice 30] [Bob 25]] | إنشاء جدول |
$data | to json | التحويل إلى JSON |
$data | to csv | التحويل إلى CSV |
$data | to toml | التحويل إلى TOML |
$data | to yaml | التحويل إلى YAML |
$data | to md | التحويل إلى جدول Markdown |
| الأمر | الوصف |
|---|
[1 2 3 4] | math sum | مجموع القيم |
[1 2 3 4] | math avg | متوسط القيم |
[1 2 3 4] | math max | القيمة القصوى |
[1 2 3 4] | math min | القيمة الدنيا |
[1 2 3 4] | math median | القيمة الوسيطة |
ls | get size | math sum | الحجم الإجمالي للملفات المدرجة |
1 + 2 | الحساب الأساسي |
10 / 3 | القسمة |
2 ** 8 | الأس |
| الأمر | الوصف |
|---|
http get https://api.example.com/data | جلب URL وتحليل الاستجابة |
http post https://api.example.com/data {key: "value"} | طلب POST مع نص |
fetch url | get field | جلب واستخراج حقل محدد |
# المتغيرات (ثابتة افتراضيًا)
let name = "Alice"
let count = 42
let files = (ls | where size > 1mb)
# المتغيرات القابلة للتغيير
mut counter = 0
$counter += 1
# If/else
if $count > 10 { "big" } else { "small" }
# الحلقات
for file in (ls) { print $file.name }
ls | each { |row| $row.name | str upcase }
# الأوامر المخصصة (الدوال)
def greet [name: string] { $"Hello, ($name)!" }
greet "World"
| الملف | الغرض |
|---|
$nu.config-path | التكوين الرئيسي (config.nu) |
$nu.env-path | تكوين البيئة (env.nu) |
# إظهار موقع ملف التكوين
$nu.config-path
# تحرير التكوين
config nu # فتح config.nu في المحرر
config env # فتح env.nu في المحرر
# In config.nu
$env.config = {
show_banner: false # تعطيل شعار الترحيب
table: {
mode: rounded # نمط الجدول: rounded, compact, thin, none
}
completions: {
algorithm: "fuzzy" # إكمال تبويب غامض
}
history: {
max_size: 10000 # إدخالات السجل للاحتفاظ بها
file_format: "sqlite" # sqlite أو plaintext
}
}
# العثور على أكبر الملفات في مشروع
ls **/* | where type == "file" | sort-by size --reverse | first 20
# تحليل واستعلام JSON API
http get https://api.github.com/repos/nushell/nushell | select stargazers_count forks_count
# التحويل بين التنسيقات
open data.csv | to json | save data.json
# تحليل ملفات السجل
open access.log | lines | parse "{ip} - - [{date}] \"{method} {path} {proto}\" {status} {size}"
| where status == "404" | group-by path | sort-by -r
# نظرة عامة سريعة على النظام
sys | get host
ps | sort-by cpu --reverse | first 10
| الميزة | Bash/Zsh | Nushell |
|---|
| نموذج البيانات | تدفقات نصية | جداول منظمة |
| تحليل الإخراج | grep, awk, sed | where, select, get مدمجة |
| معالجة JSON | يتطلب jq | أصلي (open file.json) |
| معالجة الأخطاء | رموز الخروج | رسائل خطأ غنية |
| إكمال Tab | أساسي | واعي بالسياق |
| نظام الأنواع | بلا | أعداد صحيحة، سلاسل، تواريخ، أحجام، إلخ. |
| منحنى التعلم | مألوف | صيغة جديدة للتعلم |
| الأوامر الخارجية | أصلي | مدعوم بالكامل |