모든 것을 원시 텍스트 대신 구조화된 데이터로 취급하는 현대적인 셸. 파이프라인은 단순히 문자열이 아닌 테이블, 레코드 및 리스트와 함께 작동합니다. 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 (모든 플랫폼) | cargo install nu |
| Nix | nix-env -iA nixpkgs.nushell |
실행: 모든 셸에서 nu를 실행하여 Nushell을 시작. 기본 셸로 설정: chsh -s $(which nu)
Nushell 파이프라인은 텍스트가 아닌 구조화된 데이터 (테이블, 레코드, 리스트)를 전달합니다:
# 전통적인 셸: text → grep → awk → text
# Nushell: table → where → select → table
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 | 10MB보다 큰 파일 필터링 |
ls | where name =~ "\.rs$" | 파일명에 대한 정규식으로 필터링 |
ls | where type == "dir" | 디렉토리만 표시 |
ls | where modified > 2day | 지난 2일 동안 수정된 파일 |
ls | select name size | 이름과 크기 열만 표시 |
ls | reject type | 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 | 마크다운 테이블로 변환 |
| 명령어 | 설명 |
|---|
[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를 편집기에서 열기
# 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) |
| 오류 처리 | 종료 코드 | 풍부한 오류 메시지 |
| 탭 자동완성 | 기본 | 컨텍스트 인식 |
| 타입 시스템 | 없음 | 정수, 문자열, 날짜, 크기 등 |
| 학습 곡선 | 익숙함 | 새로운 구문 학습 필요 |
| 외부 명령어 | 기본 | 완전히 지원됨 |