😌

Nushellと既存のシェルを併用する - なるべく移行しないで行こう!

2024/12/10に公開

この記事はNushell Advent Calendar 10日目の記事です。

新しい職場で開発環境のセットアップをしていて気づいたんですが、既存のツール群は当然Bashや(macOSの場合)Zshを前提としていることが多いので「Nushell(あるいはその他非POSIX shell)に移行するには、そうしたスクリプトとか.zshrcとか.bashrcとかも全部移行しないといけないのでは?」と思っている方も多いかも知れません。

しかし、実際のところLinuxでもmacOSでもWindowsでも仕様上、環境変数(.bashrcなどでexportした変数)は原則全て子プロセスに引き継がれるので、環境変数に限って言えばデフォルトのシェルから対象のシェルを起動するだけで自動的に移行できます🙆。

例えばBashをログインシェルとして起動している人がNushellを使いたい、なおかつvirtualenvwrapperを使って作成した仮想環境のPythonを使いたい、なんて場合、次のようにBashでworkonコマンドを使って仮想環境を有効にした上でnuコマンドを起動するだけです:

# hoge という仮想環境を有効化した上で...
bash> workon hoge

# Nushellを起動
(hoge) bash> nu -l

# 仮想環境のPythonが使われるようになる
nu> which python
╭───┬─────────┬───────────────────────────────────────────┬──────────╮
│ # │ command │                     path                  │   type   │
├───┼─────────┼───────────────────────────────────────────┼──────────┤
│ 0 │ python  │ /Users/igrep/.virtualenvs/hoge/bin/python │ external │
╰───┴─────────┴───────────────────────────────────────────┴──────────╯

この特性を活かすために、私はログインシェルを切り替えたりなんて事もせず、とりあえずターミナルで最初に起動するシェルはBashにしておいて、必要に応じてBashからNushellを起動したり、時にはその逆を行ったりしています。

ただし、引き継がれるのはあくまでも環境変数だけなので、既存のシェルにおけるエイリアスやユーザー定義関数などは引き継がれません🙅。比較的移行しやすいaliasならともかく、.zshrcや.bashrcにたくさんの関数を書いてきた方は、決断を求められるでしょう。加えて、仮にvirtualenvwrapperのような「条件に応じて特定のコマンド群のバージョンを差し替えるツール」がシェルの関数やエイリアスを使って実装されている場合、Nushellに切り替えた場合はうまく動きません(記憶が正しければrvmとかがそういう仕様だったはず)。

一方、その点を承知しているのか幸い、virtualenvwrapperも含めこの手のツールの多くは環境変数を操作するだけでツールを入れ替えているようです😌。PATHに対象のコマンドのラッパーを置いておいて、そのラッパーが.foo-versionみたいなファイルを読んでPATHなどを更に書き換える、といった方法で十分でしょうしね。

というわけで、Nushellを使ってみたい、でもBashやZsh向けのツールなどが使えなくなるのは困る、という方はぜひ併用するという道を試してみてください!

GitHubで編集を提案

Discussion