🐚

気になっていた shell を触る (zx, oils(OSH,YSH), nushell)

に公開

この記事は 2026年!初アウトプットをしよう に向けて書いた記事です。
Qiita, Zenn の両方に投稿しています。

数年くらい気になっていた shell をいくつか触ってみることにしました。
普段は Bash, Zsh を使っていますが、いろいろ考えて最近は Bash に固定しつつあります。

最近、新しいことを学んでいないなと思ったこともあり、AI Agent の力(ClaudeCode)を借りて環境構築してみて、いくつか考えてみることにしました。

なお今回の調査では実運用に乗せるというより、自分の興味の範囲でどういう利点があるのかを見定めて見るために書いているので、実用性についてはあまり考えていません。

試したもの

選定理由など

以前、Bash, Zsh の微妙な動きの違いやディストリビューションによる微妙な違い(主にMac絡みなんですが…)があり、そういったものをあまり意識しないでも使える shell がないかを考えていました。

当時たどり着いたのが、zx, oils(当時は oil という名前だった)でした。
こういったもので統一的にツールが使えると嬉しいよなーと思いつつ、当時から調査を放置していました。当時とは5年以上前のことなんですが…。

nushell は最近知って興味が出たので触ってみました。
xonsh も気になっていましたが(記事の執筆に間に合わないような気がしてきたので)、今回は見送りました。気が向いたときにやります。

後はこれらのツールを見ていると、それなりに GitHub の Star もされていることから、一定の利用者がいて良さそうな印象を受けていました。
なぜこれらのツールを使うのか? そういったところも含めて考えてみたかったというのが動機となります。

以降は AI の要約も使いつつ、自分が試した内容を整理していきます。

zx

概要

zx は Google が開発した JavaScript/TypeScript 用の shell スクリプティングライブラリです。shell コマンドを JavaScript のテンプレートリテラル構文($プレフィックス付きバッククォート)で実行できます。
そのため shell のコマンドを活かしつつ、JavaScript/TypeScript の非同期処理やエラーハンドリングなどの機能を活かしたスクリプトを書くことができます。

こんな感じです。実行した結果は以降で活用することができます。

const result = await $`ls -la`;
const branch = await $`git branch --show-current`;

特徴

  1. テンプレートリテラルによるコマンド実行
  2. async/await による非同期処理
  3. try-catch によるエラーハンドリング
  4. spinner による進捗表示(ローディング表示が簡単に書ける)
  5. JavaScript エコシステムとの統合(npm パッケージを自由に使える)

実際試してみて

JavaScript/TypeScript の資産を活かせる点、非同期処理、エラーハンドリングが JavaScript/TypeScript と同じように書ける点は良いなと思いました。

ただ普段遣いできるような shell とは違うことと、shell のコマンドを埋め込んでいるような見た目になることが気になりました。
このサイズ感になってくると Node.js でなくても、他のプログラミング言語が選択肢になってしまうし、JavaScript/TypeScript に慣れているチーム向けなのかなと思いました。

oils

概要

Oils は、Unix shell の改良を目指すプロジェクトで、単一のバイナリ(oils-for-unix)から OSHYSH という2つの shell を提供しています(自分が初めて見たときには oil という名前で、現在の OSH に当たるものしかなかった気がする)。

  • OSH: Bash/POSIX shell との互換性を保ち、より厳密なエラーハンドリングと安全性を提供する shell
  • YSH: モダンな構文を持つ新しい shell 言語(PythonやJavaScriptっぽいなと思った)

OSH は Bash みたいな感じなので、どういうコードなのかは省略です。
YSH で FizzBuzz を書くとこんな感じ。通常の ls とか、 cd みたいなものも動きます。

#!/usr/bin/env ysh

for i in (1 .. 16) {
  if (i % 15 === 0) {
    echo 'FizzBuzz'
  } elif (i % 3 === 0) {
    echo 'Fizz'
  } elif (i % 5 === 0) {
    echo 'Buzz'
  } else {
    echo $i
  }
}

特徴

OSH の特徴

  1. 強化された Strict Mode (set -o errexitpipefailnounset など)
  2. 静的パース(ができるらしい? あまり試せてない。コマンドは oil -n で実行できる。YSHも同様のコマンドがある)
  3. sigpipe_status_ok オプション(yes | head のようなコマンドでの SIGPIPE を適切に処理し、不要な失敗判定を防ぐ)

YSH の特徴

  1. var, const による変数宣言
  2. 型付きデータ構造(リストと辞書)
  3. Eggex という読みやすい正規表現 var pattern = / digit{1,3} '.' digit{1,3} /
  4. $[x + y] などの計算結果を文字列に埋め込める
  5. 文字列メソッド(.trim().upper().split() など)
  6. JSON サポート(辞書と JSON 間の相互変換が組み込みでサポート)

実際試してみて

Bash をより安全に倒して実現しているという印象。 ysh などは shell のプログラムを書くのも便利そうな感じだし、Python や JavaScript に慣れている人はより書きやすいのかも、と思いました。

ただ大きいプログラムだと結局 Python などに落ち着きそうで、結局小さいプログラムも Python とかでやるのでは…? みたいになってしまい、純粋に shell コマンドで構築できるうちはいいものの、そうでない場合はどうするのか、というのが気になりました。

nushell

概要

Nushell は「新しいタイプの shell」として開発されている、構造化データ処理に特化したクロスプラットフォームで動作する shell です。

例えばこんな感じで、大きいファイルを探して、その変更日時でソートすることができます。

ls | where size > 1kb | sort-by modified

特徴

  1. 構造化データのネイティブサポート(テーブル構造でデータを扱える)
  2. データ処理をパイプライン処理で行える( SQL のような where, select, group-by など。ソートは sort-by で行える。他にも insert, update, rename, flatten など)
  3. JSON/CSV のネイティブ処理( open data.json | where status == "active" | to csv など)
  4. 組み込み数学関数( math summath avgmath max など)
  5. 豊富なデータ変換
  6. 見やすいテーブル出力(自動的に整形されたテーブル形式で表示される)

実際試してみて

これ結構便利で感動しています。データ分析ツールなどをこれまで頑張ってこねたり、 jq 用意したりしていましたが、これ一つで解決できそうっていうのが嬉しさポイントです。

ls などの出力もやや丁寧に出てきてくれるので、好みはありますがヒューマンリーダブルだと思います。

というわけで、普段遣いはしない予定ですが、データ分析とか csv とかの処理のときはプログラミングせずとも nushell でやるっていうのはかなりありだなと思ったので、手元の環境にも入れました。

いろいろ試してみて

ここまで試してみて、これまで気になっていたけれども触れていなかったツールというのを AI の力で素早く試すことができたのはある種の感動があります。

そして実際にコードを読んでみて、良し悪しがわかったということもあります。ドキュメントの機能を一つずつ追っていくことも大事ですが、自分はコードについては特に動くものを見て理解するタイプなのでサンプルコードを実際に見れて助かりました。

nushell を今回自分の中で新しいツールとして見つけられたのも大きな収穫でした。
データ分析などちょこちょこスクリプト書かせるのが面倒だったので、csv, json のデータの取り出しは nushell 使いこなしてみようと思います!

というわけでやってみた! から域を出ていないものの、試したかった shell を試せて満足です。そのうち xonsh も試してみようと思います。

Discussion