0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Nushell: Cuộc cách mạng trong shell hiện đại

Đăng vào 1 tháng trước

• 7 phút đọc

Giới thiệu

Nushell (nu) là một shell hiện đại, coi dữ liệu như thông tin có cấu trúc thay vì chỉ là văn bản thuần túy. Nó mang đến khả năng thao tác dữ liệu giống như bảng tính ngay trên dòng lệnh với hỗ trợ tích hợp cho các định dạng như JSON, CSV, YAML và nhiều định dạng khác.

Mục lục

Cài đặt

Sử dụng Trình quản lý gói

bash Copy
# macOS với Homebrew
brew install nushell

# Windows với Winget
winget install nushell

# Linux với Snap
snap install nushell

# Cargo (trình quản lý gói Rust)
cargo install nu

Từ GitHub Releases

Tải xuống các tệp nhị phân đã được xây dựng sẵn từ GitHub releases.

Khái niệm cơ bản

Triết lý dữ liệu có cấu trúc

Khác với các shell truyền thống hoạt động với các dòng văn bản, Nushell làm việc với dữ liệu có cấu trúc:

  • Mọi thứ đều là bảng hoặc dữ liệu có cấu trúc
  • Các pipeline truyền dữ liệu có cấu trúc giữa các lệnh
  • Hiểu biết tích hợp về các định dạng dữ liệu thông dụng

Bắt đầu Nushell

bash Copy
nu

Các lệnh chính và điều hướng

Đây là những lệnh cơ bản mà mọi lập trình viên đều biết, nhưng cách mà shell xử lý đầu ra sẽ khiến nhiều người ngạc nhiên. Tôi để lại những lệnh này cho những người mới bắt đầu, ai muốn học và làm chủ các lệnh cơ bản.

Điều hướng hệ thống tập tin

bash Copy
# Liệt kê nội dung thư mục (đầu ra có cấu trúc)
ls

# Thay đổi thư mục
cd /duong/dan/den/thumuc

# Thư mục làm việc hiện tại
pwd

# Quay lại thư mục trước
cd -

# Về thư mục chính
cd ~

Các thao tác với tập tin

bash Copy
# Tạo tập tin
touch file.txt
"Hello World" | save hello.txt

# Sao chép tập tin
cp source.txt destination.txt

# Di chuyển/đổi tên tập tin
mv oldname.txt newname.txt

# Xóa tập tin
rm file.txt

# Tạo thư mục
mkdir new-folder

# Xóa thư mục
rmdir empty-folder
rm -rf folder-with-contents

Làm việc với dữ liệu có cấu trúc

Xem dữ liệu

bash Copy
# Xem nội dung tập tin
open data.json
open data.csv
open data.yaml

# Xem với phân trang
open large-file.txt | less

# Lấy thông tin tập tin
ls | get name size modified

Các lệnh thao tác dữ liệu

select - Chọn các cột cụ thể

bash Copy
ls | select name size
ps | select name pid cpu

where - Lọc hàng

bash Copy
ls | where size > 1mb
ps | where cpu > 50
ls | where name =~ "\.txt$"  # regex match

sort-by - Sắp xếp dữ liệu

bash Copy
ls | sort-by size
ls | sort-by modified --reverse

group-by - Nhóm dữ liệu

bash Copy
ls | group-by type
ps | group-by user

get - Trích xuất các giá trị cụ thể

bash Copy
ls | get 0        # Hàng đầu tiên
ls | get name     # Tất cả tên
ls | get name.0   # Tên đầu tiên

length - Đếm mục

bash Copy
ls | length
ps | where name =~ "python" | length

firstlast - Lấy hàng cụ thể

bash Copy
ls | first 5
ps | last 3

skiptake - Phân trang

bash Copy
ls | skip 10 | first 5  # Bỏ qua 10 hàng đầu, lấy 5 hàng tiếp theo

Định dạng dữ liệu

JSON

bash Copy
# Đọc JSON
open data.json

# Tạo JSON
{name: "John", age: 30} | to json

# In JSON đẹp
open data.json | to json --indent 2

CSV

bash Copy
# Đọc CSV
open data.csv

# Tạo CSV
[{name: "Alice", age: 25}, {name: "Bob", age: 30}] | to csv

# Chuyển đổi các định dạng khác sang CSV
open data.json | to csv

YAML

bash Copy
# Đọc YAML
open config.yaml

# Tạo YAML
{database: {host: "localhost", port: 5432}} | to yaml

Biến và cấu hình

Biến

bash Copy
# Đặt biến
let name = "John"
let numbers = [1, 2, 3, 4, 5]
let config = {host: "localhost", port: 8080}

# Sử dụng biến
echo $name
echo $numbers
echo $config.host

Biến môi trường

bash Copy
# Xem môi trường
env

# Đặt biến môi trường
$env.MY_VAR = "value"

# Sử dụng biến môi trường
echo $env.HOME
echo $env.PATH

Cấu hình

bash Copy
# Xem cấu hình hiện tại
config

# Chỉnh sửa tệp cấu hình
config nu

# Đặt giá trị cấu hình
config set table.mode rounded

Tính năng nâng cao

Lệnh tùy chỉnh

bash Copy
# Định nghĩa một lệnh tùy chỉnh
def greet [name: string] {
    $"Hello, ($name)!"
}

# Sử dụng lệnh đó
greet "World"

# Lệnh với cờ
def search [pattern: string, --case-sensitive] {
    if $case_sensitive {
        ls | where name =~ $pattern
    } else {
        ls | where name =~ $"(?i)($pattern)"
    }
}

