صدفة حديثة للبيانات المهيكلة تتعامل مع مخرجات الأوامر كجداول وتدعم الأنابيب مع بيانات مصنفة، والتصفية، والبرمجة النصية عبر الأنظمة.
| أمر | وصف |
|---|
brew install nushell | التثبيت على macOS باستخدام Homebrew |
cargo install nu | التثبيت من crates.io |
winget install nushell | التثبيت على Windows باستخدام winget |
sudo apt install nushell | التثبيت على Debian/Ubuntu |
pacman -S nushell | التثبيت على Arch Linux |
nix-env -i nushell | التثبيت على NixOS |
nu | تشغيل Nushell |
nu --version | عرض الإصدار المثبت |
nu -c "ls" | تنفيذ أمر واحد والخروج |
nu script.nu | تنفيذ ملف سكريبت Nushell |
chsh -s /usr/bin/nu | تعيين Nushell كصدفة افتراضية |
| أمر | وصف |
|---|
sys | عرض معلومات النظام الكاملة |
sys host | عرض تفاصيل المضيف (الاسم، نظام التشغيل، النواة) |
sys mem | عرض استخدام الذاكرة |
sys cpu | عرض معلومات المعالج |
sys disks | عرض استخدام الأقراص |
sys net | عرض واجهات الشبكة |
sys temp | عرض مستشعرات درجة الحرارة |
date now | عرض التاريخ والوقت الحالي |
date now | format date "%Y-%m-%d" | تنسيق التاريخ الحالي |
$nu.home-path | عرض مسار المجلد الرئيسي |
$nu.os-info | عرض تفاصيل نظام التشغيل |
| أمر | وصف |
|---|
ls | عرض الملفات كجدول مهيكل |
ls -l | عرض مفصل مع التفاصيل |
ls -a | عرض الملفات المخفية |
ls **/*.rs | بحث متكرر عن ملفات Rust |
ls | where size > 1mb | تصفية الملفات الأكبر من 1 ميجابايت |
ls | where type == dir | تصفية المجلدات فقط |
ls | sort-by modified -r | الترتيب حسب تاريخ التعديل (الأحدث أولاً) |
ls | sort-by size -r | الترتيب حسب الحجم تنازلياً |
ls | get name | الحصول على عمود أسماء الملفات فقط |
| أمر | وصف |
|---|
ps | عرض العمليات كجدول |
ps | where cpu > 10 | البحث عن العمليات التي تستخدم أكثر من 10% من المعالج |
ps | where name =~ "node" | البحث عن العمليات حسب نمط الاسم |
ps | sort-by mem -r | first 10 | أعلى 10 عمليات حسب استخدام الذاكرة |
ps | where pid == 1234 | البحث عن عملية حسب معرف العملية |
| أمر | وصف |
|---|
help | عرض المساعدة العامة |
help commands | عرض قائمة جميع الأوامر المتاحة |
help ls | عرض المساعدة لأمر محدد |
help operators | عرض قائمة العوامل المتاحة |
help escapes | عرض تسلسلات الهروب النصية |
| أمر | وصف |
|---|
ls | select name size | تحديد أعمدة محددة |
ls | reject modified | إزالة أعمدة محددة |
ls | rename filename filesize | إعادة تسمية الأعمدة |
ls | first 5 | الحصول على أول 5 صفوف |
ls | last 3 | الحصول على آخر 3 صفوف |
ls | skip 10 | تخطي أول 10 صفوف |
ls | length | حساب عدد الصفوف |
ls | reverse | عكس ترتيب الصفوف |
ls | shuffle | ترتيب عشوائي للصفوف |
ls | flatten | تسطيح الجداول المتداخلة |
ls | columns | عرض أسماء الأعمدة |
| أمر | وصف |
|---|
ls | where size > 1mb | التصفية حسب المقارنة |
ls | where name =~ "test" | التصفية حسب مطابقة التعبير النمطي |
ls | where name starts-with "src" | التصفية حسب البادئة |
ls | where name ends-with ".md" | التصفية حسب اللاحقة |
ls | where type in ["file" "dir"] | التصفية حسب قائمة القيم |
ls | sort-by size -r | الترتيب تنازلياً |
ls | sort-by name -i | الترتيب بدون حساسية لحالة الأحرف |
ls | uniq-by type | إزالة التكرارات حسب العمود |
ls | group-by type | تجميع الصفوف حسب قيمة العمود |
| أمر | وصف |
|---|
ls | each { |it| $it.name } | تحويل كل صف |
ls | par-each { |it| $it.name } | التحويل بالتوازي |
ls | update size { |it| $it.size / 1kb } | تحديث قيم العمود |
ls | insert label { |it| $it.name + "-file" } | إضافة عمود جديد |
ls | reduce -f 0 { |it, acc| $acc + $it.size } | تجميع القيم |
ls | enumerate | إضافة عمود فهرس |
ls | window 3 | نافذة منزلقة من 3 صفوف |
ls | zip [1 2 3] | دمج مع قائمة أخرى |
ls | transpose | تبديل الصفوف والأعمدة |
| أمر | وصف |
|---|
42 | عدد صحيح |
3.14 | عدد عشري |
"hello" | نص |
true / false | قيمة منطقية |
null | قيمة فارغة |
2024-01-15 | تاريخ |
5sec / 3min / 2hr | مدة زمنية |
1kb / 5mb / 2gb | حجم ملف |
0b1010 | قيمة ثنائية |
0xff | قيمة سداسية عشرية |
| أمر | وصف |
|---|
[1 2 3] | قائمة |
[1 2 3] | append 4 | إضافة عنصر في النهاية |
[1 2 3] | prepend 0 | إضافة عنصر في البداية |
{name: "Alice", age: 30} | سجل |
{a: 1} | merge {b: 2} | دمج السجلات |
[[name age]; ["Alice" 30] ["Bob" 25]] | جدول مباشر |
0..9 | نطاق (من 0 إلى 9) |
0..<9 | نطاق حصري (من 0 إلى 8) |
0..2..10 | نطاق بخطوة (0، 2، 4، 6، 8، 10) |
| أمر | وصف |
|---|
"42" | into int | تحويل نص إلى عدد صحيح |
"3.14" | into float | تحويل نص إلى عدد عشري |
42 | into string | تحويل عدد إلى نص |
"true" | into bool | تحويل نص إلى قيمة منطقية |
"2024-01-15" | into datetime | تحويل نص إلى تاريخ ووقت |
1024 | into filesize | تحويل عدد إلى حجم ملف |
5 | into duration --unit sec | تحويل عدد إلى مدة زمنية |
42 | into binary | تحويل عدد إلى ثنائي |
[1 2 3] | into record | تحويل قائمة إلى سجل |
{a: 1} | into record | التحويل إلى سجل |
| أمر | وصف |
|---|
open data.json | فتح وتحليل ملف JSON |
open data.csv | فتح وتحليل ملف CSV |
open data.yaml | فتح وتحليل ملف YAML |
open data.toml | فتح وتحليل ملف TOML |
open data.xml | فتح وتحليل ملف XML |
open data.tsv | فتح وتحليل ملف TSV |
open data.sqlite | فتح قاعدة بيانات SQLite |
open file.txt | فتح كنص عادي |
open data.json | get users | فتح والتنقل داخل البيانات |
| أمر | وصف |
|---|
"hello" | save hello.txt | حفظ نص في ملف |
ls | save files.json | حفظ جدول كملف JSON |
ls | save files.csv | حفظ جدول كملف CSV |
ls | save files.yaml | حفظ جدول كملف YAML |
open data.json | to csv | تحويل JSON إلى CSV |
open data.csv | to json | تحويل CSV إلى JSON |
open data.json | save data.yaml | التحويل بين الصيغ |
open data.csv | save -f data.csv | الكتابة فوق ملف موجود |
"line1\nline2" | save -a log.txt | الإضافة إلى ملف |
| أمر | وصف |
|---|
open file.txt | lines | تقسيم الملف إلى أسطر |
open file.txt | lines | length | حساب الأسطر في الملف |
open file.csv | where status == "active" | تصفية صفوف CSV |
open file.json | select name email | اختيار حقول من JSON |
open file.json | to yaml | save file.yaml | تحويل JSON إلى YAML |
glob "**/*.md" | each { |f| open $f } | فتح جميع الملفات المطابقة |
| أمر | وصف |
|---|
"hello world" | str upcase | التحويل إلى أحرف كبيرة |
"HELLO" | str downcase | التحويل إلى أحرف صغيرة |
"hello" | str capitalize | تكبير الحرف الأول |
" hello " | str trim | إزالة المسافات الزائدة |
"hello" | str trim --char "h" | إزالة حرف محدد |
"hello" | str reverse | عكس النص |
| أمر | وصف |
|---|
"hello world" | str replace "world" "nu" | استبدال أول تطابق |
"aabaa" | str replace -a "a" "x" | استبدال جميع التطابقات |
"hello world" | str replace -r '\w+' 'word' | الاستبدال باستخدام التعبير النمطي |
"hello world" | str contains "world" | التحقق مما إذا كان النص يحتوي على |
"hello world" | str starts-with "hello" | التحقق من البادئة |
"hello world" | str ends-with "world" | التحقق من اللاحقة |
"hello world" | str index-of "world" | إيجاد موضع النص الفرعي |
| أمر | وصف |
|---|
"hello world" | split row " " | التقسيم حسب الفاصل |
"a,b,c" | split row "," | تقسيم نص بنمط CSV |
"hello" | split chars | التقسيم إلى أحرف |
["hello" "world"] | str join " " | دمج قائمة في نص |
["a" "b" "c"] | str join "," | الدمج بفاصلة |
"hello" | str length | الحصول على طول النص |
"hello world" | str substring 0..5 | استخراج نص فرعي |
# الاستيفاء الأساسي
let name = "World"
$"Hello, ($name)!"
# استيفاء التعبيرات
$"Total: (1 + 2 + 3)"
# نصوص متعددة الأسطر
$"Line 1
Line 2
Line 3"
# نصوص خام (بدون هروب)
r#'C:\Users\path'#
| أمر | وصف |
|---|
def greet [name: string] { $"Hello, ($name)!" } | أمر مخصص أساسي |
def add [a: int, b: int] -> int { $a + $b } | أمر مع تعليقات الأنواع |
def greet [name = "World"] { ... } | أمر مع معامل افتراضي |
def "git branches" [] { git branch | lines } | اسم بنمط الأمر الفرعي |
def --wrapped cmd [...rest] { ... } | قبول أي معاملات إضافية |
| أمر | وصف |
|---|
let x = 42 | متغير غير قابل للتغيير |
mut x = 0; $x = $x + 1 | متغير قابل للتغيير |
const PI = 3.14159 | ثابت وقت الترجمة |
if $x > 0 { "pos" } else { "neg" } | تعبير شرطي |
match $x { 1 => "one", 2 => "two", _ => "other" } | مطابقة الأنماط |
for item in [1 2 3] { print $item } | حلقة for |
while $x < 10 { $x = $x + 1 } | حلقة while |
loop { if $x > 10 { break }; $x += 1 } | حلقة لا نهائية مع break |
try { risky_op } catch { "failed" } | معالجة الأخطاء |
# دالة مع معامل علم
def greet [
name: string # الاسم للتحية
--excited (-e) # استخدام علامة تعجب
] {
if $excited {
$"Hello, ($name)!"
} else {
$"Hello, ($name)."
}
}
# دالة مع معاملات متبقية
def sum [...nums: int] -> int {
$nums | math sum
}
# دالة إدخال الأنبوب
def double-all [] {
each { |x| $x * 2 }
}
# الاستخدام: [1 2 3] | double-all
| أمر | وصف |
|---|
[1 2 3 4 5] | math sum | مجموع القيم |
[1 2 3 4 5] | math avg | متوسط القيم |
[1 2 3 4 5] | math min | القيمة الدنيا |
[1 2 3 4 5] | math max | القيمة القصوى |
[1 2 3 4 5] | math median | الوسيط |
[1 2 3 4 5] | math stddev | الانحراف المعياري |
[1 2 3 4 5] | math variance | التباين |
[1 2 3] | math product | حاصل ضرب القيم |
10 | math abs | القيمة المطلقة |
10 | math sqrt | الجذر التربيعي |
2 | math round -p 2 | التقريب إلى دقة محددة |
10 | math log 2 | اللوغاريتم بأساس 2 |
| أمر | وصف |
|---|
http get https://api.example.com/data | طلب GET |
http post https://api.example.com/data {name: "test"} | طلب POST مع JSON |
http put https://api.example.com/data/1 {name: "updated"} | طلب PUT |
http delete https://api.example.com/data/1 | طلب DELETE |
http get url --headers [Accept application/json] | GET مع ترويسات مخصصة |
http get url | get data | GET واستخراج حقل |
port 8080 | التحقق مما إذا كان المنفذ مستخدماً |
# جلب ومعالجة API بصيغة JSON
let users = (http get "https://jsonplaceholder.typicode.com/users")
$users | select name email | first 5
# POST مع ترويسات وجسم
http post "https://api.example.com/items" {
name: "New Item"
price: 29.99
} --headers [Authorization $"Bearer ($env.API_TOKEN)"]
| أمر | وصف |
|---|
$nu.config-path | عرض مسار ملف التكوين |
$nu.env-path | عرض مسار ملف تكوين البيئة |
$nu.default-config-dir | عرض مجلد التكوين |
config nu | فتح التكوين في المحرر |
config env | فتح تكوين البيئة في المحرر |
| أمر | وصف |
|---|
$env.config.show_banner = false | تعطيل شعار بدء التشغيل |
$env.config.buffer_editor = "vim" | تعيين المحرر لـ Ctrl+O |
$env.config.history.file_format = "sqlite" | استخدام سجل SQLite |
$env.config.history.max_size = 100_000 | تعيين الحد الأقصى لإدخالات السجل |
$env.config.completions.external.enable = true | تفعيل الإكمال الخارجي |
$env.config.cursor_shape.emacs = "line" | تعيين شكل المؤشر |
$env.config.footer_mode = "25" | عرض التذييل للجداول الكبيرة |
$env.config.table.mode = "rounded" | تعيين نمط حدود الجدول |
| أمر | وصف |
|---|
$env.PATH = ($env.PATH | prepend "/usr/local/bin") | الإضافة إلى PATH |
$env.PATH = ($env.PATH | append "~/.local/bin") | الإلحاق بـ PATH |
$env.EDITOR = "vim" | تعيين متغير البيئة |
alias ll = ls -l | إنشاء اختصار للأمر |
source ~/.config/nushell/custom.nu | تحميل تكوين إضافي |
# env.nu — تكوين البيئة
$env.PATH = ($env.PATH | split row (char esep)
| prepend "/usr/local/bin"
| prepend ($env.HOME | path join ".cargo" "bin")
| append ($env.HOME | path join "go" "bin")
)
$env.EDITOR = "nvim"
$env.VISUAL = "nvim"
$env.PAGER = "less"
# config.nu — تكوين الصدفة
$env.config = {
show_banner: false
buffer_editor: "nvim"
table: {
mode: rounded
index_mode: auto
trim: {
methodology: wrapping
wrapping_try_keep_words: true
}
}
history: {
file_format: "sqlite"
max_size: 100_000
sync_on_enter: true
isolation: false
}
completions: {
case_sensitive: false
quick: true
partial: true
algorithm: "prefix"
external: {
enable: true
max_results: 100
}
}
}
| أمر | وصف |
|---|
module greet { export def hello [] { "hi" } } | تعريف وحدة مضمنة |
use greet hello | استيراد أمر من وحدة |
use greet * | استيراد الكل من وحدة |
use utils.nu | الاستيراد من ملف وحدة |
overlay use spam | تفعيل طبقة |
overlay hide spam | إلغاء تفعيل طبقة |
overlay list | عرض الطبقات النشطة |
# file: utils.nu
export def "str kebab" [] {
$in | str downcase | str replace -a " " "-"
}
export def "str title" [] {
$in | split row " "
| each { |w| $w | str capitalize }
| str join " "
}
# الاستخدام:
# use utils.nu
# "Hello World" | str kebab # "hello-world"
# "hello world" | str title # "Hello World"
| أمر | وصف |
|---|
open data.db | فتح قاعدة بيانات SQLite |
open data.db | query db "SELECT * FROM users" | تنفيذ استعلام SQL |
open data.db | query db "SELECT * FROM users WHERE age > 30" | استعلام مع تصفية |
open data.db | schema | عرض مخطط قاعدة البيانات |
[[name age]; ["Alice" 30]] | into sqlite data.db | إنشاء SQLite من جدول |
ls | into sqlite -t files data.db | حفظ جدول في SQLite |
| أمر | وصف |
|---|
plugin list | عرض الإضافات المثبتة |
plugin add /path/to/plugin | تسجيل إضافة |
plugin rm plugin_name | إزالة إضافة |
plugin use plugin_name | تحميل إضافة |
cargo install nu_plugin_formats | تثبيت إضافة التنسيقات |
cargo install nu_plugin_query | تثبيت إضافة الاستعلام |
cargo install nu_plugin_gstat | تثبيت إضافة حالة git |
-
استخدم البيانات المهيكلة — يتألق Nushell عندما تعمل مع الجداول والسجلات بدلاً من النصوص الخام. مرر الأوامر عبر select و where و sort-by بدلاً من grep و awk.
-
حدد أنواع معاملات الدوال — أضف تعليقات الأنواع للأوامر المخصصة (name: string، count: int) لاكتشاف الأخطاء مبكراً وتمكين إكمال تلقائي أفضل.
-
فضّل المتغيرات غير القابلة للتغيير — استخدم let افتراضياً ولا تستخدم mut إلا عندما تحتاج فعلاً للتغيير. هذا يمنع التغييرات غير المقصودة في الحالة داخل السكريبتات.
-
استخدم سجل SQLite — عيّن $env.config.history.file_format = "sqlite" للبحث الأسرع ومقاومة أفضل للتلف وبيانات وصفية أغنى.
-
استفد من par-each للأداء — عند معالجة العديد من العناصر بشكل مستقل، يعمل par-each في مسارات متوازية ويمكن أن يكون أسرع بكثير من each.
-
استخدم الوحدات للكود القابل لإعادة الاستخدام — نظّم الأوامر المخصصة في ملفات وحدات .nu واستخدم use بدلاً من source. الوحدات لديها تسمية نطاقات وتصديرات مناسبة.
-
استخدم into لتحويلات الأنواع — استخدم دائماً التحويل الصريح للأنواع (into int، into string، إلخ) بدلاً من الاعتماد على التحويل الضمني لسكريبتات موثوقة.
-
كوّن الإكمال التلقائي — فعّل الإكمال الخارجي و carapace لدعم إكمال الصدفة عبر جميع أدوات سطر الأوامر.
-
استخدم استيفاء النصوص — فضّل $"Hello, ($name)!" على تسلسل النصوص بـ + لكود أنظف وأكثر قراءة.
-
تعامل مع الأخطاء بـ try/catch — غلّف العمليات التي قد تفشل (الوصول للملفات، HTTP، التحليل) في كتل try { } catch { } لسكريبتات قوية.
-
اختبر بـ describe — استخدم expression | describe لفحص نوع أي قيمة أثناء التطوير والتنقيح.
-
استخدم الإغلاقات بشكل متسق — تستخدم إغلاقات Nushell صيغة { |params| body }. ضمّن دائماً أحرف الأنبوب حتى للمعاملات المفردة من أجل الوضوح.