1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nushellにすんなり移行する🐱

Posted at

要約

  • Nushellはモダンで優れたクロスプラットフォームシェルですが、既存のシェルとは異なる仕様のため、移行の壁が高い
  • まずは.zloginを使って、既存のzsh環境を保ちながらNushellの恩恵を享受するとよい
  • carapace-binnu_scriptsmiseで補完とエイリアス、シェル系ツールの問題も軽減可能

はじめに

WindowsとMacを使っていると、PowerShellとzshの使い分けが必要になります。それぞれコマンドやオプションを覚えるのは結構認知負荷が高く、辛いものです。

Nushellは、そんな悩みを解決する可能性を秘めた新しいクロスプラットフォームシェルです。しかし、既存のシェルとは根本的に異なり、Nu言語で動く設計のため、既存のシェルスクリプトが使えません。また、環境変数の設定方法も変更が必要です。

この記事では、既存のzsh環境を活かす方法シェルスクリプトが使えない問題への対処法など、実際に私が行った移行戦略を紹介します。

筆者は普段Macを使用しているため、主にMac向けの内容となります。

この記事では、Nushell自体の導入については触れません。ただし、brewwingetで簡単にインストールできます。

対象読者

  • PowerShellとzshの使い分けに疲れている人
  • Nushellに興味があるが移行に不安を感じている人
  • クロスプラットフォームのシェルを探している人

Nushellの魅力

クロスプラットフォーム対応

PowerShellとzshのコンテキストスイッチから解放されます。Windows、macOS、Linuxで同じコマンドが使えるのは大きなメリットです。

構造化データの扱いが得意

# 従来のシェル(複雑で知識が必要)
curl -s https://api.github.com/users/octocat | jq '.public_repos'

# Nushell(直感的なコマンドで、リスト、JSON、CSVの扱いが得意)
http get https://api.github.com/users/octocat | get public_repos

型安全なパイプライン

# ファイルサイズでソートして、大きなファイルのみ表示
ls | where size > 1mb | sort-by modified | reverse

見やすい出力

構造的なデータやエラーが見やすく表示されます。個人的にはコマンドの履歴検索(Ctrl+r)も見やすいと感じました。画像は公式サイトをご覧ください。

高いパフォーマンス

Rustで書かれており、高速に動作します。

移行時の課題

しかし、Nushellには以下のような移行の壁があります。

既存スクリプトとの非互換性

.shファイルが直接実行できません。公式ドキュメントでも以下のように明記されています。

Nushell isn't Bash
It can sometimes look like Bash

nvmやVSCodeの一部機能など、シェルスクリプトで動作するツールが使えなくなります。

環境変数の扱いの違い

環境変数の移行が必要です。数が多いと大変ですが、後述する回避策があります。

# zsh
export PATH="/usr/local/bin:$PATH"

# Nushell
$env.PATH = ($env.PATH | prepend "/usr/local/bin")

補完機能の弱さ

従来のbash-completionやzsh-completionsがそのまま使えません。

解決策:段階的移行戦略

.zloginを使った安全な移行

キーアイデア: .zloginにNushell起動コードを記述することで、ログインシェル時のみNushellを使用し、それ以外はzshを維持します。

# ~/.zlogin に追加
exec nu

execは現在のシェルプロセスを新しいプロセスに置き換える組み込みコマンドです。

.zloginはログインシェルの一番最後に実行される設定ファイルです。これにより:

  • 既存のzshの設定(.zshrc等)がすべて読み込まれた後にNushellが起動(zshで設定した環境変数がそのまま使える)
  • システムが使用する非ログインシェルでは引き続きzshが使用される
  • 問題があればすぐに元に戻せる

VSCodeでは問題が発生する場合があります。ptyhost(統合シェル)などに影響する可能性があるようです。

筆者の環境では以下のようなエラーが発生しました:

シェル環境を解決できません: 生成されたシェルでの予期しない終了コード (コード 1、シグナル null)

image.png

以下で回避できます。VSCodeが起動したシェルはVSCODE_PIDが設定されているため、これらで判別します。

VSCodeでは、Nushellの起動を手動で行う方がよいでしょう。

if [[ -z "$VSCODE_PID" ]]; then
  exec nu
fi

互換性のないツールへの対処

一部のシェルベースのツールは、この機会にモダンなツールに乗り換えることをおすすめします。

例えば、Node.jsのバージョン管理ツールであるnvmはシェルスクリプトで動作するため、Nushellでは使用できません。 互換スクリプトを使用する方法もありますが、個人的にはmiseをおすすめします。

miseは、プロジェクトごとに必要なツールのバージョンを単一の設定ファイルで管理・自動切り替えできるコマンドラインツールです。

miseはNushellにも対応しています。miseを利用することで、大抵のツールのバージョン管理をNushellでも利用できるようになります。

これで〜vmや〜env系のツールを別途インストールする必要がなくなり、遅いシェルスクリプトにも依存しなくて済みます。

補完機能の強化

Nushellはデフォルトでは補完機能が弱いですが、ツールを使って改善できます。

carapace-binを使うことで、豊富な補完機能を追加できます。

# インストール
brew install carapace-bin

# 以下、セットアップを抜粋。詳細は元記事を参照してください
# ~/.config/nushell/env.nu
$env.CARAPACE_BRIDGES = 'zsh,fish,bash,inshellisense' # optional
mkdir ~/.cache/carapace
carapace _carapace nushell | save --force ~/.cache/carapace/init.nu

# ~/.config/nushell/config.nu
source ~/.cache/carapace/init.nu

参考:

便利なエイリアス

nu_scriptsリポジトリから有用なエイリアスを取得できます:

特にGitのエイリアスは有用で、Oh My Zshのgitプラグインに近い体験を得られます。

もちろん、エイリアスは自分でカスタマイズすることも可能です。

他のシェルとの比較

vs Fish

  • Fish:すぐに使える、優秀な補完機能、既存ツールとの互換性が高い
  • Nushell:構造化データ処理が強力、型安全、長期的な生産性向上

vs PowerShell Core

  • PowerShell:オブジェクト指向、.NET統合、企業環境での実績
  • Nushell:より軽量、直感的な構文、クロスプラットフォーム対応

現時点ではFishの方が成熟しており、日常使いの安定性は高いです。しかし、Nushellの構造化データ処理の強みと、わかりやすいコマンド体系が魅力で採用しています。

まとめ

Nushellは確かに移行のハードルが高いシェルですが、.zloginを使った段階的移行戦略により、リスクを最小化しながらその恩恵を享受できます。

特に構造化データを扱う機会の多い現代の開発において、Nushellの型安全で直感的なデータ処理能力は大きな価値があります。まずはこの記事を参考に、非破壊的にNushellへ移行してみてはいかがでしょうか。

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?