자바스크립트를 활성화 해주세요

d015 Rust의 Nu Shell을 시험해 보았습니다

 ·  ☕ 5 min read

    NuShell이란?

    거의 1년전에 등장한 Rust로 작성된 쉘입니다. Powershell의 영향을 받았다고 스스로 밝히고 있는데, 미래에는 어쩌면 Powershell같은 쉘이 더 많아질 수도 있겠다는 생각이 듭니다. 공식페이지의 소개글에는 다음과 같이 PowerShell을 직접 언급하고 있습니다.

    Today, we’re introducing a new shell, written in Rust. It draws inspiration from the classic Unix philosophy of pipelines, the structured data approach of PowerShell, functional programming, systems programming, and more.

    현재의 날짜로서는 버전 0.18.0 이 최신인 듯 합니다.

    설치

    사실 윈도우즈에서 테스트할 수 있기 때문에 테스트해보았는데, scoop을 사용하여 간단히 인스톨할 수 있습니다. 어플리케이션 이름은 nu입니다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    C:\Users\Administrator\scoop\shims>scoop info nu
    Name: nu
    Description: A modern shell written in Rust
    Version: 0.18.1
    Website: https://www.nushell.sh
    License: MIT (https://spdx.org/licenses/MIT.html)
    Manifest:
      C:\Users\Administrator\scoop\buckets\main\bucket\nu.json
    Installed: No
    Binaries:
      nu.exe
    Environment: (simulated)
      PATH=%PATH%;C:\Users\Administrator\scoop\apps\nu\current\Plugins
    
    scoop install nu vcredist
    

    주의해야 할 점은 vcredist도 함께 설치해야 합니다. 많은 gnu계열의 프로그램들이 요구하는 dll을 제공합니다. scoop으로 vcredist를 철치하면 다음의 runtime들이 모두 설치됩니다.

    • vcredist2005
    • vcredist2008
    • vcredist2010
    • vcredist2012
    • vcredist2013

    실행

    cmd에서 실행해 본 모습은 약간 깨져 있습니다. cmder를 설치해서 실행해 보면 다음과 같은 모습을 하고 있습니다

    d015_nu_ls.png

    Nu 쉘은 ls 내부 커맨드를 가지고 있고, PowerShell과 마찬가지로 Object를 리턴합니다. 이를 파이프로 연결해서 사용하는 것도 PowerShell과 비슷합니다. 예를들면

    1
    
    ls | where type == Directory
    

    거기에

    1
    
    ls | where type == Directory | pick name
    

    와 같이 이름만 추출해 사용하는 것도 가능합니다.

    내부 명령어 목록

    현재 있는 내부 명령어 목록은 GitHub이나 공식문서를 참조하시면 됩니다.

    PowerShell의 Get-Command에 상당하는 내부 명령어를 검색하는 명령어는 아직 없는 것 같습니다.

    객체 목록

    PowerShell은 .NET Framework/.NET Core제로 모든 것이 .NET 형태를 가진 오브젝트로 구성되어 있습니다만, NuShell에서는 몇 개의 원시적인 형태와 구조화 데이터가 되는 Object와 List로 오브젝트가 구성되어 있습니다.
    오브젝트 목록은 아래 문서에 기재되어 있으며

    타입내용비고
    Integer정수코드를 보면 내부적으로는 i64
    Float소스코드를 보면 내부적으로는 i64Decimal
    String문자열
    Boolean불린
    Date날짜, 시간타임존을 가지고 있음
    Path파일경로코드를 보면 내부적으로는 PathBuf
    Bytekb、mb등의 단위를 가지는 정수코드를 보면 내부적으로는 u64

    Structure 타입으로는

    타입내용비고
    ObjectsProperty를 가지는 객체내부적으로는 Dictionary인 듯
    Binary바이너리데이타내부적으로는 Vec
    List리스트모든것이 List로 Array는 없는 듯함.

    제공되는 primitive한 데이터타입은 github의 코드에도 잘 나타나 있습니다.

    파이프라인

    Nu Shell에서는 커맨드 조합 방법에 따른 거동이 정의되어 있습니다.

    1. 내부 커맨드| 외부 커맨드로 파이프하는 경우
      내부 명령으로 발생한 “Data” (오브젝트)는 문자열로 표준출력으로 출력된다.
    2. 외부 커맨드| 내부 커맨드로 파이프하는 경우
      외부 명령의 출력은 문자열 타입으로 내부 명령어로 전달된다.
    3. 외부 커맨드 1| 외부 커맨드 2로 파이프하는 경우
      외부 명령 1의 표준 출력과 외부 명령 2의 표준 입력을 접속하여 직접 데이터를 파이프 시킴

    이 거동을 PowerShell과 비교하면, 3번의 패턴의 거동이 크게 다릅니다.
    PowerShell의 경우 외부 명령어 1 | 외부 명령어 2로 파이프하는 경우에도 스트림으로 하게 되며, 외부 명령어 1->"스트림”->표준 출력->표준 입력->외부 명령어 2라는 경로로 데이터가 흘러갑니다.

    이 때문에 PowerShell에서는 외부 명령어끼리의 파이프라인이 사용자가 기대한 동작이 되지 않는 경우가 매우 많습니다.
    PowerShell Core 에서 약간 개선되고는 있습니다만, 근본적인 동작에는 변함이 없습니다. 이 외부 명령어간의 파이프는 PowerShell의 큰 약점인데, NuShell에서는 이 부분이 잘 대처되고 있는 느낌입니다.

    Shells

    NuShell의 독자적인 기능으로 Shells라는 것이 있습니다.
    enter 명령어로 새로운 쉘을 설치하고 이른바 “screen” 명령어를 대체하는 기능인데 개인적으로는 그다지 장점으로 다가오지는 않았습니다.
    shells 명령에서 현재 일어서 있는 셸 목록을 참조할 수 있습니다.

    셸을 바꿀 때는 p 나 n 명령어, 셸을 종료할 때는 exit 명령어를 사용합니다.

    1
    2
    3
    4
    5
    6
    7
    
    C:\Users\Administrator> shells
    ────────┬────────────────────────
     active │ X
     name   │ filesystem
     path   │ C:\Users\Administrator
    ────────┴────────────────────────
    C:\Users\Administrator>
    

    Plugin

    NuShell은 플러그인 기능을 가지고 있으며 독자적인 기능을 추가할 수 있게 되었다고 합니다.
    사양으로는 nu_plugin_[커맨드명]과 같은 이름의 실행파일을 만들면 된다고 하고, GitHub의 plugins 폴더에 있는 구현을 참고로 만들 수 있다고 합니다.

    https://github.com/nushell/nushell/tree/main/src/plugins

    이 부분은 PowerShell의 모듈과 비교해 보았을 때, 모듈이 더 접근성이 좋은 것 같습니다.

    소감

    • grooy나 ipython, irb와 같은 interactive shell의 시도는 예전부터 있었습니다만, 일상적인 쉘의 기능까지 제공하는 것이 상식화 되는 시대가 되는 것 같습니다. 10년뒤에는 어떤 시대가 열릴 지 매우 궁금합니다.
    • PowerShell과 비교해보자면, PowerShell은 모든 것이 .NET의 객체로 구성되어 있으며, 그것이 PowerShell의 강점이기는 하지만, 독특한 문법이나 외부 커멘드와 연계해 사용하는 방식이 약점이 되고 있기는 합니다. 반면, NuShell에서는 오브젝트의 사용이 한정적·선택적이며, 오브젝트를 사용하는 부분을 매번 생각해야 하는 번거로움이 있지만, 그 만큼 독특한 문법은 적고 외부 커맨드와의 연계도 조금 쉬워 보입니다.
    • Table형식의 Output이라면 파워라인과 함께 쓰면 더 좋겠다는 생각이 들었습니다.

    이상 간단하지만 Nu Shell을 만져 본 감상이었습니다.

    레퍼런스

    공유하기

    tkim
    글쓴이
    tkim
    Software Engineer