Bí danh

bash Copy
# Tạo bí danh
alias ll = ls -la
alias gs = git status
alias la = ls -a

# Xem bí danh
alias

Vòng lặp và điều kiện

bash Copy
# Vòng lặp For
for file in (ls | get name) {
    echo $"Processing ($file)"
}

# Each (cách tiếp cận hàm)
ls | each { |row| echo $"File: ($row.name)" }

# Điều kiện
if (ls | length) > 10 {
    echo "Nhiều tập tin"
} else {
    echo "Ít tập tin"
}

Xử lý lỗi

bash Copy
# Tương đương với try-catch
try {
    open nonexistent.txt
} catch {
    echo "Tập tin không tìm thấy"
}

# Giá trị mặc định
open config.json | get database.port? | default 3000

Làm việc với các lệnh bên ngoài

Chạy các lệnh bên ngoài

bash Copy
# Chạy các lệnh bên ngoài
^ls -la
^git status
^python script.py

# Ghi lại đầu ra dưới dạng dữ liệu có cấu trúc
^ps aux | from ssv  # Giá trị phân tách bằng khoảng trắng

Phân tích đầu ra lệnh bên ngoài

bash Copy
# Phân tích các định dạng khác nhau
^kubectl get pods -o json | from json
^docker ps --format json | lines | each { from json }

Các mẫu và ví dụ hữu ích

Phân tích log

bash Copy
# Phân tích tệp log
open server.log 
| lines 
| parse "{timestamp} {level} {message}"
| where level == "ERROR"
| group-by level
| length

Giám sát hệ thống

bash Copy
# Giám sát các tiến trình
ps | where cpu > 80 | sort-by cpu --reverse

# Kiểm tra dung lượng đĩa
ls | where type == dir | insert size_mb { |row| du $row.name | get physical | math sum | $in / 1mb }

Xử lý dữ liệu

bash Copy
# Phân tích dữ liệu CSV
open sales.csv
| group-by region
| each { |group| 
    {
        region: $group.0.region,
        total_sales: ($group | get sales | math sum),
        avg_sales: ($group | get sales | math avg)
    }
}

Tích hợp Git

bash Copy
# Trạng thái Git dưới định dạng có cấu trúc
def git-status [] {
    ^git status --porcelain | lines | parse "{status} {file}"
}

# Thông tin nhánh
def git-branches [] {
    ^git branch -v | lines | parse --regex "(?<current>[\*\s])\s+(?<name>\S+)\s+(?<hash>\S+)\s+(?<message>.*)"
}

Cấu hình và Tùy chỉnh

Cấu hình khởi động

Tạo ~/.config/nushell/config.nu:

bash Copy
# Thông báo tùy chỉnh
$env.PROMPT_COMMAND = { 
    let path = ($env.PWD | str replace $env.HOME "~")
    $"(ansi green)($path)(ansi reset) > "
}

# Bí danh tùy chỉnh
alias ll = ls -la
alias grep = rg

Tự động hoàn thành tùy chỉnh

bash Copy
# Thêm vào config.nu
def "nu-complete git-branches" [] {
    ^git branch | lines | each { |line| $line | str trim | str replace "* " "" }
}

extern "git checkout" [
    branch?: string@"nu-complete git-branches"
]

Mẹo hiệu suất

  1. Sử dụng các lệnh có cấu trúc thay vì phân tích bên ngoài khi có thể
bash Copy
   # Tốt
   ls | where size > 1mb

   # Ít hiệu quả hơn
   ^ls -la | from ssv | where size > 1mb
  1. Pipeline hiệu quả
bash Copy
   # Lọc sớm trong pipeline
   ls | where type == file | where size > 1mb | sort-by size
  1. Sử dụng các lệnh tích hợp cho các định dạng dữ liệu
bash Copy
   # Phân tích JSON tích hợp nhanh hơn
   open data.json | get users.0.name

Khắc phục sự cố

Nhận trợ giúp

bash Copy
# Trợ giúp tổng quát
help

# Trợ giúp lệnh
help ls
help where
help config

# Liệt kê tất cả các lệnh
scope commands

Gỡ lỗi

bash Copy
# Chế độ gỡ lỗi
$env.RUST_LOG = "debug"

# Đầu ra chi tiết
ls --help

# Kiểm tra loại lệnh
which ls

Di chuyển từ shell truyền thống

Các mẫu phổ biến từ Bash sang Nu

bash Copy
# Bash: grep pattern file.txt
# Nu:
open file.txt | lines | where $it =~ "pattern"

# Bash: find . -name "*.txt" | wc -l
# Nu:
ls **/*.txt | length

# Bash: ps aux | grep python
# Nu:
ps | where name =~ "python"

# Bash: cat file.json | jq '.users[0].name'
# Nu:
open file.json | get users.0.name

Kết luận

Nushell đại diện cho một cuộc cách mạng trong thiết kế shell, coi dữ liệu như những công dân hàng đầu. Cách tiếp cận có cấu trúc của nó giúp thao tác dữ liệu trở nên trực quan và mạnh mẽ hơn so với các shell dựa trên văn bản truyền thống. Hãy bắt đầu với các lệnh cơ bản và dần dần kết hợp các tính năng nâng cao hơn khi bạn trở nên quen thuộc với triết lý dữ liệu có cấu trúc.

Và như thường lệ, đừng ngần ngại để lại ý kiến và phê bình bài viết này. Chúc bạn thành công!

Nội dung bài viết

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào