Nushellというソフトウェアを使うと、Windows/MacOS/Linuxという環境の違いを意識せずに、全てのOSで同じコマンドが使えるようになります。Windowsでファイル一覧を表示するには「dir」コマンド、MacOSとLinuxでは「ls」コマンドを使いますが、Nushellを使うと全てのOSで「ls」コマンドを使うことが出来ます。そしてコマンドのエラーが発生した時、非常にわかりやすいヘルプ機能やエラーメッセージも表示されます。各OS毎のコマンドをいちいち調べる必要がなくなり、Linuxコマンドに近い統一されたコマンドさえ覚えておけば、どのOSでも簡単にコマンドを実行できるようになります。
Nushellとは?
Windows / MacOS / Linux はそれぞれコマンド操作が異なっていますが、OS毎の違いを気にせずに同じコマンドで操作できるようにしたものがNushellと呼ばれるソフトウェアです。WindowsであればPowerShellやMS-DOSプロンプトでコマンドを入力する必要があります。そしてMacOSやLinuxではターミナルソフトを起動してシェル環境でコマンドを実行する必要があり、さらにシェルにはcsh、bash、zshなど様々なシェルが存在し、若干コマンドが異なっていたりします。このような違いを意識せずに、Nushellという1つのシェルでコマンドを実行できる優れたソフトウェアです。
公式サイトはこちらになります。「Nushell」は「A new type of shell」と呼ばれていて、まさに新しいシェル環境を提供しています。
日本語のウェサイトはこちらです。
Nushellをインストールする
Nushellをインストールするには、各OSで次のようにコマンドを実行してインストールします。
MacOS
$ brew install nushell
Windows
winget install nushell
Ubuntuやその他OS
npm install -g nushell
Nushellの起動方法
WindowsではコマンドプロンプトやPowerShellを開きます。MacOSやLinuxではターミナルアプリを開いて、「nu」コマンドを実行することでNushellを起動することが出来ます。
Windowsの場合、コマンドプロンプト又はPowerShellで「nu」コマンドを実行すると次のように表示されて、Nushellが起動されます。
MacOSやLinuxの場合、「nu」コマンドを実行すると次のように表示されます。
この状態で様々なコマンドを入力できるようになります。
Nushellの基本的な使い方
ここからはどのOSでNushellを実行しても同じですので、WindowsのPowerShell環境でNushellを実行しながら、Nushellの基本的な使い方を見ていきます。実行環境はWindows11のWindowsターミナルでPowerShellを実行し、その中で「nu」コマンドを実行した状態です。また比較が必要な場合、UbuntuでNushellを実行した場合の結果も併せて記載していきます。
では早速、Linuxコマンドでお馴染みの「ls」コマンドをWindows環境で実行してみます。CドライブのWindowsディレクトリに移動して「ls」コマンドを実行すると次のようなファイル一覧がキレイにわかりやすくに表示されます。
cd c:/Windows/
ls
Ubuntuでも同じように「ls」コマンドを実行してみると、全く同じように結果が表示されます。このようにWindowsでもLinuxでも同じコマンドで同じように結果が表示できます。
cd /tmp/
ls
また、LinuxやMacOSで実行中のプロセスを見るには「ps」コマンドを使いますが、Windowsではpsコマンドは存在しません。Windowsでは代わりに「tasklist」というコマンドを使うのですが、OS毎にコマンドが異なるので忘れてしまいます。そこでNushellなら同じ「ps」コマンドをどのOSでも使ってプロセス一覧を見ることが出来ます。
ps
なお、コマンドの使い方がわからない場合には、各コマンドのヘルプ機能を使うと非常にわかりやすい情報とともに、簡単なコマンドの使い方が何例か表示されます。以下は「ps」コマンドのヘルプを表示したものですが、調べたいコマンドの後ろに「–help」オプションを付けると、どのコマンドでも説明とコマンドの使い方が表示されます。
ps --help
このコマンドの例にもあるように、psコマンドの結果をソートしたり、特定の条件で結果を絞り込むことが出来ます。例えばChromeブラウザのプロセス一覧だけを表示したい場合には次のようにコマンドを実行します。
ps | where name =~ 'chrome'
psコマンドの結果をパイプ(|)で次の処理に引き渡し、SQLのような文法で「where name =~ ‘chrome’」という条件文を書くと、「chrome」という文字列を含むプロセスだけが表示されます。
そしてこの結果をメモリー消費順にソートするには、次のようにさらにパイプ(|)で結果を次のコマンドに渡し、「sort-by mem」とすることで、「mem」列の昇順で並べ替えることが出来ます。
ps | where name =~ 'chrome' | sort-by mem
「ls」コマンドでも同じように結果をソートしたり、条件に応じて結果を絞り込むことが出来ます。
ls | where size > 2mb | sort-by name
この例では、lsコマンドでファイル一覧を表示し、ファイルサイズが2MBを超えるファイルやフォルダだけを表示するように「where size > 2mb」で絞り込みをしています。そして2MBを超えるフォルダとファイルの名前の昇順で結果を表示するよう「sort-by name」としています。どの列でもソートは可能です。
ls | where size > 2mb | sort-by name
Nushellの様々な使い方
Nushellにはとてもたくさんの機能が存在していますので全てを紹介しきれませんが、CSVファイルやJSONデータ、YAML等のデータを処理する機能も備わっています。
CSVファイルの処理例
例えば次のようなCSVファイルを用意しておき、このデータをNushellで処理させてみます。ファイルっ名はtest.csvとしておきます。
123,456,789
ABC,DEF,GHI
aaa,bbb,
あああ,いいい,ううう
000,,
このファイルをNushellのコマンドである「open」コマンドで開いてみます。そのままのCSVデータを表示するには「–raw」オプションを付けます。
「–raw」オプションを付けずに、そのまま「open」コマンドにCSVファイル名を渡すと、次のようにキレイにデータを整形して表示してくれます。
このようにNushellは非常にパワフルな機能を備えています。
JSONデータの処理例
JSONデータをNushellで処理する例も挙げてみます。次のようなsample.jsonというファイルを用意しました。
{
"employees": [
{
"name": "Suzuki",
"email": "suzuki@example.com"
},
{
"name": "Takahashi",
"email": "takahashi@example.com"
},
{
"name": "Tanaka",
"email": "tanaka@example.com"
}
]
}
このJSONデータをNushellのopenコマンドで「–raw」オプションを付けて読み込んでみると、次のようにJSONデータがそのまま表示されます。
一方、NushellのopenコマンドだけでJSONファイルを読み込んでみると、次のようにとてもキレイに構造化された状態でJSONデータを表示してくれます。JSONデータの構造が非常にわかりやすく表示されます。
WebAPIの呼び出しと結果表示
NushellではWebAPIの呼び出しと結果表示も非常に簡単に実現可能です。
ここでは沖縄県那覇市の天気予報のデータを取得できるAPIを使ってみます。WebAPIを呼び出す場合によく使われるのはcurlコマンドです。次のようなコマンドでWebAPIを呼び出せます。「city」パラメータに設定している「471010」というのは、沖縄県那覇市を指しています。
$ curl https://weather.tsukumijima.net/api/forecast\?city\=471010
実際にcurlコマンドで沖縄県那覇市の天気予報データを取得すると次のように結果が表示されます。
curl https://weather.tsukumijima.net/api/forecast\?city\=471010
{
"publicTime": "2024-12-29T05:00:00+09:00",
"publicTimeFormatted": "2024/12/29 05:00:00",
"publishingOffice": "沖縄気象台",
"title": "沖縄県 那覇 の天気",
"link": "https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=471000",
"description": {
"publicTime": "2024-12-29T04:38:00+09:00",
"publicTimeFormatted": "2024/12/29 04:38:00",
"headlineText": "",
"bodyText": "【沖縄本島地方】\n 沖縄本島地方は、寒気の影響で曇っています。\n\n 29日は、寒気の影響で曇り、所により弱い雨が降るでしょう。午後は次第に寒気が緩むため、晴れる時間帯もある見込みです。\n\n 30日は、高気圧のへりにあたりおおむね曇るでしょう。\n\n【沖縄地方】\n 華中に高気圧があって、東へ移動しています。\n\n 沖縄地方は、曇っています。\n\n 29日の沖縄地方は、寒気の影響でおおむね曇るでしょう。午後は次第に寒気が緩むため、晴れる時間帯もある見込みです。\n\n 30日の沖縄地方は、高気圧のへりにあたりおおむね曇るでしょう。\n\n 沖縄地方の沿岸の海域では、うねりを伴い波が高い見込みです。",
"text": "【沖縄本島地方】\n 沖縄本島地方は、寒気の影響で曇っています。\n\n 29日は、寒気の影響で曇り、所により弱い雨が降るでしょう。午後は次第に寒気が緩むため、晴れる時間帯もある見込みです。\n\n 30日は、高気圧のへりにあたりおおむね曇るでしょう。\n\n【沖縄地方】\n 華中に高気圧があって、東へ移動しています。\n\n 沖縄地方は、曇っています。\n\n 29日の沖縄地方は、寒気の影響でおおむね曇るでしょう。午後は次第に寒気が緩むため、晴れる時間帯もある見込みです。\n\n 30日の沖縄地方は、高気圧のへりにあたりおおむね曇るでしょう。\n\n 沖縄地方の沿岸の海域では、うねりを伴い波が高い見込みです。"
},
"forecasts": [
{
"date": "2024-12-29",
"dateLabel": "今日",
"telop": "曇のち時々晴",
"detail": {
"weather": "くもり 昼過ぎ から 時々 晴れ",
"wind": "北の風 やや強く 後 北東の風",
"wave": "3メートル 後 2.5メートル うねり を伴う"
},
"temperature": {
"min": {
"celsius": null,
"fahrenheit": null
},
"max": {
"celsius": "18",
"fahrenheit": "64.4"
}
},
"chanceOfRain": {
"T00_06": "--%",
"T06_12": "10%",
"T12_18": "10%",
"T18_24": "10%"
},
"image": {
"title": "曇のち時々晴",
"url": "https://www.jma.go.jp/bosai/forecast/img/210.svg",
"width": 80,
"height": 60
}
},
{
"date": "2024-12-30",
"dateLabel": "明日",
"telop": "晴のち曇",
"detail": {
"weather": "晴れ 昼過ぎ から くもり",
"wind": "東の風 後 南西の風",
"wave": "2メートル 後 1メートル"
},
"temperature": {
"min": {
"celsius": "15",
"fahrenheit": "59"
},
"max": {
"celsius": "21",
"fahrenheit": "69.8"
}
},
"chanceOfRain": {
"T00_06": "10%",
"T06_12": "10%",
"T12_18": "10%",
"T18_24": "10%"
},
"image": {
"title": "晴のち曇",
"url": "https://www.jma.go.jp/bosai/forecast/img/110.svg",
"width": 80,
"height": 60
}
},
{
"date": "2024-12-31",
"dateLabel": "明後日",
"telop": "曇時々晴",
"detail": {
"weather": null,
"wind": null,
"wave": null
},
"temperature": {
"min": {
"celsius": "17",
"fahrenheit": "62.6"
},
"max": {
"celsius": "21",
"fahrenheit": "69.8"
}
},
"chanceOfRain": {
"T00_06": "30%",
"T06_12": "30%",
"T12_18": "30%",
"T18_24": "30%"
},
"image": {
"title": "曇時々晴",
"url": "https://www.jma.go.jp/bosai/forecast/img/201.svg",
"width": 80,
"height": 60
}
}
],
"location": {
"area": "沖縄",
"prefecture": "沖縄県",
"district": "本島中南部",
"city": "那覇"
},
"copyright": {
"title": "(C) 天気予報 API(livedoor 天気互換)",
"link": "https://weather.tsukumijima.net/",
"image": {
"title": "天気予報 API(livedoor 天気互換)",
"link": "https://weather.tsukumijima.net/",
"url": "https://weather.tsukumijima.net/logo.png",
"width": 120,
"height": 120
},
"provider": [
{
"link": "https://www.jma.go.jp/jma/",
"name": "気象庁 Japan Meteorological Agency",
"note": "気象庁 HP にて配信されている天気予報を JSON データへ編集しています。"
}
]
}
}
Nushellにはhttpというコマンドが用意されており、とても簡単にWebAPIを呼び出すことが可能です。同じWebAPIをNushellで呼び出してみると、次のように結果が表示されます。データが構造化されて、非常に見やすい結果が表示されます。
$ http get https://weather.tsukumijima.net/api/forecast?city=471010
APIの結果が非常に多いので画面からはみ出していますが、curlコマンドの結果と比較しても非常に見やすいことがわかります。
Nushellをもっと深く知るには?
Nushellについて更に詳しい情報は、下記公式サイトのドキュメントが非常に参考になります。
またNushellで利用可能なコマンドはこちらのウェブサイトで全て確認することが出来ます。
まとめ
Nushellは新しいシェルと謳っているだけに、非常に洗練されていてクロスプラットフォームに対応した優れたツールです。OSの違いも吸収し、さらに便利な機能を多数備えていますので、複数のOSを使いこなす方にとっては非常に便利でしょう。またLinuxは得意だがWindowsのコマンドはあまり知らないという方、MacOSは詳しいがWindowsコマンドはちょっと・・・という方などにも非常におすすめです。