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

Nushell

صدفة حديثة للبيانات المهيكلة تتعامل مع مخرجات الأوامر كجداول وتدعم الأنابيب مع بيانات مصنفة، والتصفية، والبرمجة النصية عبر الأنظمة.

أمروصف
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] { ... }قبول أي معاملات إضافية

المتغيرات والتحكم في التدفق

Section titled “المتغيرات والتحكم في التدفق”
أمروصف
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 dataGET واستخراج حقل
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
  1. استخدم البيانات المهيكلة — يتألق Nushell عندما تعمل مع الجداول والسجلات بدلاً من النصوص الخام. مرر الأوامر عبر select و where و sort-by بدلاً من grep و awk.

  2. حدد أنواع معاملات الدوال — أضف تعليقات الأنواع للأوامر المخصصة (name: string، count: int) لاكتشاف الأخطاء مبكراً وتمكين إكمال تلقائي أفضل.

  3. فضّل المتغيرات غير القابلة للتغيير — استخدم let افتراضياً ولا تستخدم mut إلا عندما تحتاج فعلاً للتغيير. هذا يمنع التغييرات غير المقصودة في الحالة داخل السكريبتات.

  4. استخدم سجل SQLite — عيّن $env.config.history.file_format = "sqlite" للبحث الأسرع ومقاومة أفضل للتلف وبيانات وصفية أغنى.

  5. استفد من par-each للأداء — عند معالجة العديد من العناصر بشكل مستقل، يعمل par-each في مسارات متوازية ويمكن أن يكون أسرع بكثير من each.

  6. استخدم الوحدات للكود القابل لإعادة الاستخدام — نظّم الأوامر المخصصة في ملفات وحدات .nu واستخدم use بدلاً من source. الوحدات لديها تسمية نطاقات وتصديرات مناسبة.

  7. استخدم into لتحويلات الأنواع — استخدم دائماً التحويل الصريح للأنواع (into int، into string، إلخ) بدلاً من الاعتماد على التحويل الضمني لسكريبتات موثوقة.

  8. كوّن الإكمال التلقائي — فعّل الإكمال الخارجي و carapace لدعم إكمال الصدفة عبر جميع أدوات سطر الأوامر.

  9. استخدم استيفاء النصوص — فضّل $"Hello, ($name)!" على تسلسل النصوص بـ + لكود أنظف وأكثر قراءة.

  10. تعامل مع الأخطاء بـ try/catch — غلّف العمليات التي قد تفشل (الوصول للملفات، HTTP، التحليل) في كتل try { } catch { } لسكريبتات قوية.

  11. اختبر بـ describe — استخدم expression | describe لفحص نوع أي قيمة أثناء التطوير والتنقيح.

  12. استخدم الإغلاقات بشكل متسق — تستخدم إغلاقات Nushell صيغة { |params| body }. ضمّن دائماً أحرف الأنبوب حتى للمعاملات المفردة من أجل الوضوح.